Назад | Перейти на главную страницу

CentOS 7 - каталоги, созданные через VSFTPD, не наследующие контексты SELinux

У нашей компании есть веб-сервер с CentOS 7, и наши клиенты управляют своими веб-сайтами через FTP (vsftpd). SELinux находится в принудительном режиме.

Проблема в том, что данные, созданные / загружаемые через VSFTPD, не наследуют соответствующий контекст SELinux. Позволь мне объяснить.

Например, для сайтов WordPress на сервере уже есть несколько правил, которые можно увидеть с помощью semanage fcontext -l |grep '/var/www', которые:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0

Итак, когда я копирую сайт WordPress, скажем, с другого сервера в каталог в /var/www/html/ по SSH, папки wp-content/ и wp-content/uploads/ иметь надлежащий httpd_sys_rw_content_t контекст безопасности. ОДНАКО, когда эти папки создаются через FTP, контекст, который они получают, httpd_sys_content_t (нет rw). Это означает, что сайты, которые наши клиенты загружают на сервер, не могут писать в эти каталоги, даже если они предоставляют права на запись пользователю / группе apache, поэтому администратор WordPress не работает. Итак, когда они загружают сайт, они должны запросить у нас поддержку, чтобы исправить это, что является пустой тратой времени для всех участников.

Допустим, клиент загрузил свой сайт в httpdocs, если через SSH делаю mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -fr проблема решена, значит, с данными все в порядке.

Я также могу сделать restorecon -Rv httpdocs/ чтобы проблема была исправлена.

Итак, возникает вопрос: как я могу сделать так, чтобы каталоги, созданные / загруженные через VSFTPD, наследовали правильные контексты SELinux так же, как они наследуются, когда каталоги создаются / загружаются через SSH?

Существует разница между метками по умолчанию, которые происходят во время выполнения, и политикой пост-меток, основанной на регулярных выражениях, которая применяется на сервере.

Что вы здесь отмечаете:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files         system_u:object_r:httpd_sys_rw_content_t:s0

Политика маркировки постов.

То, что вы обсуждаете в своей проблеме, на самом деле относится к политике времени выполнения.

Когда запись создается в каталоге с использованием SELinux, правила, определяющие, какая метка заканчивается файлом или каталогом, не диктуются регулярными выражениями, которые вы цитируете, а другими правилами (я считаю, что это правильный порядок, но, возможно, что-то упустил) .

  1. Есть явное имя type_transition правило.
  2. Есть явный безымянный type_transition правило.
  3. Наследовать тот же контекст, что и у родительского каталога.
  4. Применить default_context.

Итак, когда я копирую сайт WordPress, скажем, с другого сервера в каталог в / var / www / html / по SSH, папки wp-content / и wp-content / uploads / имеют правильный контекст безопасности httpd_sys_rw_content_t.

Итак, да, он это делает, но не по той причине, по которой вы думаете. Конечно, не из-за политики маркировки постов.

Это происходит потому, что конкретный именованный type_transition существует правило, обеспечивающее такое поведение.

$ sesearch -C -T -s unconfined_t -t httpd_sys_content_t -c dir

Found 4 named file transition filename_trans:
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "wp-content"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "smarty"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "uploads"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "upgrade"; 

Это в основном говорят.

  • Если ты unconfined_t и
  • Если вы выполняете действие в целевом типе httpd_sys_content_t и
  • Если класс новой записи - это каталог и
  • Если название новой записи - «загружает» затем
  • Новый тип - это httpd_sys_rw_content_t

Причина, по которой это работает для SSHD, заключается в том, что после входа в систему вам предоставляется исходный контекст unconfined_t для которых применяется это правило.

Это не работает для службы FTP, поскольку исходный контекст этой службы, скорее всего, ftpd_t у которого нет правила сопоставления.

Таким образом, вам необходимо изменить политику, чтобы изменить поведение SELinux, чтобы также соблюдать правила именованных файлов, которые вы видите и в других записях для FTP.

По крайней мере, в Fedora 23 существует интерфейс, позволяющий это сделать, подобный модуль политики сделает это.

policy_module(local_ftpd, 7.2.0)

require {
  type ftpd_t;
}

apache_filetrans_named_content(ftpd_t)

Вы можете загрузить это, убедившись, что selinux-policy-devel пакет установлен и работает make -f /usr/share/selinux/devel/Makefile load.