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 

我知道这是关联到我附加到根/ DATA文件夹的标签,他们不能有两个?

是的,如果我禁用SELinux,所有的问题都会消失,但是这个项目是必需的。 这些文件夹是chown和chmod罚款。

对于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或是我唯一的select一个单独的文件夹为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强制我得到以下….

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

您不能将两个不同的安全标签附加到相同的目录。 所以,你必须select一个标签,让其他进程读取/写入带有该标签的文件。

问题在于,您正在有效地授予对第一个进程拥有的文件的第二个进程读/写访问权限,这正是您不想执行的操作。

有两个解决scheme:

  1. 你可以把所有标记为httpd_sys_content_t ,让mysql用这个标签访问文件。 虽然这样做有点不安全(mysql进程可以读/写http文件),但mysqld通常是一个可信的进程,所以比其他方式(让http访问mysql文件)要好得多。
  2. 你可以为/DATA/分配一个不同的共享标签,并修改你的selinux策略,这样可以将httpd和mysqld的权限授予共享标签。 在/DATA/ ,使用自己的标签(例如: /DATA/mysql带有mysqld_db_t/DATA/httpdocshttpd_sys_content_t

在这两种情况下,为了方便编辑策略,将selinux设置为许可模式,使用audit2allow实用程序来parsing/var/log/audit/audit.log文件。 在这里你可以find更多的信息。