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

SELinux - mysql / и httpdoc / в одной папке?

Похоже, моя старая верная структура каталогов LAMP вышла из строя с SELinux. Я предпочитаю все в одном месте. CentOS 6.6 Apache 2.2.15 MySQL 6.5

/DATA/
/DATA/httpdocs/
/DATA/mysql/
/DATA/server-config.php
/DATA/httpd-error.logs...

Если я это сделаю, Apache будет работать нормально, но mysql не запустится.

chcon -R -t httpd_sys_content_t /DATA/
chcon -R -t mysqld_db_t  /DATA/mysql
chcon -R -t httpd_sys_content_t /DATA/httpdocs

Если я это сделаю, то mysql запустится, но Apache не запустится.

chcon -R -t mysqld_db_t /DATA
chcon -R -t mysqld_db_t  /DATA/mysql
chcon -R -t httpd_sys_content_t /DATA/httpdocs

Я знаю, что это связано с ярлыком, который я прикрепляю к папке root / DATA, и у них не может быть двух?

Да, все мои проблемы исчезнут, если я отключу SELinux, но это необходимо для этого проекта. Папки исправлены и изменены нормально.

Для случая mysql ошибка

2015-04-24 14:17:56 3391 [Warning] Can't create test file /DATA/mysql/WIK1.lower-test
2015-04-24 14:17:56 3391 [Warning] Can't create test file /DATA/mysql/WIK1.lower-test
/usr/sbin/mysqld: Can't change dir to '/DATA/mysql/' (Errcode: 13 - Permission denied)
2015-04-24 14:17:56 3391 [ERROR] Aborting

Для случая Apache ошибка.

Starting httpd: Warning: DocumentRoot [/DATA/httpdocs/] does not exist

Я попытался добавить это в /etc/selinux/targeted/contexts/files/file_contexts.local

/DATA/mysql(/.*)?       system_u:object_r:mysql_db_t:s0

Но ничего не делает.

Может ли кто-нибудь помочь мне приручить SELinux или единственный вариант - отдельная папка для mysql?

Спасибо


Спасибо, я пробовал это (также отправляю ответ, потому что я не мог отформатировать текст в комментарии)

    cd ~
    setenforce Permissive
    service mysqld restart
    service httpd restart
    # interact with web app make it do things like file writes, db access, network and so on.
    grep 'mysqld_t\|httpd_sys_content_t' /var/log/audit/audit.log | audit2allow -M postgreylocal 
    semodule -i postgreylocal.pp
    # check it exists...
    semodule -l
    chcon -R -t postgreylocal /DATA
    chcon -R -t postgreylocal /DATA/
setenforce Enforce

mysql по-прежнему не идет. Думаю, я не знаю, как применить политику postgreylocal? В журнале есть - /var/log/audit/audit.log

type=AVC msg=audit(1429892483.654:3036): avc:  denied  { read } for  pid=7089 comm="mysqld" name="DATA" dev=dm-3 ino=13 scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:object_r:unlabeled_t:s0 tclass=lnk_file
type=SYSCALL msg=audit(1429892483.654:3036): arch=c000003e syscall=80 success=no exit=-13 a0=132b500 a1=10 a2=41000 a3=7fff4d3af8f0 items=1 ppid=6882 pid=7089 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=4294967295 comm="mysqld" exe="/usr/sbin/mysqld" subj=unconfined_u:system_r:mysqld_t:s0 key=(null)
type=CWD msg=audit(1429892483.654:3036):  cwd="/"
type=PATH msg=audit(1429892483.654:3036): item=0 name="/DATA/mysql/" nametype=UNKNOWN

Если я chcon с SE Enforcing, я получаю следующее ....

# chcon -R -t postgreylocal /DATA
chcon: failed to change context of `/DATA' to `system_u:object_r:postgreylocal:s0': Invalid argument

Вы не можете прикрепить две разные метки защиты к одним и тем же каталогам. Итак, вам нужно было выбрать одну метку и позволить другому процессу читать / записывать файлы с этой меткой.

Проблема в том, что делая это, вы фактически предоставляете второму процессу доступ для чтения / записи к файлам, принадлежащим первому процессу, а это именно то, что вы не хотите делать.

Существует два решения:

  1. вы можете отметить все как httpd_sys_content_t и позволить mysql обращаться к файлам с этой меткой. Хотя это остается несколько небезопасным (процесс mysql может читать / писать файлы http), mysqld обычно является доверенным процессом, и поэтому он намного лучше, чем наоборот (пусть http имеет доступ к файлам mysql).
  2. вы можете назначить /DATA/ другую общую метку и измените свою политику selinux таким образом, чтобы предоставить доступ как httpd, так и mysqld к этой общей метке. Под /DATA/, оставьте два типа каталогов с их собственными ярлыками (например: /DATA/mysql с участием mysqld_db_t и /DATA/httpdocs с участием httpd_sys_content_t)

В обоих случаях для упрощения редактирования политики установите selinux в разрешающий режим, используйте audit2allow утилита для анализа вашего /var/log/audit/audit.log файл. Вот вы можете найти больше информации.