Bash
zabbix
monitoring
logrotate
permission

zabbixでpermission 777のフォルダを見つけたらアラートする

マカーなのでディレクトリよりフォルダと呼ぶのが好きです。

logrotate対象のディレクトリが777だと because parent directory has insecure permissions. などと怒って仕事を放棄するので、それを検知するzabbix userparameterを書きました。

手抜きなので .conf ひとつで書いちゃいました。これだと見づらいのがzabbix userparameterの残念なところです。真面目にやるときは .sh にしましょう。

zabbix item

$ cat findpermission.conf 
# permissionチェックツール
# 777のフォルダが有るとlogrotateがコケるときがあるので、怪しいフォルダがないか探すために作成
# 
# 対象dirに 777 のフォルダがあればそのリストを、なければ 0 を返す

# How to use
# Item:
#  Type: Zabbix agent
#  Type of information: text
#
#  findpermission[permission,<location>]
#
#  @param permission(int)        777, 644 など探したいdirのpermission(octal)
#  @param location(string)       "/var /home" など探したい親フォルダのフルパス
#  @return (string)              ヒットしたdirリスト or 0
#
# Trigger:
#  findpermission[777].count(#3,0,eq)}<>3
#  意味:0が返ってきた回数が3回中3回じゃなかったら=3回連続で777のフォルダを見つけたらアラート実行
#
#### チェックコマンド
#### $ zabbix_get -s 192.168.1.3 -k "findpermission[777]"
#### 0 が返れば検索結果ゼロ。見つけた場合は777のフォルダリストを表示します。

UserParameter=findpermission[*],if [ -z "$1" ]; then echo "Please specity one octal permission. e.g. findpermission[777]"; exit 1; fi; if [ -z "$2" ]; then DIR="/var/log"; else DIR=$2; fi; if [ `find $DIR -type d -perm $1 | wc -l` -eq 0 ]; then echo 0; else echo -e "Directories below have permission $1.\n"; find $DIR -type d -perm $1; fi;

trigger

私のzabbix scriptは、zabbix上で「何が悪いのか?」まで見えるようにする信条があるので返り値はだいたい以下になってます。

  • 成功: 0
  • 失敗: エラー原因をstringsで表示

zabbix v3.0.x 以外はこれをnumericで受け取れないので、itemは text で受け取って、以下のtriggerで検知させます。

 findpermission[777].count(#3,0,eq)}<>3

※ 数値じゃないので単純な比較演算ができないのです

results

こんな感じで、残念なサーバの状況を洗い出せました。あとはこれをひとつずつなんとかしていきたいと思います。除外することになるものもあるでしょう・・。
2018-02-21_10h32_16.png

zabbix上でひっかかったフォルダのリストまで確認できてます。
2018-02-21_10h16_16.png

アラートなど鳴らさず直接 chmod してもいいのですが、しばらくは現状把握の意味でこれを回しておきたいと思います。

新しい技術にトライしているときなどは 777 は有用なので、絶対悪としては扱いたくない所存です。