SELinux如何影响/ home目录?

我正在将一个CentOS 5.3系统从MySQL迁移到PostgreSQL。 我们机器的设置方式是将最大的磁盘分区挂载到/home 。 这是我的控制权,由托pipe服务提供商pipe理。 无论如何,我们显然希望数据库文件在/home的原因。

使用MySQL,我们做了以下工作:

  • 编辑my.cnf并将datadir设置更改为/home/mysql
  • 添加了一个新的“文件types”政策logging(我希望我使用正确的术语)来设置/home/mysql(/.*)?mysqld_db_t
  • 运行restorecon -R /home/mysql来分配标签

一切都很好

但是,对于PostgreSQL,我做了以下工作:

  • 编辑/etc/init.d/postgresql并将PGDATAPGLOGvariables分别更改为/home/pgsql/data/home/pgsql/pgstartup.log
  • 添加了一个新的策略logging,将/home/pgsql/pgstartup.log设置为postgresql_log_t
  • 添加了一个新的策略logging来设置/home/pgsql/data(/.*)?postgresql_db_t
  • 运行restorecon -R /home/pgsql来分配标签

在这一点上,我仍然无法启动PostgreSQL。 pgstartup.log说:

 # cat pgstartup.log postmaster cannot access the server configuration file "/home/pgsql/data/postgresql.conf": Permission denied 

奇怪的是,在/var/log/messages/var/log/secure中我没有看到与此有关的任何消息, 但是如果我closures了SElinux,那么一切正常。

我确保所有的权限都是正确的(文件为600,目录为700)以及所有权(postgres:postgres)。

谁能告诉我我做错了什么?

我从版本8.3.7的commandprompt.com使用Yum版本库。

编辑:我的问题明确提到/home目录的原因是,如果我通过所有这些步骤的任何其他目录,例如/var/lib/pgsql2/usr/local/pgsql ,然后按预期工作。

首先检查conf文件上的标签。 在我看到的Centos5.3系统上徘徊

 semanage fcontext -l | grep "postgresql_etc_t" /etc/postgresql(/.*)? all files system_u:object_r:postgresql_etc_t:s0 

和政策说

 sesearch -A -s postgresql_t -t postgresql_etc_t Found 3 av rules: allow postgresql_t postgresql_etc_t : file { ioctl read getattr lock }; allow postgresql_t postgresql_etc_t : dir { ioctl read getattr lock search }; allow postgresql_t postgresql_etc_t : lnk_file { read getattr }; 

尝试做一个

 ls -Z /home/pgsql/data/postgresql.conf 

如果标签不正确,有多种方法可以改变它。 快速谷歌给了我http://docs.fedoraproject.org/selinux-user-guide/f10/en-US/sect-Security-Enhanced_Linux-SELinux_Contexts_Labeling_Files-Persistent_Changes_semanage_fcontext.html

semanage是一种方式。 如果你想尝试做一个快速的testing尝试

 chcon -t postgresql_etc_t /home/pgsql/data/postgresql.conf 

还要确保postgresql守护进程运行在正确的域(即SELinux上下文)。 您可能会很快发现它不是通过拖拽日志,请参阅下文。 有关启动init脚本的详细信息,请参阅run_init以使其位于正确的域中。 posgresql可能会作为unconfined_t运行(在这种情况下应该没有问题,无限制可以做很多事情)。

SELinux可能还有其他问题需要进一步分析,请尝试拖尾审核日志。 (请注意,审计日志不会被写入,直到auditd启动,我已经被之前咬过,在这种情况下,检查预先审计日志消息的/ var / log / messages)

试试看看SELinux可能会抱怨什么

 tail -f /var/log/audit/audit.log 

或者只是为了拒绝

 tail -f /var/log/audit/audit.log | grep denied 

然后尝试相同的访问,即启动deamon。

你是否检查过你的#SESTATUS

[root @ yeswedeal〜]#sestatus SELinux status:disabled

即使你正确地标记了目录,selinux策略很可能禁止postgresql从/home本身访问(@ Milen的答案中提到的链接,实际上似乎暗示了这一点)。