晴耕雨読

working in the fields on fine days and reading books on rainy days

SELinuxでカスタムポリシーパッケージを作成・適用する

SELinuxでカスタムポリシーパッケージを作成・適用する方法について説明します。

カスタムポリシーパッケージの作成手順

まず初めに、checkmodule コマンドと semodule_package コマンドを使って作成するため、以下のパッケージをインストールします。

$ sudo yum install checkpolicy policycoreutils-python

カスタムポリシーパッケージを作成と適用する手順は次のように、.te ファイルを作成したら、checkmoduleコマンドで .mod ファイル(モジュール)を作成し、semodule_packageコマンドで .pp ファイル(ポリシーパッケージ)を作成します。

# モジュールのコンパイル
$ checkmodule -M -m -o <モジュール名>.mod <モジュール名>.te
# ポリシーパッケージの作成
$ semodule_package -o <モジュール名>.pp -m <モジュール名>.mod
# カーネルへのモジュール読み込み
$ semodule -i <モジュール名>.pp

.te ファイル(タイプ強制)の記述方法は、以下の2つのページや sesearch --allow -s <ドメイン名> コマンドの結果を参考にしながら、書いていきます。

teファイルとポリシーパッケージの作成と適用

今回は tomcat_t ドメインのプロセスが、外部と通信したら、許可するがログに残す (auditallow) ように設定します。

~]# cat <<'EOS' > my_tomcat_policy.te
module my_tomcat_policy 1.0.0;
require {
        type tomcat_t;
        class tcp_socket *;
        class udp_socket *;
        class rawip_socket *;
}
auditallow tomcat_t self:{ tcp_socket udp_socket rawip_socket } *;
EOS
~]# checkmodule -M -m -o my_tomcat_policy.mod my_tomcat_policy.te
~]# semodule_package -o my_tomcat_policy.pp -m my_tomcat_policy.mod
~]# semodule -i my_tomcat_policy.pp
~]# semodule -lfull | grep my_tomcat_policy

もし設定を修正して再インストールする場合は、teファイルの1行目のバージョン番号を上げることで、適切に設定がカーネルに反映されたか確認できます。

監査ログ

以上で、tomcat_tが外部ポートと通信したイベントがログに残るようになりました。 例えば、Tomcat経由で8080番で待ち受けているWebアプリにアクセスすると、次のようなログが /var/log/audit/audit.log に残ります。

type=AVC msg=audit(0000000000.569:186): avc:  granted  { accept } for  pid=1501 comm="java" lport=8080 scontext=system_u:system_r:tomcat_t:s0 tcontext=system_u:system_r:tomcat_t:s0 tclass=tcp_socket

他にも、Tomcatが展開したwarファイルの中のJavaが、外部の8888番ポートへ通信した際は次のようなログが残ります。

type=AVC msg=audit(0000000000.592:195): avc:  granted  { write } for  pid=1501 comm="java" laddr=::ffff:192.168.56.105 lport=34470 faddr=::ffff:192.168.56.104 fport=8888 scontext=system_u:system_r:tomcat_t:s0 tcontext=system_u:system_r:tomcat_t:s0 tclass=tcp_socket

ポリシーモジュールの無効化・有効化・削除

追加したポリシーは、無効化したり、削除したりすることができます。

~]# semodule -d my_tomcat_policy    # 無効化
~]# semodule -e my_tomcat_policy    # 有効化
~]# semodule -r my_tomcat_policy    # 削除

以上です。

参考文献