【セキュアOS SELinux入門】第6回 最も簡単な設定方法

 Fedora Core 2のSELinuxでは,主要なサーバー・アプリケーションに関する設定があらかじめ用意されているものの,デフォルト(初期設定)では権限の設定が不十分なことから,きちんと動作しないアプリケーションがある。これに対処するには,ユーザーが設定を追加する必要がある。今回は,初期設定が不十分なアプリケーションを動作させるための,最も簡単な設定追加方法を紹介する。

ポリシーのソース・ファイルをインストールする

 Fedora Core 2でSELinuxの動作を設定するには,ポリシーのソース・ファイルをインストールする必要がある。「checkpolicy-1.10-1.i386.rpm」と「policy-sources-1.11.3-3.noarch.rpm」というRPMパッケージをFedora Core 2のインストールCD,またはFedora Coreのサイトから入手し,次のようにしてシステムにインストールする。

# rpm -ivh checkpolicy* policy-sources*

 インストールすると,/etc/security/selinux/src/policyディレクトリ内に,複数のディレクトリが展開される。これらが,ポリシーのソース・ファイルが収められたディレクトリである。中でも重要なディレクトリが,domainsディレクトリとfile_contextsディレクトリだ。

 domainsディレクトリには,「.te」という拡張子のファイルが複数存在する。これらのファイルには,TE(連載第2回参照)の設定が格納されている。つまり,「どのようなドメイン・タイプが存在し,これらのドメインがどのタイプにアクセスできるのか」という設定だ。file_contextsディレクトリには,「.fc」という拡張子のファイルが存在する。ここでは,「ファイルにどのタイプを付与するか」が設定されている。

ログに基づいて権限を追加する

 実はFedora Core 2に含まれるFTPサーバー・アプリケーション(vsftpd)では,初期設定のままではFTPでファイルを公開できない。なぜなら,vsftpdに付与された権限が不十分だからだ。そこで,vsftpdを例にして,必要な設定を簡単に補う方法を紹介する。

 設定を追加する前に,vsftpdがシステムにまだない場合は,次のようにネットワーク経由でインストールする。

# yum install vsftpd

続いて,vsftpdを起動する。

# chkconfig vsftpd on □
# /etc/rc.d/init.d/vsftpd start □

それから,vsftpdのドメインを確認する。

# ps -eZ □

 1752 system_u:object_r:ftpd_t /sbin/vsftpd /etc/vsftpd/vsftpd.cofn

赤字で表示したように,ftpd_tドメインで動作していることを確認しよう。

 続いて,ファイル転送のテストに使うファイル(test.txt)を作成する。

# echo "test" > /var/ftp/pub/test.txt

 test.txtにFTPでアクセスしてみる。ユーザー名は「Anonymous」,パスワードはなしでログインする。しかし,これでは,ログインには成功するもののファイル一覧に何も表示されず,ディレクトリの移動もできないため,先ほど作成したtest.txtファイルを入手できない。なぜならftpd_tドメインには,/var/ftpディレクトリ以下へのアクセス権限が付与されていないからだ。

 この状況を回避するには,ftpd_tドメインに対して,/var/ftpディレクトリ以下へのアクセス権限を与える必要がある。権限を与える最も簡単な方法は,アクセスが拒否されたときに記録されたログを調べて,足りない権限を追加するというものだ。その具体的な手順を示す。

(1) permissiveモードで不足している権限を調査する

 拒否されたアクセスを調査するために,permissiveモード(連載第5回参照)に切り替えて,動作テストを実施する。perimssiveモードで動作させれば,vsftpdが起動し終えるまでに拒否されたすべてのアクセスを把握できる。

 まず,permissiveモードに切り替える。

# setenforce 0
# getenforce
permissive

 再び,FTPでtest.txtにアクセスしてみると,今度はtest.txtをダウンロードできる。permissiveモードなので,アクセス拒否の場合でも,ログに記録されるだけである。ダウンロード自体は問題なく,実行できる。

 ログは,dmesgコマンドで閲覧できる。また,/var/log/messagesにも出力される。例えば,messagesを見てみると,下記のようなアクセス拒否のログが2つほど記録されているはずだ。このログの意味は,「/usr/sbin/vsftpd(ftpd_tドメインで動作)が,ftpという名前のディレクトリ(オブジェクト・クラスdir,タイプvar_t)に読み込み(アクセス・ベクターread)アクセスしようとして拒否された」というものである。

(2) audit2allowコマンドを用いて簡単に追加する

 それではアクセス拒否に基づいて設定を追加していこう。手順は,「audit2allowコマンドを用いてallow文を作成し,設定に追加する」となる。

・ allow文

 「allow文」という設定要素をポリシー・ファイルに記述すれば,ドメインに対してアクセス権限を付与できる。

allow文の書式は,

allow <ドメイン> <タイプ>:<オブジェクト・クラス> <アクセス・ベクター>;

である。

 さきほど拒否されたアクセスを許可するには,allow文の書式のドメイン,タイプ,オブジェクト・クラス,アクセス・ベクターに,ログで出力されたものを当てはめていけばよい。具体的には,

allow ftpd_t var_t:dir read;

となる。

・ audit2allowコマンド

 ただし,アクセス拒否のログに基づいて,手作業でallow文を書いていくのは面倒だ。アクセス拒否のログをallow文に自動変換するコマンド「audit2allow」を使うと,その手間が省ける。

 audit2allowコマンドの使い方は2通りある。一つは,「audit2allow -d」の実行。これにより,dmesgコマンドで出力されるログをallow文に変換できる。もう一つは,「audit2allow -i /var/log/message」の実行である。これにより,/var/log/messagesに出力されているログをallow文に変換できる。ただし,/var/log/messagesをallow文に変換すると,余計なログ(設定したいアプリケーションとは無関係のログ)が読み込まれた結果,余分なallow文が作成されることが多い。そのため,今回は,「audit2allow -d」を使用する。

# audit2allow -d
allow ftpd_t var_t:dir { read };
allow ftpd_t var_t:file { getattr read };
allow lvm_t lvm_etc_t:dir { create };

すると,上記の3つのallow文が作成されるが,vsftpdに対応する設定は上の2行である。これらを設定ファイルに追加する。

 追加方法は,/etc/security/selinux/src/policy/domainsディレクトリ内に,上記の内容を記述した,teという拡張子を持つファイルを作成してもよいし,/etc/security/selinux/src/policy/domains/program/ftpd.te(ftpに関連する設定が格納されているファイル)に追記してもよい。ここでは,ftpd.teファイルの末尾にこの2行を追記したとする。

(3) 設定を反映して,enforcingモードに戻す

 追記が終わったら,新たな設定をシステムに反映させる。それには,ポリシーを格納したディレクトリに移動してから,「make reload」コマンドを実行する。

# cd /etc/security/selinux/src/policy/
# make reload

 このコマンドは,テキスト形式のポリシー・ファイルをバイナリに変換し,カーネルに組み込まれたSELinuxモジュールに読み込ませるものだ。システムに反映させたら,enforcingモードに戻すのを忘れないようにする。

# setenforce 1
# getenforce
enforcing

 もう一度,FTPでアクセスしてみると,今度はtest.txtが閲覧できる。

・audit2allowコマンドの-lオプション

 最後に,audit2allowに用意されている,設定時に便利なコマンド・オプションを紹介する。

 上記のようにして設定作業を行った後,別の設定を追加したい場合,再度「audit2allow -d」を実行すると,前回に追加したallow文まで表示されてしまう。このdオプションに加え,-lオプションを付けて「audit2allow -d -l」と実行すると,「make reload」で設定を反映した後のログだけが読み込まれ,余計な設定が出力されなくなる。設定作業を頻繁に行う場合は,常に「-l」オプションを付けてaudit2allowを実行した方が,作業が楽になる。

 このように,拒否されたアクセスをひたすらaudit2allowコマンドで追加していけば,とりあえずシステム(使いたいサーバー・アプリケーション)を動作させることは可能だ。しかし,この方法だけだと,余計なアクセス権限を与えてしまうことがある。次回(7月27日公開予定)は,SELinuxをより安全に使うための留意点を紹介する。