看起来我的老忠实的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:
httpd_sys_content_t ,让mysql用这个标签访问文件。 虽然这样做有点不安全(mysql进程可以读/写http文件),但mysqld通常是一个可信的进程,所以比其他方式(让http访问mysql文件)要好得多。 /DATA/分配一个不同的共享标签,并修改你的selinux策略,这样可以将httpd和mysqld的权限授予共享标签。 在/DATA/ ,使用自己的标签(例如: /DATA/mysql带有mysqld_db_t和/DATA/httpdocs和httpd_sys_content_t ) 在这两种情况下,为了方便编辑策略,将selinux设置为许可模式,使用audit2allow实用程序来parsing/var/log/audit/audit.log文件。 在这里你可以find更多的信息。