SELinux + logrotate + prerotate = 权限被拒绝

Sea*_*ean 5 logrotate selinux

我有(应该)是一项相当简单的任务:在晚上将一组自定义日志文件迁移到数据库。

我将 logrotate (cron.daily) 与一个简单的 prerotate 任务一起使用

/var/log/myapplog/*.log
{
    daily
    copytruncate
    rotate 366
    dateext
    dateformat .%Y-%m-%d
    compress
    missingok
    compresscmd /usr/bin/xz
    compressoptions -ze9
    compressext .xz
    prerotate
        /usr/local/myapp/bin/DBWriter $1
    endscript
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,SELinux 并不这么认为。如果我setenforce 0那么脚本运行完美。轮换日志,将它们发送到数据库等 setenforce 1,但是,返回:

logrotate_script: line 1: /usr/local/myapp/bin/DBWriter: Permission denied

我曾尝试更改 DBWriter 上的上下文,最近我将其设置为unconfined_u:unconfined_r:unconfined_t也不起作用......

理想情况下,我需要保持启用 SELinux。如果重要的话,DBWriter 也可以作为 java .jar 文件使用。但跑步java -jar DBWriter.jar也有同样的结果。

提前致谢!


编辑:Win.T 下面的回答为我解决了这个问题。

semanage permissive -a logrotate_t
Run Code Online (Sandbox Code Playgroud)

部分问题是我试图完全按照SELinux 旨在防止的方式进行:导致进程 A 执行未知文件 B 并对系统 C 造成严重破坏

项目设计考虑和限制使我们走上了这条道路。

客户并不总是想听到诸如安全性和面向未来之类的花哨的流行语。

KM.*_*KM. 4

查看/var/log/messages/var/log/audit/audit.log(如果您正在auditd跑步)。您还可以用来audit2allow查看 SELinux 错误消息和可能的解决方案。

此外,尝试semanage permissive -a logrotate_t允许 logrotate 运行并且不被 SELinux 拒绝。