Linux

LogRotate 和 Apache 的 SELinux 權限

  • September 9, 2014

使用目錄結構:

/www/live/website1/app/
/www/live/website1/files/
/www/live/website1/logs/

Apache 至少需要以下訪問權限:

app: read-only access, but read-write is fine (files already chmod 0644)
files: read-write access
logs: read-write access

其中以下兩條規則已通過以下方式設置:

/usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/www/live/.*/.*";
/usr/sbin/semanage fcontext -a -t httpd_log_t "/www/live/.*/logs(/.*)?";

/sbin/restorecon -vr "/www";

哪些已應用,並且似乎工作正常……但是 LogRotate 並不高興。

LogRotate 配置目前為:

/www/live/*/logs/*access_log /www/live/*/logs/*access_log_443 {
   weekly
   rotate 52
   missingok
   notifempty
   nodateext
   sharedscripts
   postrotate
       /usr/sbin/apachectl graceful > /dev/null
   endscript
}

然而,這似乎被 SELinux 阻止了,當它試圖點擊與/www/live文件夾相關的 inode 時,條目出現在 audit.log 中(在下面的範例中為 262146)……因為它可能試圖列出 /www 中的文件夾/居住/。

type=AVC msg=audit(1396579563.324:316060): avc:  denied  { read } for  pid=12336 comm="logrotate" name="live" dev=dm-0 ino=262146 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:default_t:s0 tclass=dir
type=SYSCALL msg=audit(1396579563.324:316060): arch=c000003e syscall=2 success=no exit=-13 a0=7fff2cef68b0 a1=90800 a2=7fff2cef6b5a a3=8 items=0 ppid=12334 pid=12336 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=35531 comm="logrotate" exe="/usr/sbin/logrotate" subj=system_u:system_r:logrotate_t:s0-s0:c0.c1023 key=(null)

那麼我應該設置這個父目錄的上下文是什麼?

/usr/sbin/semanage fcontext -a -t default_t "/www(/.*)";

我知道的地方default_t不起作用,也不起作用var_t……作為參考,我真的不在乎什麼可以看到這些文件夾,因為它們已經是 chmod 0755。


對於獎勵積分……有沒有一種簡單的方法可以查看程序擁有的完整權限列表?我知道 LogRotate 必須能夠訪問httpd_log_tvar_log_t.

令人討厭的是,手動執行 LogRotate 似乎繞過了這些限制,因為我假設它繼承了使用者權限(與通過 cron 執行時不同)。

尚未確認這是否是正確答案…

/usr/sbin/semanage fcontext -a -t sysfs_t "/www(/.*)";
/usr/sbin/semanage fcontext -a -t httpd_sys_content_t "/www/live/.*/.*";
/usr/sbin/semanage fcontext -a -t httpd_log_t "/www/live/.*/logs(/.*)?";
/sbin/restorecon -vr "/www";

sysfs_t是重要的一點。

我可以找到 LogRotate 可以使用的域:

sesearch -s logrotate_t -SA

快速搜尋“dir”的“read”(不僅僅是“open”)權限:

sesearch -s logrotate_t -SA -c dir -p read | sort

然後掃描列表,我會說這sysfs_t是最合適的。


我確實發現的一個問題是,如果我/usr/sbin/logrotate自己執行,它會繼承 root 帳戶上下文:

id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

所以它會自動獲得“不受限制”的訪問權限(即完全訪問權限)……所以為了測試,我發現使用以下內容雖然不完美,但確實起到了作用:

sandbox /usr/sbin/logrotate -d /etc/logrotate.conf

我還發現了newroleand runcon,兩者都需要通過以下方式分別安裝在 RedHat/CentOS 系統上:

yum install policycoreutils-newrole

newrole -r system_r -t logrotate_t
runcon -r system_r -t logrotate_t /usr/sbin/logrotate -d /etc/logrotate.conf

但是這兩個都給了我權限被拒絕的錯誤(可能是由於不允許轉換):

http://wiki.gentoo.org/wiki/SELinux/Tutorials/How_does_a_process_get_into_a_certain_context


我發現其他有用的東西:

yum install setools-console

seinfo -usystem_u -x
seinfo -rsystem_r -x
seinfo -tlogrotate_t -x

seinfo -tsysfs_t -x

並檢查我在系統上創建的規則列表:

cat /etc/selinux/targeted/contexts/files/file_contexts.local

有關 SELinux 的更多資訊,我發現這 17 個教程非常有用:

http://wiki.gentoo.org/wiki/SELinux/Tutorials


我個人發現所有這些程序都非常不一致,並且可以理解為什麼大多數人預設禁用 SELinux ……例如

  • seinfo 選項後不能有空格 -u/r/t
  • 你需要安裝額外的包來獲取seinfonewrole
  • 您不能在給定的上下文(出於測試目的)下輕鬆地手動執行程序。
  • audit.log文件使用時間戳,因此請改為嘗試ausearch -m avc --start today.
  • 使用的許多程序沒有命名約定(例如matchpathcon)。
  • 我不會說的輸出(或操作)audit2allow是顯而易見的。

真可惜,因為它總體上似乎是一個非常強大的系統。

引用自:https://serverfault.com/questions/586673