У нашей компании есть веб-сервер с 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, правила, определяющие, какая метка заканчивается файлом или каталогом, не диктуются регулярными выражениями, которые вы цитируете, а другими правилами (я считаю, что это правильный порядок, но, возможно, что-то упустил) .
type_transition
правило.type_transition
правило.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
.