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をより安全に使うための留意点を紹介する。