我可以使用我的 nagios 命令更改哪些內容以使其符合目標文件夾 ACL?
我有一個 nagios 通知命令,如下所示:
/usr/bin/printf "%b" "NotificationType=$NOTIFICATIONTYPE$\nService=$SERVICEDESC$\nHost=$HOSTALIAS$\nAddress=$HOSTADDRESS$\nState=$SERVICESTATE$\nDateTime=$LONGDATETIME$\nAdditionalInfo=$SERVICEOUTPUT$\n" > $$(mktemp -p $CONTACTADDRESS1$ service.XXXXXXXX.alert)
添加一些換行符以提高可讀性
/usr/bin/printf "%b" "NotificationType=$NOTIFICATIONTYPE$\nService=$SERVICEDESC$\nHost=$HOSTALIAS$\nAddress=$HOSTADDRESS$\nState=$SERVICESTATE$\nDateTime=$LONGDATETIME$\nAdditionalInfo=$SERVICEOUTPUT$\n" > $$(mktemp -p $CONTACTADDRESS1$ service.XXXXXXXX.alert)
這實際上
$CONTACTADDRESS1$
在我定義的目錄中創建了一個新文件/home/alert/NagiosAlerts
。直到最近才深入研究權限和 ACL,我才明白我需要為此文件夾設置 gid 和一些預設 ACL,以確保我的 nagios 使用者能夠寫入此目錄並且我的警報使用者可以讀取和寫入文件在這裡創建。所以我設置了以下# setfacl -Rdm g:nagios:rw /home/alert/NagiosAlerts/ # setfacl -Rm g:nagios:rw /home/alert/NagiosAlerts/
所以文件夾權限現在看起來像這樣
[kanmonitor01]# pwd /home/alert/NagiosAlerts [kanmonitor01]# ll .. total 4 drwxrws---+ 2 alert nagios 4096 Dec 21 14:27 NagiosAlerts [kanmonitor01]# getfacl . # file: . # owner: alert # group: nagios # flags: -s- user::rwx group::rwx group:nagios:rw- mask::rwx other::--- default:user::rwx default:group::rw- default:group:nagios:rw- default:mask::rw- default:other::---
因此,作為 nagios 使用者,我觸摸了一個新文件….
[nagios@kanmonitor01]$ whoami nagios [nagios@kanmonitor01]$ touch file.bagel [nagios@kanmonitor01]$ ll file.bagel -rw-rw----+ 1 nagios nagios 0 Dec 21 14:57 file.bagel
這對我來說看起來不錯。該文件的組權限是 rw- 我認為這是預期的結果。但是,當 nagios 服務在問題開頭執行命令時,我最終會得到以下結果:
[@kanmonitor01]# ll service.iCSThqzg.alert -rw-------+ 1 nagios nagios 178 Dec 21 14:51 service.iCSThqzg.alert [kanmonitor01]# getfacl service.iCSThqzg.alert # file: service.iCSThqzg.alert # owner: nagios # group: nagios user::rw- group::rw- #effective:--- group:nagios:rw- #effective:--- mask::--- other::---
所以它有一個 ACL,但不是我想要的。這對我來說不是預期的行為。我看到很多關於某些二進製文件由於預設行為等原因不遵守 ACL 的問題。看起來我的情況
mktemp
是以某種方式導致了我這個問題。chmod
我試圖避免每次需要時都需要對每個文件執行某種操作。不知道這裡有什麼好的做法。歸根結底,我需要使用者 nagios 能夠將文件寫入此目錄,並且使用者警報能夠讀取/寫入這些相同的文件。ACL似乎是要走的路……
mktemp
顯式創建權限為 0600 的文件$ strace -e open mktemp -p . [...] open("./tmp.EuTEGOcoEJ", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
這樣會覆蓋那些預設的 ACL。
mktemp
確實要求組和其他沒有權限。欺騙它以免它發生的方法是錯誤的。您可以
chmod
在創建後創建文件(之後違背 mktemp 的意願):file=$(mktemp....) && chmod g+r -- "$file" && ... > "$file"
或者用於
mktemp
查找文件名但不創建它,並讓 shell 重定向創建它:umask 077; ... > "$(mktemp -u ...)"
在這種情況下,ACL 確實優先於
umask
.(
-u
這裡是 GNUmktemp
)是不安全的,雖然雖然mktemp
會嘗試提供一個唯一的文件名,但它不能保證不會創建該文件(可能作為指向其他地方的符號連結,這是一種可能的事情需要擔心)在它輸出它和shell打開它之間的時間。甚至set -o clobber
無法防範它,因為它也有競爭條件(你需要zsh
’sysopen -o excl
在這裡)。