SELinuxの初期設定 |
前回解説したように、Turbolinux 10 serverをインストールした直後は、SELinuxが無効な状態だ。SELinuxカーネルを有効化し、ファイルのタイプ付けを行なう必要がある。SELinuxカーネルの有効化、ファイルのタイプ付けは、こちらを参照してほしい。
ポリシーの追加に必要なアクセス拒否ログを採取する |
各プロセスに必要なアクセス権限を設定するため、アプリケーションのアクセス拒否ログを採取する。デフォルトの状態では、各プロセスに必要なアクセス権限が完全に設定されていないため、enforcingモードでメール送受信を行なうとエラーが表示される。SELinuxのモードをpermissiveに変更して、以下の操作を行ないアクセス拒否ログを採取しよう。
[SMTPサーバのアクセス拒否ログの採取] ・メールクライアントからのメール送信 [POP3サーバのアクセス拒否ログの採取] ・メールクライアントからのメール受信 |
ログをもとにしたポリシーの追加 |
audit2allowコマンドを使用し、セキュリティポリシーに違反したアクセス拒否ログをallow文に変換する。
# audit2allow -i /var/log/messages ↑ messagesファイルのログをもとにallow文に変換 : : ↓ postfixに関するallow文 ---------------------- allow postfix_cleanup_t file_t:dir { add_name search write }; allow postfix_local_t file_t:dir { search }; allow postfix_master_t file_t:dir { getattr read search }; allow postfix_master_t file_t:fifo_file { unlink }; allow postfix_master_t file_t:sock_file { unlink }; allow postfix_qmgr_t file_t:dir { add_name getattr read remove_name search write }; allow postfix_smtpd_t home_root_t:dir { search }; allow postfix_smtpd_t postfix_aliasdb_t:file { getattr lock read }; allow postfix_smtpd_t postfix_etc_t:file { write }; allow postfix_smtpd_t user_home_dir_t:dir { search }; allow postfix_smtpd_t user_home_t:file { getattr read }; : : ↓ inetdに関するallow文 ---------------------- allow inetd_child_t mail_spool_t:dir { getattr search }; allow inetd_child_t mail_spool_t:file { getattr lock read setattr write }; allow inetd_child_t selinux_config_t:dir { search }; allow inetd_child_t selinux_config_t:file { getattr read }; allow inetd_child_t shadow_t:file { getattr read }; allow inetd_child_t sysctl_t:dir { search }; allow inetd_child_t user_home_dir_t:dir { search }; allow inetd_child_t var_spool_t:dir { search }; : : |
audit2allowコマンドで出力されたallow文のうち、postfixに関するallow文は、メール送信時にアクセス拒否されたログが変換されたもので、inetdに関するallow文は、メール受信時にアクセス拒否されたログが変換されたものだ。上記のallow文を、/etc/selinux/strict/src/policy/domains/program 以下の.teファイルに追加する。
.teファイルへの追加は、該当するアプリケーションの設定ファイルに追加するのが望ましいが、異なるファイルにallow文を追加することもできる。例えば、postfix.teにinetdに関するallow文を追加しても動作上、問題はない。今回は、手順を簡略化させるために、postfix.teの末尾にすべてのallow文を追加する。
# cd /etc/selinux/strict/src/policy/domains/program # vi postfix.te : : ###メール送信時のallow文を追加 allow postfix_cleanup_t file_t:dir { add_name search write }; allow postfix_local_t file_t:dir { search }; allow postfix_master_t file_t:dir { getattr read search }; allow postfix_master_t file_t:fifo_file { unlink }; allow postfix_master_t file_t:sock_file { unlink }; allow postfix_qmgr_t file_t:dir { add_name getattr read remove_name search write }; allow postfix_smtpd_t home_root_t:dir { search }; allow postfix_smtpd_t postfix_aliasdb_t:file { getattr lock read }; allow postfix_smtpd_t postfix_etc_t:file { write }; allow postfix_smtpd_t user_home_dir_t:dir { search }; allow postfix_smtpd_t user_home_t:file { getattr read }; ###メール受信時のallow文を追加 allow inetd_child_t mail_spool_t:dir { getattr search }; allow inetd_child_t mail_spool_t:file { getattr lock read setattr write }; allow inetd_child_t selinux_config_t:dir { search }; allow inetd_child_t selinux_config_t:file { getattr read }; allow inetd_child_t shadow_t:file { getattr read }; allow inetd_child_t sysctl_t:dir { search }; allow inetd_child_t user_home_dir_t:dir { search }; allow inetd_child_t var_spool_t:dir { search }; |
audit2allowコマンドの注意点 |
permissiveモードで運用している場合、一度出力されたアクセス拒否のログは、しばらく経過しないと出力されないことがある。「-d」オプションでログの出力が不十分な場合は、「-i」オプションで /var/log/messages ファイルを指定するのも有効な方法だ。また、アクセス拒否のログが大量に出力された場合、一度に表示しきれないことがある。この場合は手間だが、「アクセス拒否ログの出力」→「allow文の追加」を何回か繰返して適切なポリシーを追加する必要がある。 |
allow文をpostfix.teに追加したら、/etc/selinux/strict/src/policy/ に移動し、make reload(追加したallow文をバイナリに変換)を実行する。このままmake reloadを実行すると、以下のエラーが表示されるはずだ。
# cd /etc/selinux/strict/src/policy # make reload : : assertion on line 232460 violated by allow inetd_child_t shadow_t:file { read }; make: *** [/etc/selinux/strict/policy/policy.18] Error 1 ↑バイナリファイルに変換時、エラーが表示される |
これは、/etc/selinux/strict/src/policy/assert.teファイルにて、タイプ(リソースに付与されるラベル)であるshadow_tが、neverallow文によって設定の制約を受けていることが原因だ。neverallow文は、設定ミスなどを防ぐために利用するもので、これを定義しておくことで設定に制約を設けることができる。make reloadを実行する前に、assert.teファイルの該当箇所をコメントアウトしておこう。具体的な場所は以下を参考にして欲しい。
# vi assert.te : : #neverallow { domain -auth -auth_write } shadow_t:file ~getattr; #neverallow { domain -auth_write } shadow_t:file ~r_file_perms; : : |
assert.teファイルを編集後に、maker reloadを実行する。今度は正常に実行されるはずだ。
ただし、1つ注意してほしいこととして、今回は手順を簡素化するために、audit2allowコマンドの結果やneverallow設定を精査せずに加えたりコメントアウトしている。精査せずにいると危ない設定が含まれる可能性があるので、本運用の前に十分に精査することを心がけてほしい。
SELinuxでは、実際の運用はenforcingモードで行なわれるため、メール送受信に必要なポリシーを追加したらenforcingモードで動作確認を行なおう。setenforceコマンドでenforcingモードに変更してから、メールクライアントからの送受信を確認する。enforcingモードで正常に送受信できれば、設定は完了だ。
今回紹介したメール環境は、あくまでも一例で実際の運用ではSMTP Authなどのメール送信時認証も必要だろう。採用する認証技術が異なる場合でも、今回案内したフローでポリシーを追加できる。
全4回に渡ってSELinuxの概念から実際の環境構築までを解説した。今回の連載ではポリシーの簡易設定について解説したが、外部からアクセスが可能な企業の重要なサーバにSELinuxを導入する場合は、少々手間だがリソースに独自のタイプを付与する方法をお勧めしたい。SELinuxは難しいと思われがちだが、ポリシー追加の要領さえ掴んでしまえば容易にセキュアなサーバを構築できる。今回の連載をきっかけにSELinuxにチャレンジしてみてはいかがだろうか。
Copyright © ITmedia, Inc. All Rights Reserved.