RedHat Enterprise Linux 5 ( RHEL5 ) で bind 9.4.1 の rndc を SELinux で許可する




RedHat Enterprise Linux 5 で bind 9.4.1 のソース RPM をダウンロードしてきて、
RPM パッケージを build してインストールしたところ、
bind 自体の動作は問題無いが、rndc が SELinux で拒否されて使えなかった。

Red Hat Linux Enterprise 5 ( RHEL5 ) で bind-9.4.1 の RPM パッケージをビルドする

そこで、SELinux の設定を変更して rndc の動作を許可するようにしてみる。

まず、設定変更前に rndc コマンドを実行した場合は次のようになる。

# rndc dumpdb
rndc: bind socket: permission denied

この時、/var/log/audit/audit.log には次のような内容が出力された。

type=AVC msg=audit(1184246605.720:105): avc: denied { node_bind } for pid=3263 comm="rndc" scontext=root:system_r:ndc_t:s0-s0:c0.c1023 tcontext=system_u:object_r:inaddr_any_node_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1184246605.720:105): arch=40000003 syscall=102 success=no exit=-13 a0=2 a1=b74e6230 a2=7e7210 a3=b74f4008 items=0 ppid=3197 pid=3263 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 comm="rndc" exe="/usr/sbin/rndc" subj=root:system_r:ndc_t:s0-s0:c0.c1023 key=(null)

また、/var/log/audit/audit.log は rndc コマンドのログだけが出力されるように、
次のコマンドであらかじめ空ファイルにしておきました。

# cp -p /var/log/audit/audit.log /var/log/audit/audit.log.bak
# cat /dev/null > /var/log/audit/audit.log

続いて、許可したいコマンドの拒否ログが出力されているログファイルを使用して、
ポリシーパッケージを作成します。

ここでは、ポリシーパッケージ名を rndc01 としました。

# audit2allow -M rndc01 -i /var/log/audit/audit.log
タイプ施行ファイルを生成中:rndc01.te
ポリシーをコンパイル中

chckmodule -M -m -o rndc01.mod rndc01.te
semodule_package -o rndc01.pp -m rndc01.mod

********************** 重要 **********************

新たに作成されたポリシーパッケージをカーネルにロードするためには、
次を実行する必要があります。

semodule -i rndc01.pp

次に上記出力の指示通り semodule コマンドを実行したいのですが、
実はsemodule コマンド自体が SELinux に拒否されて実行することができません。

一旦、SELinux を無効にしてシステムを再起動してから続けます。

RedHat AS4でSELinuxを有効/無効にする

# semodule -i rndc01.pp

これで rndc コマンド用に作成したポリシーパッケージがロードされたので、
再度 SELinux を有効にしてみます。

rndc コマンドが許可されているはずなので、実行してみると問題なく実行できます。

しかし、ここで問題発生。

今度は、klog が SELinux で拒否されるようになってしまいました。

こちらは解決できていないので、現在は SELinux を無効にしています。