如何将 /var/log/audit/audit.log 移动到另一个分区

如何将 /var/log/audit/audit.log 移动到另一个分区

安装了更新的全新 centos 6.5。我们希望将 auditd 记录到非持久卷,因为我们使用 splunk 或 logstash 捕获所有内容。

目标目录是 /mnt/ephemeral/audit/

# ls -l /var/log
lrwxrwxrwx. 1 root      root          21 Dec  9 12:11 audit -> /mnt/ephemeral/audit

完成此操作后,auditd 无法启动,可能是被 selinux 拒绝了。我假设 /var/log/messages 中的日志包含创建新策略所需的 avc 拒绝。

所以我

semanage permissive -a auditd_t

然后再试一次

Dec  9 12:50:56 myhost kernel: type=1400 audit(1418129456.307:93): avc:  denied  { write } for  pid=13174 comm="auditd" name="audit" dev=xvdb ino=147457 scontext=unconfined_u:system_r:auditd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=dir
Dec  9 12:50:56 myhost kernel: type=1400 audit(1418129456.307:94): avc:  denied  { add_name } for  pid=13174 comm="auditd" name="audit.log" scontext=unconfined_u:system_r:auditd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=dir
Dec  9 12:50:56 myhost kernel: type=1400 audit(1418129456.307:95): avc:  denied  { create } for  pid=13174 comm="auditd" name="audit.log" scontext=unconfined_u:system_r:auditd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file
Dec  9 12:50:56 myhost kernel: type=1400 audit(1418129456.307:96): avc:  denied  { read open } for  pid=13174 comm="auditd" name="audit.log" dev=xvdb ino=147458 scontext=unconfined_u:system_r:auditd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file
Dec  9 12:50:56 myhost kernel: type=1400 audit(1418129456.307:97): avc:  denied  { getattr } for  pid=13174 comm="auditd" path="/mnt/ephemeral0/audit/audit.log" dev=xvdb ino=147458 scontext=unconfined_u:system_r:auditd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file
Dec  9 12:50:56 myhost kernel: type=1400 audit(1418129456.310:98): avc:  denied  { append } for  pid=13175 comm="auditd" name="audit.log" dev=xvdb ino=147458 scontext=unconfined_u:system_r:auditd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file
Dec  9 12:50:56 myhost kernel: type=1400 audit(1418129456.310:99): avc:  denied  { setattr } for  pid=13175 comm="auditd" name="audit.log" dev=xvdb ino=147458 scontext=unconfined_u:system_r:auditd_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file

所以我

grep avc /var/log/messages > /tmp/avc
audit2allow -M mypol < /tmp/avc
semodule -i mypol.pp
restorecon -R -v /

te文件的内容:

# cat mypol.te    
module mypol 1.0;
require {
    type var_t;
    type auditd_t;
    class dir { write add_name };
    class file { getattr setattr read create open append };
}

    #============= auditd_t ==============
    #!!!! The source type 'auditd_t' can write to a 'dir' of the following types:
    # var_run_t, auditd_var_run_t, file_t, auditd_log_t, cluster_var_lib_t, cluster_var_run_t, root_t, cluster_conf_t

    allow auditd_t var_t:dir { write add_name };
    allow auditd_t var_t:file { getattr setattr read create open append };

但是 auditd 拒绝启动。我承认我对 selinux 不太熟悉,请不要批评!

尝试了 Michaels 的建议,我在 /var/log/messages 中看到了

Dec 10 11:42:52 myhost kernel: type=1400 audit(1418211771.996:29): avc:  denied  { read } for  pid=1494 comm="auditd" name="audit" dev=xvdf ino=49153 scontext=unconfined_u:system_r:auditd_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=dir
Dec 10 11:42:52 myhost auditd: Could not open dir /mnt/ephemeral/audit (Permission denied)

回到 audit2allow,我尝试了

# grep avc /var/log/messages |tail -n1 | audit2allow -w
Dec 10 12:03:09 euw1-infradev01-sonar-01 kernel: type=1400 audit(1418212989.424:48): avc:  denied  { read } for  pid=1928 comm="auditd" name="audit" dev=xvdf ino=49153 scontext=unconfined_u:system_r:auditd_t:s0 tcontext=unconfined_u:object_r:var_log_t:s0 tclass=dir

    Was caused by:
        Missing type enforcement (TE) allow rule.


# grep avc /var/log/messages |tail -n1 | audit2allow -M mypol
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i mypol.pp

# cat mypol.te

module mypol 1.0;

require {
    type var_log_t;
    type auditd_t;
    class dir read;
}

#============= auditd_t ==============
allow auditd_t var_log_t:dir read;

希望如此:

# setenforce 1
# service auditd start
Starting auditd:                                           [  OK  ]

最后,重启后这个功能还能继续使用吗?我会找出答案的。

答案1

SELinux 拒绝 auditd 执行任何操作,/mnt/ephemeral/audit因为它不具有允许的类型之一;相反,它似乎具有通用类型。

您需要告诉 SELinux 为该目录及其中的文件提供什么上下文。理想情况下,我们将复制适用的现有上下文/var/log/audit并重复使用。

因此,当我们查看时,/etc/selinux/targeted/contexts/files/file_contexts我们发现适用的上下文是:

/var/log/audit(/.*)?        system_u:object_r:auditd_log_t:s0

这很容易适应。运行以下命令:

semanage fcontext --add --type auditd_log_t "/mnt/ephemeral/audit(/.*)?"

然后修复现有的文件上下文:

restorecon -r -v /mnt/ephemeral/audit

最后,重新启动 auditd。

我无法保证下次启动时会发生什么。您需要测试一下,看看会出现什么问题。:)

答案2

我认为它无法启动是因为日志指向一个符号链接。您可以在 /etc/audit/auditd.conf 中定义日志文件位置。从 auditd.conf手册页

log_file 此关键字指定将存储审计记录的日志文件的完整路径名。它必须是常规文件。

相关内容