next up previous contents
Next: 11 その他の注意点 Up: SELinux Policy Editor(seedit)管理ガイド(マニュアル) 2.1 Previous: 9 ポリシーを追加する   Contents

Subsections


10 新たにドメインを作成する

seeditでのポリシーの書き方を覚える最も良い方法は、新たなドメインを作成す る設定を試すことです。vsftp FTPサーバにftpd_tドメインを付与する実例を元 に、見ていきましょう。
新たなドメインを作成、設定する場合の手順は一般的に次のようになります。
  1. テンプレートとなる設定を作成
  2. ドメインが正しく付与されることを確認
  3. テスト動作とポリシーの追加
vsftpdをインストールしていない場合は、以下でインストールします。
#yum install vsftpd


10.1 GUIから新規ドメインを設定

vsftp_t ドメインを作成し、Anonymous FTPサーバとして動作するのに必要な設 定をします。

10.1.1 テンプレートを作成

ドメイン管理GUIを使うことで、新規ドメインを設定できます。コントロールパ ネルから、ドメインを管理を選択します。
vsftpdにvsftpd_tドメインを割り当てます。 図13のように設定します。
まず、実行ファイルの名前を指定します。「/usr/sbin/vsftpd」を入力します。
ドメイン名として、「vsftpd_t」を入力します。
あとは、いくつかの質問に答えます。デーモン用のドメインを作成するには、 「デーモンプログラムですか?」の「はい」を忘れないようにします。

 テンプレートを作成ボタンを押すと、作成されたテンプレートに 設定が生成されます。

Figure 13: 新規ドメイン作成画面
Image template
ちなみに、対象アプリをrpmパッケージでインストールしている場合は、「必要 なポリシを推測」ボタン使うことで、時間を節約できます。このボタンを押すと、 rpmパッケージの情報を参照することで、ある程度必要なポリシが生成されます。 今回の例の場合、
allow /etc/pam.d/vsftpd r,s;
allow /etc/vsftpd/** r,s;
allow /usr/sbin/vsftpd r,s;
allow /var/ftp/** r,s;
といったポリシが生成されます。

10.1.2 アクセスすると分かっている設定を追加

アプリケーションについての知識がある場合、あらかじめどんなアクセス権限 が必要か分かっていることも多いです(分かってない場合は、後からポリシ生成 ツールで追加できます)。その場合、この画面から追加可能です。

今回は、 Anonymous FTPサーバを構築しますので、公開ディレクトリ(/var/ftp 以下)への読み込み権 限が必要ですし、21番ポートを使う権限が必要です。
これらの設定は「ポリシーを追加」ボタンを使って追加できます。 図14では、/var/ftpディレクトリ以下への読み込みアクセス を設定してます。図15では,TCP21番ポートを使ってサーバー として振る舞うことを許可しています。追加 ボタンを押すと、

allow  /var/ftp/** r,s;
allownet -protocol tcp -port 21 server;
のような設定が追加されます。追加したい設定を全て追加したら、「セーブし、 設定を適用」ボタンを押します。

Figure 14: ファイルアクセス制御の設定追加
Image add-file

Figure 15: ネットワークアクセス制御設定追加
Image add-network

10.1.3 ドメインの確認

Permissiveモードに切り替え、vsftpdを起動し、そのドメインが「vsftpd_t」 であることをステータスツールなどで確認します。

10.1.4 テスト動作とポリシーの追加

vsftpdをpermissiveモードでテスト動作させます。テスト動作を通じて、必要な権限を洗い出すため です。

以下のコマンドでは, Anonymous ftpでファイル転送できることを確認してます。

#echo "test">/var/ftp/pub/test.txt
(テスト用のファイル作成)

$ ftp localhost
Name (localhost:ynakam): Anonymous
Password: <なんでもOK>
> cd /var/ftp/pub
> get test.txt

ここで、ログを見てみると(auserch -m AVCで見ることが出来ます)、様々なア クセスログが出ていることが分かります。ポリシー生成ツールでこれらを許可す る設定を追加していきます。 ポリシーを生成 をコントロールパネルから選択すると、図 16のような画面が開きます。 通常は、デフォルトの設定のまま「ポリシーを生成」ボタンを押します。 図 17のように結果画面が開きます。 追加したい設定についてはチェックボタンを押します。ディレクトリ丸ごとアク セス許可をしたい場合は「まとめて指定」を使います。 今回の場合は、/etc/vsftpdディレクトリにまとめて設定を許可したほうが効率 がいいので、/etc/vsftpd/vsftpd.confのところで、「まとめて指定」ボタンを 使います。 ファイル名は、 /etc/vsftpd/vsftpd.conf $\rightarrow$ /etc/vsftpd/* $\rightarrow$ /etc/vsftpd/**のように変わっていきます

さて、今回の例では図 18のような設定が追加さ れることになります。 セーブし設定を適用 を押して設定を反映します。
再度vsftpdの動作確認をして、ポリシ生成ツールを使います。何も設定が生成さ れなくなったら、次はEnforcingモードでテストします。もし動作すれば、設定 はおしまいです。そうでなければ、生成ツールでポリシを追加し、再度テストし ます。テスト、ポリシの生成をアプリケーションがEnforcingモードで動作する まで繰り返します。

Figure 16: Policy Generate tool
Image vsftpd-generate

Figure 17: Policy Generate result
Image vsftpd-generate-result

Figure 18: Before save
Image vsftpd-generate-save

10.2 コマンドラインからドメイン作成

10.2.1 テンプレートとなる設定を作成

seedit-templateコマンドを使うことで、テンプレートとなる設定を作成できま す。書式は以下です。
seedit-template -d <ドメインの名前> -e <実行ファイル名> -o <出力>
今回は、ドメインの名前は「ftpd_t」で、実行ファイルは「/usr/sbin/vsftpd」 ですので、 以下のように実行します。コマンドと実行結果を示します。
# seedit-template -d vsftpd_t -e /usr/sbin/vsftpd
{
domain ftpd_t;
program /usr/sbin/vsftpd;
include common-relaxed.sp;
include daemon.sp;
include nameservice.sp;
}
テンプレートとなる設定が生成されています。/usr/sbin/vsftpdにftpd_tを付 与しています。 include から始まる行で、一般的なデーモンプログラムに必要な権限が 与えられます。 この設定を、 /etc/seedit/policy/ftpd_t.spに保存します。 ファイル名は、必ず「ドメイン名.sp」である必要があります。さもないと、設 定反映時にエラーが出ます。

10.2.2 ドメインが正しく付与されることを確認

設定の反映には、次のコマンドを使います。
#seedit-load
なお「-v」をつけると詳細な経過を見ることができます。
また、permissiveモードに切り替える必要があります。 ftpd_tにアクセス許可する設定をしていませんので、vsftpdが起動しようとし てもenforcingモードではアクセス拒否のため失敗するからです。
#setenforce 0
#getenforce
Permissive
vftpdを起動して、seedit-unconfinedコマンドでvsftpdのドメインを確認します。
# /etc/init.d/vsftpd restart
# seedit-unconfined -e
10530   vsftpd  Confined by ftpd_t
上のようにvsftpdにftpd_tドメインが付与されていることと思います。

10.2.3 テスト動作とポリシーの追加

さて、次はpermissiveモードでアプリケーションをテスト動作させます。 そして、audit2spdlでどんな権限が足りないのかを洗い出します。 ここでは、vsftpdがAnonymous FTPサーバとして動作するのに必要な権限を洗い 出すことにします。
テストのために、以下のようにftpサーバにAnonymousとしてログインします。
# touch /var/ftp/pub/test.txt
↑ テスト用のファイルを作成
$ ftp localhost
Name (localhost:ynakam): Anonymous
Password: <anything is OK>
#以下、pub/test.txtをダウンロードしている
ftp> ls
ftp > cd pub
ftp > get test.txt
ftp > quit

ログを閲覧します。 以下、auditdサービスが起動しているという前提で話を進めます。 auditdサービスが起動していない場合は、audit2spdl -alを-dlに置き換えて読 んでください。

#auserch -m AVC 
↑/var/log/audit/audit.logのログを閲覧するコマンドです。
様々なアクセス拒否が出ていると思います。
audit2spdlを使ってみましょう。

#audit2spdl -al
-------------------------
#SELinux deny log:
audit(1146179470.043:86): avc:  denied  { search } for  
pid=10904 comm="vsftpd" name="vsftpd" dev=hda3 ino=584772 
scontext=user_u:system_r:ftpd_t 
tcontext=system_u:object_r:etc_t tclass=dir
#Suggested configuration
File ftpd_t.sp:
allow /etc/vsftpd  s;
-------------------------
-------------------------

#SELinux deny log:
type=AVC msg=audit(1148486747.277:30): avc:  denied  
{ append } for  pid=11761 comm="vsftpd" name="xferlog" 
dev=hda3 ino=163412 scontext=user_u:system_r:ftpd_t
tcontext=system_u:object_r:var_log_t tclass=file
#Suggested configuration
File ftpd_t.sp:
allow /var/log/xferlog  w,r,s;
-------------------------
.....
様々な設定を追加しなければならないことが分かると思います。 なお、以下のように「#」から始まる行が提示されることがあります。
-------------------------
#SELinux deny log:
type=AVC msg=audit(1148486754.718:36): avc:  denied  { lock } for  
pid=11763 comm="vsftpd" name="test.txt" dev=hda3 ino=163311 
scontext=user_u:system_r:ftpd_t tcontext=system_u:object_r:default_t
 tclass=file
#Suggested configuration
File ftpd_t.sp:
#Failed to generate, because failed to obtain fullpath.
#allow test.txt  r,s;
-------------------------
これは、audit2spdlがtest.txtのフルパスを発見することに失敗したため、先頭 に#がついています。しかし、test.txtのフルパスは、/var/ftp/pub/test.txtで あることを読者は知っているので、
allow /var/ftp/pub/test.txt  r,s;
を追加すればいいことが分かります。 筆者の環境では、以下のような設定が提示されました。
allow /etc/vsftpd  s;
allow /var/log/xferlog  w,r,s;
allow /var/ftp/pub  s;
allow /var/ftp/pub/test.txt  r,s;
allownet -protocol tcp -port 21 server;
allow /etc/vsftpd/vsftpd.conf  r,s;
allowpriv cap_sys_chroot;
allow /var/ftp  s;
allow /var/log/xferlog  r,s;
これをそのまま追加してもいいのですが、冗長な設定があります。 例えば、/var/ftp、/etc/vsftpdはディレクトリ全体を読み込み許可すれば冗長 な設定を削れます。冗長な設定を削ると、ftpd_t.spは結局以下のようになりま す。

{
domain ftpd_t;
program /usr/sbin/vsftpd;
include common-relaxed.sp;
include daemon.sp;
include nameservice.sp;
# added by audit2spdl suggestion
allow /etc/vsftpd/**  r,s;
allow /var/ftp/**  r,s;
allow /var/log/xferlog  r,w,s;
allownet -protocol tcp -port 21 server;
allowpriv cap_sys_chroot;
}
さて、seedit-loadコマンドで設定を反映し、vsftpdを再起動して、再度動作テ ストをしてみましょう。audit2spdl -alすると、 さらに以下のような設定が提示されるかもしれません。
allownet -protocol tcp -port 6353 server;
これは、vsftpdがTCP 6553ポートを使ってサーバーとして振る舞おうとしている ことを言っています。が、ポート番号は毎回変わります。なので、以下のように 1024以上のポートを使えるよう設定します。
allownet -protocol tcp -port 1024- server;
設定を反映し、さらにテスト動作を、アクセス拒否がでなくなるまで繰り返しま す。最後にenforcingモードにして、テストをして正しく動作することを確かめ ます。
#setenforce 1
さて、ここまでの加方法で、概ね設定できるかと思います。 ログインユーザのセキュリティを高めるための機能として、SPDLはRBACもサポー トしています。RBACについては、「RBACガイド」を参照 してください。


next up previous contents
Next: 11 その他の注意点 Up: SELinux Policy Editor(seedit)管理ガイド(マニュアル) 2.1 Previous: 9 ポリシーを追加する   Contents
Yuichi Nakamura 2007-02-13