SELinuxのAVCイベントをlibnotify経由で通知する

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 では setroubleshootsetroubleshoot-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 イベントを発生させると下のように通知してくれます。

SELinux security alert

動作には、auditd デーモンが動作していることと SETroubleShoot がインストールされていることが必要です。 あと当然ですが、通知デーモンが動作している必要があります。

  • Published:
  • Updated:
  • Tags:SELinux, libnotify