Next: 8 単純化ポリシー記述言語の仕様
Up: 7 例
Previous: 7 例
Contents
Subsections
デーモンの設定例として、単純化ポリシを用いてvsftpdを設定してみましょう。
ここでは、Anonymous ftpアクセスができるまでのポリシーを設定することを目
標にします。
デフォルトでは、vsftpdドメインはinitrc_tです。
initrc_tはetc/rc.d以下の起動スクリプト用ドメインです。vsftpdは、/etc/rc.d/init.d/vsftpd(ドメインはinitrc_t)によって実行され、ドメインを継承します。
しかし、以上の動作は安全ではありません。なぜなら、initrc_tは多くのアクセス権限を持っているからです。(/etc/selinux/seedit/src/policy/simplified_policy/initrc_t.aを御覧下さい)。
以下,カレントディレクトリは/etc/selinux/seedit/src/policyであ
り、permissiveモードに切替えていることを前提とします。
login: root
....
# newrole -r sysadm_r
# id -Z
root:sysadm_r:sysadm_t
# cd /etc/selinux/seedit/src/policy
# setenforce 0
また,シンタックスの詳細については、8を御覧下さい。
それではvsftpdにvsftpd_tドメインを与えてみましょう。
- 設定ファイルの作成
simplified_policy/vsftpd_t.aを作成します。
- ドメイン遷移の設定
simplified_policy/vsftpd_t.aに以下に示す内容を記述して下さい。
# simplified_policy/vsftpd_t.a
{
domain vsftpd_t;
domain_trans initrc_t /usr/sbin/vsftpd;
}
2行目でvsftpd_tドメインを定義しています。3行目でドメイン遷移を設定しています。ここで、親ドメインはinitrc_tであり、エントリポイントは/usr/sbin/vsftpdです。
設定を編集したら、makeコマンドを実行しなければなりません。これは設定の変
更をカーネルに伝えるためです(5.3を参照して下さい)。この
場合、以下の様にタイプします。
# make diffrelabel
多くの場合、make diffrelabelで十分です。
そして、vsftpdを再起動させてvsftpdのドメインをチェックします。
# /etc/init.d/vsftpd restart
# ps -eZ
...
root:system_r:vsftpd_t 13621 pts/1 00:00:00 vsftpd
...
以上のようにするとvsftpdドメインがvsftpd_tになったことを確認でき
ます。ドメイン遷移の設定がうまくいったことが分かりました。
vsftpdに関連したファイルの保護を行います。
vsftpdドメインに関連したファイルを保護したいなら、globalにおいてdenyするのが一番良い方法です。この方法を用いて/etc/vsftpdと/var/ftpを保護してみましょう。simplified_policy/globalに以下に示す文を加えて下さい。{と }の間に書き加えなければならないことに注意して下さい。
# In simplifed_policy/global
deny /etc/vsftpd;
deny /var/ftp;
そして以下のコマンドを実行して下さい。
# make diffrelabel
その結果、他のドメインが/etc/vsftpdや/var/ftpにアクセスしようとするなら、
明示的にアクセスを許可しなければなりません。
例:httpd_tが/etc/vsftpdを読みたい場合、allow /etc/vsftpd r;という文がhttpd_tに記述されていなければなりません。allow /etc r;では、/etc/vsftpdはアクセス許可されてません。重要なファイルを区別するにはdenyは有用です。
vsftpd_t用のデフォルトのアクセス権限は、simplified_policy/globalから継
承されています。ただ、それだけでは十分でなく、設定を追加しなければならな
りません。最も良い方法は、permissiveモードでvsftpdをテストしてSELinuxの
ログを参照し、どのようなアクセス権限が必要であるのかを見極めることです。
(この文章では過程については割愛しています。)
以下、vsftpd_t用ポリシです。
# simplifed_policy/vsftpd_t.a
1 {
2 domain vsftpd_t;
3 domain_trans initrc_t /usr/sbin/vsftpd;
4 # access to files related to vsftpd
5 allow /etc/vsftpd r,s;
6 allow /var/ftp r,s;
7 allowonly /var/log r,w,s;
8 # allow to communicate with syslog
9 allow dev_log_t r,w,s;
10 allowcom -unix syslogd_t;
11 # allow to use tcp 20 and 21
12 allownet;
13 allownet -connect;
14 allownet -tcp -port 20;
15 allownet -tcp -port 21;
16 #
17 allowadm chroot;
18 }
以上を記述した後に、以下のコマンドを実行して下さい。
# make diffrelabel
上の設定ファイルの中身を見てみましょう。
- 5行目から7行目
これらはvsftpdに関連するファイルにアクセスするための設定です。5行目と6行目で、vsftpd設定ファイルとftpのpublicディレクトリを読むアクセス権限を与えています。
7行目に注目して下さい。
allowonly /var/log r,w,s;
ここで、/var/log/xferlogに書き込み権限を与えたい場合、本来は以下の様にす
るのが最適です。
allow /var/log/xferlog r,w,s;
しかし、/var/log/xferlogは管理者によって消去されるかもしれません。ファイ
ルが再度生成された場合ラベル情報が失われてしまいます。
2よって、/var/log/xferlogのアクセスを制御できません。そのため、 allowonly /var/log r,w,sとしているのです。vsftpd_tは/var/log以
下にあるすべてのファイルに書き込み権限を与えています。しかし、子
ディレクトリにあるファイルには書き込み権限を与えていません。これ
は、allow /var/log r,w,s;よりは良いです。(この文は子ディレ
クトリも含めて/var/log以下の全てのファイルに書き込みアクセス権限
を与えることを意味しています)。/tmp、/var/runも同様にファイル単位
でのアクセス制御ができません。これらのディレクトリではファイルが
消去、再生成されるため、SELinuxのラベル情報が失われる可能性がるか
らです。
SELinuxについて十分な知識があるならallow file exclusive label;が使えます。これはSELinuxのファイルのタイプ遷移を設定します。消去、再生成されるファイルのアクセス制御設定ができます。詳細については8.8.1を御覧下さい。
- 9、10行目
syslogdで通信するためにあります。syslogdを用いて通信する場合は、この2行を必ず入れて下さい。
- 12行目から15行目
tcp20番ポートと21番ポートを使って通信します。
initrc_tは起動スクリプト(/etc/init.d/vsftpd)用のタイプです。initrc_tは
/etc/vsftpdへ読み込み権限を必要とします。しかし、このファイルへのアクセスはglobalにおいて拒否されています。よって、明示的にallowしなければなりません。
#add to simplified_policy/initrc_t.a
allow /etc/vsftpd r,s;
以上を書き加えたら、以下のコマンドを実行して下さい。
# make diffrelabel
permissiveモードにおいてテストをして、アクセスログを参照して下さい。denyが出力されていなければ、次にenforcingモードでも正常に動作するか確かめて下さい。
Yuichi Nakamura
2005-08-01