次の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
。 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が行く道のようです...
答え1
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
ファイル名を生成せずに検索を使用し、シェルリダイレクトにファイル名を生成させます。
umask 077; ... > "$(mktemp -u ...)"
この場合、ACLはumask
。
(ここで-u
GNU mktemp
)安全ではないmktemp
一意のファイル名を見つけようとしますが、ファイルを出力するときにファイルが生成されないという保証はありません(おそらく他の場所へのシンボリックリンクで、これは心配する必要があります)。シェルは時間を開きます。競合状態(ここでset -o clobber
必要)もあるため、これを防ぐ方法はありません。zsh
sysopen -o excl