晴耕雨読

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

SELinuxによるドメインに対する制限を無くす

SELinuxにはPermissiveモードという、アクセス拒否ログが出すけどアクセスは許可する、というものがあります。 システム全体をPermissiveにする方法の代わりに、特定のドメイン(プロセスに紐づくタイプ)だけをPermissiveにする方法もあります。

ドメインは ps -eZ でプロセス名の前にある *_t の部分で見ると、わかります。 Apache や Nginx は httpd_t、BIND は named_t など、それぞれ決まったタイプが割り当てられています。

例えば、Apacheが実行するドメイン httpd_t だけを Permissive にする場合は、semanage permissive コマンドを使用します。 実行したら、semanage permissive -l コマンドで登録できたか確認します。

~]# semanage permissive -a httpd_t
~]# semanage permissive -l

Builtin Permissive Types


Customized Permissive Types

httpd_t

続いて、Apacheのサービスを、デフォルトではアクセス拒否される3131番ポートで起動します。 http_port_t に 3131 が含まれていない状態で、httpd.conf を Listen 3131 に修正してから、Apacheを起動します。

~]# semanage port -l | grep http
http_port_t       tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
~]# grep ^Listen /etc/httpd/conf/httpd.conf
Listen 3131
~]# systemctl restart httpd

このとき、/var/log/audit/audit.log には httpd がポート3131番で起動することを拒否するログが出ます。

type=AVC msg=audit(0000000000.520:1607): avc:  denied  { name_bind } for  pid=9247 comm="httpd" src=3131 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=1

しかし、httpdは問題なく起動できています。

~]# systemctl status httpd
* httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running)

以上、特定のドメインだけをPermissiveにする方法でした。

/var/log/audit/audit.log に書かれたアクセス拒否ログから、例外ルールを作りたい場合は sealert コマンドの実行結果の提案 (suggests) を参考にしながら、ポリシーを修正していきます。

~]# sealert -l '*'

最後に、元に戻すために httpd_t の Permissive の設定を削除する場合は、-d オプションで実行します。

~]# semanage permissive -d httpd_t
libsemanage.semanage_direct_remove_key: Removing last permissive_httpd_t module (no other permissive_httpd_t module exists at another priority).
~]# semanage permissive -l
~]#

以上です。