next up previous contents
Next: 8 単純化ポリシー記述言語の仕様 Up: 7 例 Previous: 7 例   Contents

Subsections

7.1 vsftpdの設定

デーモンの設定例として、単純化ポリシを用いて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を御覧下さい。

7.1.1 vsftpd用ドメインの作成

それではvsftpdにvsftpd_tドメインを与えてみましょう。
  1. 設定ファイルの作成
    simplified_policy/vsftpd_t.aを作成します。
  2. ドメイン遷移の設定
    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です。

7.1.2 ドメイン遷移テスト

設定を編集したら、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になったことを確認でき ます。ドメイン遷移の設定がうまくいったことが分かりました。

7.1.3 vsftpdに関連したファイルの保護

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は有用です。

7.1.4 vsftpd_tへのアクセス権限の付与

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
上の設定ファイルの中身を見てみましょう。

7.1.5 initrc_tへのアクセス権限の付与

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

7.1.6 再テスト

permissiveモードにおいてテストをして、アクセスログを参照して下さい。denyが出力されていなければ、次にenforcingモードでも正常に動作するか確かめて下さい。



Yuichi Nakamura 2005-08-01