SELinux の audit イベントは auditd デーモンが起動していれば /var/log/audit/audit.log
などに出力されます。
例えば、何らかのアクセスが SELinux によって拒否された場合に AVC イベントとしてその情報はこのログファイルに出力されます。
そのためプログラムの挙動が怪しい場合などにこのログファイルを確認することで SELinux の関与を調べることができます。
また、問題の挙動を再現する方法が分かっていれば次のようなコマンドを同時に実行することで AVC イベントをリアルタイムで確認することもできます。
# tail -f /var/log/audit/audit.log | grep AVC
SELinux に慣れている人はシステムで何か問題が起きたとき、このように audit ログを確認して SELinux が原因になっているかどうかを調べると思います。 しかし、SELinux にあまり慣れていない私はこのプロセスをよく忘れます。 また、SELinux が原因でプログラムが怪しい挙動をしていてもそれに気付かないことがたまにあります。 そのため、AVC イベントが発生したらすぐにそれを教えてもらえると嬉しいです。
AVC イベントをデスクトップに通知してくれる機能を持った SETroubleShoot というプログラムが実はすでにあります。
Fedora では setroubleshoot
と setroubleshoot-server
という2つのパッケージに分けて提供されており、前者は GUI でのみ必要なプログラムを提供し、後者はそれを除いたものを提供します。
この中の setroubleshoot
パッケージに含まれている /usr/bin/seapplet
が AVC イベントを通知してくれるプログラムです。
しかし、seapplet
はシステムトレイに駐在させる必要があるため私のデスクトップ環境では残念ながら動作させることができません。
seapplet
は AVC イベントの発生を知るために、setroubleshoot-server
パッケージに含まれている setroubleshootd
という DBus サービスから AVC イベントの発生を知らせるシグナルを受け取っています。
そこで、このシグナルを受け取って libnotify 経由でデスクトップに通知すれば AVC イベントの発生をすぐに知ることができるようになります。
#!/bin/bash
set -e
DBUS_WATCH_EXPR="\
type='signal',\
sender='org.fedoraproject.Setroubleshootd',\
interface='org.fedoraproject.SetroubleshootdIface',\
member='alert'\
"
dbus-monitor --system --monitor "$DBUS_WATCH_EXPR" | while read LINE
do
case $LINE in
*Setroubleshootd*)
read _TYPE ALERT_LEVEL
read _TYPE LOCAL_ID
if test "$ALERT_LEVEL" = '"red"'
then
URGENCY_LEVEL='critical'
else
URGENCY_LEVEL='normal'
fi
LOCAL_ID=`echo $LOCAL_ID | sed -e 's/^"//' -e 's/"$//'`
ALERT_MSG=`sealert -l $LOCAL_ID | head -n 1`
notify-send 'SELinux security alert' "$ALERT_MSG" --urgency=$URGENCY_LEVEL
;;
*)
continue
;;
esac
done
上記のスクリプトをデーモンとして実行しておけば、AVC イベントの発生を libnotify 経由で通知してくれます。 例えば、
# sandbox cat /etc/passwd
のようなコマンドを実行して AVC イベントを発生させると下のように通知してくれます。
動作には、auditd デーモンが動作していることと SETroubleShoot がインストールされていることが必要です。 あと当然ですが、通知デーモンが動作している必要があります。