Ubuntu DesktopでSELinuxを使う


はじめに

SELinux使っていますか...?Disabledにしていませんか...?

こんにちは!cl0wnです!TUTアドベントカレンダーの8日目です。よろしくおねがいします!

最近研究でUbuntu上でSELinuxを使うことがあったので、その際に得られた知見を共有しようと思います。

前提

ルートユーザーでログインできるようにしておきましょう。
一般ユーザーからsudoで昇格できるからといって安心しないでください。
設定ミスがあると一般ユーザーから昇格できなくなります。

SELinuxのインストール

インストールはこちらの記事が参考になりました。ありがとうございます。

$ sudo apt-get install -y selinux-basics selinux-policy-default selinux-policy-dev selinux-policy-src selinux-utils
$ sudo selinux-activate
$ sudo shutdown -r now
$ check-selinux-installation
$ sudo apt install -y auditd

ポリシーの追加

上のコマンド入力を終えると、SELinuxはPermissiveモードで動作するようになっているはずです。
このモードはポリシー違反が発生しても動作を拒否せずに、「ポリシー違反が発生したよ」ということを報告するだけのモードになっています。

  • どのようなコンテキストのプロセスが
  • どのコンテキストのオブジェクト(ファイルやネットワーク)にアクセスしようとして
  • ポリシーがその操作をどうしたか

が、/var/log/audit/audit.logに記録されます。

このファイルの内容を整形して表示してくれるのがausearchコマンドです。

このコマンドを使って、最近どのようなアクセス可否の判断がされたかを確認してみましょう。

$ sudo ausearch -m avc -ts recent
----
time->Wed Dec  8 15:06:10 2021
type=AVC msg=audit(1638943570.986:724): avc:  denied  { search } for  pid=271 comm="systemd-journal" name="user" dev="tmpfs" ino=1201 scontext=system_u:system_r:syslogd_t:s0 tcontext=system_u:object_r:user_runtime_root_t:s0 tclass=dir permissive=1
----
time->Wed Dec  8 15:06:10 2021
type=AVC msg=audit(1638943570.986:725): avc:  denied  { search } for  pid=271 comm="systemd-journal" name="/" dev="tmpfs" ino=1 scontext=system_u:system_r:syslogd_t:s0 tcontext=unconfined_u:object_r:user_runtime_t:s0 tclass=dir permissive=1
----
time->Wed Dec  8 15:06:10 2021
type=AVC msg=audit(1638943570.986:726): avc:  denied  { search } for  pid=271 comm="systemd-journal" name="systemd" dev="tmpfs" ino=9 scontext=system_u:system_r:syslogd_t:s0 tcontext=system_u:object_r:user_runtime_t:s0 tclass=dir permissive=1
----
time->Wed Dec  8 15:06:10 2021
type=AVC msg=audit(1638943570.986:727): avc:  denied  { read } for  pid=271 comm="systemd-journal" name="invocation:vte-spawn-440bfdce-96b7-482f-993a-4ed22e47d13d.scope" dev="tmpfs" ino=94 scontext=system_u:system_r:syslogd_t:s0 tcontext=system_u:object_r:user_runtime_t:s0 tclass=lnk_file permissive=1

....

audit.logにはシステムのセキュリティに関する多種多様なメッセージが記録されます。その中で今回着目しているのは、誰がどのオブジェクトにアクセスして、アクセス可否はどうだったかという情報です。この情報はavc(アクセスベクターキャッシュ)と呼ばれています。

上の例だと、

  • systemd-journalというコマンドを実行している最中に、
  • system_u:system_r:syslogd_t:s0というコンテキストのプロセスが、
  • system_u:object_r:user_runtime_root_t:s0というラベルがついているディレクトリにアクセスしようとして
  • ポリシー違反として拒否されます
  • ただし、Permissiveモードで動作しているので動作の拒否は実際にはされませんでした

という読み方をします。

enforcingモードへの以降

さて、このままEnforcingモードに移行すると、再起動したときにデスクトップマネージャがポリシー違反となりログイン画面が表示されなくなります。したがって、Permissiveモードで記録された監査ログから動作を許可するポリシーを生成して、システムに読み込ませることにします。

以下のコマンドはルートで実行します。

$ audit2allow -a -M new_policy
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i new_policy.pp


$ semodule -i new_policy.pp

audit.logの内容全て(-a)から、new_policyという名前で(-M new_policy)ポリシーを作成しました。
モジュールがちゃんと読み込まれたか確認します。new_policyが出力に含まれていればちゃんと読み込まれています。

$ semodule -l

...
new_policy

....

さて、ではEnforcingモードに入りましょう。

/etc/selinux/configを編集します。

ここを

SELINUX=permissive

このように変更します。

SELINUX=enforcing

変更が終わりましたら再起動です。

再起動すると、デスクトップ環境のログイン画面がうまく表示されないかもしれません。そういうときはTTYを切り替えてrootとしてログインしましょう。Ctrl + Alt + F3とかでTTYを切り替えられます。

rootとしてログインできたら、先程と同様にaudit2allowコマンドでポリシーを作成&ロードします。ポリシー名は同じでも別でも構いません。

動作確認&audit2allowを何回か繰り返すと、デスクトップ環境が使えるようになります。

参考

SELinuxを使う上でとても勉強になった記事を載せておきます。
正直自分の記事よりこちらを見ていただきたいです!!!
自分でSELinuxをちゃんと運用しようと思ったらどのようなことをすればいいのかイメージが付くようになります。
研究でも大変お世話になりました。この場を借りて感謝を申し上げます。

終わりに

SELinux使っていますか...?Disabledにしていませんか...?

私はDisabledにしています!