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

Разрешения SELinux для LogRotate и Apache

Со структурой каталогов:

/www/live/website1/app/
/www/live/website1/files/
/www/live/website1/logs/

Если Apache нужен как минимум следующий доступ:

app: read-only access, but read-write is fine (files already chmod 0644)
files: read-write access
logs: read-write access

Если следующие два правила были установлены через:

/usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/www/live/.*/.*";
/usr/sbin/semanage fcontext -a -t httpd_log_t "/www/live/.*/logs(/.*)?";

/sbin/restorecon -vr "/www";

Которые применяются и, похоже, работают нормально ... однако LogRotate не доволен.

Конфигурация LogRotate в настоящее время:

/www/live/*/logs/*access_log /www/live/*/logs/*access_log_443 {
    weekly
    rotate 52
    missingok
    notifempty
    nodateext
    sharedscripts
    postrotate
        /usr/sbin/apachectl graceful > /dev/null
    endscript
}

Однако, похоже, это блокируется SELinux, и записи появляются в audit.log, когда он пытается попасть в индексный дескриптор, связанный с /www/live папка (262146 в приведенном ниже примере) ... поскольку предположительно пытается перечислить папки в / www / live /.

type=AVC msg=audit(1396579563.324:316060): avc:  denied  { read } for  pid=12336 comm="logrotate" name="live" dev=dm-0 ino=262146 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=dir
type=SYSCALL msg=audit(1396579563.324:316060): arch=c000003e syscall=2 success=no exit=-13 a0=7fff2cef68b0 a1=90800 a2=7fff2cef6b5a a3=8 items=0 ppid=12334 pid=12336 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=35531 comm="logrotate" exe="/usr/sbin/logrotate" subj=system_u:system_r:logrotate_t:s0-s0:c0.c1023 key=(null)

Итак, в каком контексте я должен установить этот родительский каталог?

/usr/sbin/semanage fcontext -a -t default_t "/www(/.*)";

Откуда я знаю default_t не работает, и не работает var_t... и для справки мне все равно, что может видеть эти папки, поскольку они уже chmod 0755.


А что касается бонусных баллов ... есть ли простой способ увидеть полный список разрешений, которые есть у программы? Я знаю, что LogRotate должен иметь доступ к httpd_log_t и var_log_t.

Раздражает то, что запуск LogRotate вручную, кажется, обходит эти ограничения, поскольку я предполагаю, что он наследует разрешения пользователей (в отличие от того, когда он запускается через cron).

Не подтверждено, если это правильный ответ ...

/usr/sbin/semanage fcontext -a -t sysfs_t "/www(/.*)";
/usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/www/live/.*/.*";
/usr/sbin/semanage fcontext -a -t httpd_log_t "/www/live/.*/logs(/.*)?";
/sbin/restorecon -vr "/www";

Там sysfs_t это важный бит.

Я могу найти домены, которые LogRotate может использовать с:

sesearch -s logrotate_t -SA

Быстрый поиск разрешения на "чтение" (а не только на "открытие") для "dir":

sesearch -s logrotate_t -SA -c dir -p read | sort

Затем, просматривая список, я бы сказал, что sysfs_t является наиболее подходящим.


Проблема, которую я обнаружил, заключается в том, что если я бегу /usr/sbin/logrotate я сам наследует контекст учетной записи root:

id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Таким образом, он автоматически получает "неограниченный" доступ (то есть полный доступ) ... поэтому для тестирования я обнаружил, что использование следующего, хотя и не идеального, работает:

sandbox /usr/sbin/logrotate -d /etc/logrotate.conf

Я также узнал о newrole и runcon, оба из которых необходимо установить отдельно в системе RedHat / CentOS через:

yum install policycoreutils-newrole

newrole -r system_r -t logrotate_t
runcon -r system_r -t logrotate_t /usr/sbin/logrotate -d /etc/logrotate.conf

Но оба они давали мне ошибки с отказом в разрешении (вероятно, из-за того, что переход не разрешен):

http://wiki.gentoo.org/wiki/SELinux/Tutorials/How_does_a_process_get_into_a_ sure_context


Еще кое-что, что я нашел полезным:

yum install setools-console

seinfo -usystem_u -x
seinfo -rsystem_r -x
seinfo -tlogrotate_t -x

seinfo -tsysfs_t -x

И чтобы проверить список правил, которые я создал в системе:

cat /etc/selinux/targeted/contexts/files/file_contexts.local

Для получения дополнительной информации о SELinux я нашел эти 17 руководств очень полезными:

http://wiki.gentoo.org/wiki/SELinux/Tutorials


Лично я считаю, что все эти программы очень несовместимы, и могу понять, почему большинство людей просто отключают SELinux по умолчанию ... например.

  • У вас не может быть пробела после параметров seinfo -u / r / t
  • Вам необходимо установить дополнительные пакеты, чтобы получить seinfo и newrole
  • Вы не можете легко запустить программу вручную в заданном контексте (в целях тестирования).
  • В audit.log файл использует временные метки, поэтому вместо этого попробуйте ausearch -m avc --start today.
  • Отсутствие соглашения об именах для многих используемых программ (например, matchpathcon).
  • Я бы не сказал, что вывод (или работа) audit2allow было очевидно.

Это очень досадно, потому что в целом это очень мощная система.