最終回 メールを守れ! セキュアなメールサーバ構築法SELinuxで強化するソリューション(3/3 ページ)

» 2005年05月13日 15時00分 公開
[佐々木 生弥(サイボウズ),ITmedia]
前のページへ 1|2|3       
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設定を精査せずに加えたりコメントアウトしている。精査せずにいると危ない設定が含まれる可能性があるので、本運用の前に十分に精査することを心がけてほしい。

enforcingモードでの運用

 SELinuxでは、実際の運用はenforcingモードで行なわれるため、メール送受信に必要なポリシーを追加したらenforcingモードで動作確認を行なおう。setenforceコマンドでenforcingモードに変更してから、メールクライアントからの送受信を確認する。enforcingモードで正常に送受信できれば、設定は完了だ。

 今回紹介したメール環境は、あくまでも一例で実際の運用ではSMTP Authなどのメール送信時認証も必要だろう。採用する認証技術が異なる場合でも、今回案内したフローでポリシーを追加できる。

 全4回に渡ってSELinuxの概念から実際の環境構築までを解説した。今回の連載ではポリシーの簡易設定について解説したが、外部からアクセスが可能な企業の重要なサーバにSELinuxを導入する場合は、少々手間だがリソースに独自のタイプを付与する方法をお勧めしたい。SELinuxは難しいと思われがちだが、ポリシー追加の要領さえ掴んでしまえば容易にセキュアなサーバを構築できる。今回の連載をきっかけにSELinuxにチャレンジしてみてはいかがだろうか。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ