SELinux - mysql/ 和 httpdoc/ 在同一个文件夹中?

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,所有问题都会消失,但这个项目需要它。文件夹的所有者和权限都已更改。

对于 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

如果我使用 SE Enforcing 进行 chcon,我会得到以下内容......

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

答案1

您不能将两个不同的安全标签附加到同一个目录。因此,您必须选择一个标签,并让另一个进程读取/写入带有该标签的文件。

问题是,这样做实际上授予了第二个进程对第一个进程拥有的文件的读/写访问权限,而这正是您不想做的。

有两种解决方案:

  1. 您可以将所有内容标记为httpd_sys_content_t并让 mysql 访问带有该标签的文件。虽然这仍然有些不安全(mysql 进程可以读取/写入 http 文件),但 mysqld 通常是一个受信任的进程,因此它比反过来(让 http 访问 mysql 文件)要好得多。
  2. 您可以将其分配给/DATA/不同的共享标签,并修改 selinux 策略,以便将权限授予该共享标签的 httpd 和 mysqld。在 下/DATA/,让两种目录类型保留各自的标签(例如:/DATA/mysqlwithmysqld_db_t/DATA/httpdocswith httpd_sys_content_t

在这两种情况下,为了轻松地编辑策略,请将 selinux 设置为宽容模式,然后使用该audit2allow实用程序来解析您的/var/log/audit/audit.log文件。 这里您可以找到更多信息。

相关内容