まず、SELinux のアクセス制御の実際の動作をログに記録します。
そのために、まずは次のようにして SELinux を一時的に Permissive モードで動作させます。
setenforce Permissive
動作モードを変更したら、許可したいアクセスの一連の動作を実際にやってみます。
たとえば FTP 接続の許可設定の場合には、実際に FTP
へ接続してディレクトリ移動をし、ファイルをアップロードしてログアウトといった感じの流れでしょうか。
実際の操作を行うと、動作モードが Permissive なので、SELinux の制限を受けることなく動作を行うことが可能です。
そしてその動作の中で、本来 Enforce モードによって SELinux による制限を受けるアクセスがログに記録されています。
CentOS 5.4 環境の場合は、ログは "/var/log/audit/audit.log" に記録されるようです。他にも
/var/log/messages や dmesg に記録されている場合もあるようです。
このログファイルを次のように "audit2allow" へ通してあげれば、許可設定のためのコマンドを確認することができます。
audit2allow -i /var/log/audit/audit.log
このようにすることで、例えば次のような感じで許可設定コマンドが画面に出力されました。
#============= ftpd_t ==============
allow ftpd_t file_t:dir search;
allow ftpd_t user_home_t:dir { write remove_name search read add_name };
allow ftpd_t user_home_t:file { write getattr lock create unlink append };
#============= httpd_t ==============
allow httpd_t
amanda_port_t:tcp_socket name_bind;
allow httpd_t cert_t:file execute;
allow httpd_t httpd_config_t:file execute;
allow httpd_t
port_t:tcp_socket name_bind;
allow httpd_t reserved_port_t:tcp_socket
name_bind;
allow httpd_t soundd_port_t:tcp_socket name_bind;
allow
httpd_t transproxy_port_t:tcp_socket name_bind;
ここの中から必要なものを抜き出して設定して行くことになるのですが、グループ毎に設定ファイルを分けたい場合には、次のようにすると良いかもしれません。
grep ":ftpd_t:" /var/log/audit/audit.log | audit2allow
このようにすることで、例えば上記の場合には "ftpd_t" グループに関するログのみが対象となります。
許可設定のためのコマンドが確認できたら、それを SELinux に組み込むためのモジュールファイルの作成を行います。
具体的には、先ほどの許可設定のためのコマンドに "-M" オプションを付けて実行します。
grep ":ftpd_t:" /var/log/audit/audit.log | audit2allow -M ftpd
これで、"ftpd.pp" という名前のモジュールファイルが出来上がります。モジュールの設定内容は併せて生成された "ftpd.te"
ファイルで確認することができます。
モジュールファイルが出来上がったら、次のようにして SELinux へモジュールファイルを組み込みます。
semodule -i ftpd.pp
これで許可設定が有効になります。システムの再起動は特に必要ないようです。
なお、ここで組み込んだモジュールファイルは CentOS 5..4 の場合は
"/etc/selinux/targeted/modules/active/modules/" ディレクトリ内に格納されているようでした。
後は、次のように Enforce モードに変更して、正しくアクセスが行えることを確認します。
setenforce Enforce