SELinux Policy Editor チュートリアル
著:日立ソフトウェアエンジニアリング株式会社
Ver1.0対応アップデート 2005年7月15日: 中村 雄一 <ynakam@gwu.edu>

 この文書はSELinux Policy Editorのチュートリアルです。SELinuxのセキュリティモデルについて述べたあと、SELinux Policy Editorを使った設定方法の例を示し、最後にログの見方を示します。適宜SELinux Policy Editorのマニュアルを参照してください。

1       SELinuxのセキュリティモデル
1.1              ラベルベースのアクセス制御

 SELinux では、全てのプロセスにはドメインと呼ばれるラベルがついています。また、全てのリソース(ファイルだけではなくネットワークソケットやポートも含まれま す)にはタイプと呼ばれるラベルがついています。SELinuxでは、ドメインがタイプに対して持つパーミッションを付与することで設定を行います。ドメ イン、タイプともに「_t」という名前で終わらなければなりません。

図 1.1に一例を示します。httpdがホームページに対してアクセスできるように設定を行った場合です。/usr/sbin/httpdには httpd_tというドメインが付与されています。また、/var/wwwには、contents_tというタイプが付与されています。そして、 httpd_tは contents_tに対して「read」というパーミッションを与えられています。ここでドメインラベルはプロセスの持つ権限を表していると考えると分 かりやすいと思います。デフォルトではドメインはパーミッションを何も持っておらず、ドメインがアクセスできるリソースラベルとパーミッションを一つ一つ 指定していくことで設定を行っていきます。これにより、全てのプロセスが必要最小限の権限を持って動くことになり、攻撃による被害を最小限にすることがで きます。

image001.gif

図 1.1 ラベルベースのアクセス制御の例

なお、SELinuxのアクセス制御は通常のLinuxのパーミッションと両立しています。SELinuxのアクセス制御とLinuxのパーミッションの 両方で許可されてはじめてアクセスできることに注意してください。
 
1.2              プロセスへの権限の割り当て(ドメイン遷移)
プロセスにドメインラベルを割り当てる際にはドメイン遷移という方法を使います。ドメイン遷移とは、Linux のsetuidに近い概念です。SELinuxでは、プロセスが子プロセスを起動した場合そのドメインは親プロセスと同じですが、設定により、子プロセス のドメインを変えることができることができます。これをドメイン遷移といいます。設定は次のように行います。

「ドメインAで動作するプロセスが、プログラムXを実行すると、XはドメインBで動作する」

ここで、ドメインが遷移するきっかけとなるプログラムXのことをエントリポイントと呼びます。

具体例を示します。
例1:init プロセスはinit_tというドメインを持って動作します。init_tドメインのプロセスが、/etc/rc.d以下のスクリプト(Linux起動スク リプト)を実行すると、子プロセスはinitrc_tドメインで動作します。
例2:xinetd は、xinetd_tというドメインで動作しています。それが/sbin/in.telnetdを実行すると、子プロセスは「rlogind_t」という ドメインで動作します。

 その他の例はSELinux Policy Editorの「ドメイン遷移の設定」画面を見てください。このようにしてSELinuxではドメイン遷移を次々と繰り返すことでプロセスにドメインを割 り当て、特定のプロセスに権限が集中することを防いでいます。

1.3              ユーザの役割分担(RBAC)

 SELinux のユーザはロールと呼ばれる権限を持っています。これをRBAC(Role-Based Access Control)と呼びます。ロール名は「_r」という名前で終わらなければなりません。

 例えば、SELinux Policy Editorのデフォルト設定では、ログイン時にrootユーザはsysadm_r、secadm_rというロールを選ぶことができます。 sysadm_rを選ぶとLinuxシステム管理者、secadm_rを選ぶとSELinuxセキュリティ管理者としてログインします。そして、ユーザ シェルは_rを_tに変えたドメインを持って動作します。すなわち、sysadm_rでログインした場合、ユーザシェルはsysadm_tというドメイン で動作します。

 SELinux Policy Editorを使った場合はロール名に対してアクセス権の設定を行います。ユーザシェルはそのロールに設定した権限を持って動作します。

なお、ユーザがあるロールを持ってログインするためにはあらかじめSELinux Policy Editorの「ユーザとロールの関連付け」で設定する必要があります。

2       設定の大きな流れ

 SELinux Policy Editorを使った設定は大きく以下のステップに分かれます。
(1)  ドメイン(ロール)を作成する。
(2) 一旦設定を反映し, ドメイン遷移設定を行う。
(3) ドメインのチェック
(4)  プログラムを実際に動かして、ログをチェックする。設定が正しくない場合、アクセスが拒否されたログが出力されるはずである。
ログの見方は5章参照。
(5)  ドメイン(ロール)に必要なアクセス許可を与える。
(6)  ユーザとロールを関連付ける(ロールの設定の場合)
(7)  設定を反映する
(8) 再度テスト。ログが出なくなったらenfocingモードに切り替え。 

設定を行う際は、root, sysamd_tでログインし,permissive モードで行います。
rootでログインし,ロールを確認します。
# id -Z
root:sysadm_r:sysadm_t
上のようにならないときは
# newrole -r sysadm_r
とします。
permissiveモードへの切り替えは以下のようにします。
# setenforce 0

3    設定例1(vsftpd)
 設定の例として, vsftpdの設定をする例を示します。vsftpdには「vftpd_t」という名前のドメインを割り当てるとします。
Fedora Core4 を前提としていますので、他のディストリビューションの場合はパスが異なるかもしれません。
他のデーモンプログラムの場合も設定方法も同様なので参考にして下さい。

3.1             ドメイン作成
BINDはデフォルトで,設定が用意されていません。
試しにBINDを起動してみます。
# /etc/init.d/vsftpd start
# ps -eZ
root:system_r:initrc_t           2521 ?        00:00:00 vsftpd
initrc_tドメインで動作しています。これは,デーモンのためのデフォルトのドメインです。
多くの権限を持っているため,このドメインで動作させるのは望ましくありません。
独自のドメイン「vsftpd_t」をvsftpdに割り当てましょう。

 「新規ドメイン作成」画面で、新規ドメイン/ロール名に「vsftpd_t」と入力し、「作成」ボタンを押します。
 
3.2             ドメイン遷移設定
 次に作ったドメインをプログラムと関連付けます。「ドメイン遷移設定画面」を選択します。vsftpd は、/etc/rc.d/init.d以下のスクリプトから起動するので、vsftpdの遷移元のドメインは、「initrc_t」になります。そこで、 「遷 移を追加」ラジオボックスを選択したのち、「initrc_t」をクリックします。右の画面で、ドメイン名:「vsftpd_t」、エントリポイント 「/usr/sbni/vftpd」を入力し、「適用」ボタンをクリックします。これでvsftpは
vsftpd_tドメインで起動するようになります。

3.3           ドメイン遷移設定の確認
設定を行った場合は,必ず設定を反映し,カーネルに読み込ませる必要があります。
トップメニューに移動し、「設定を反映する」→「設定をカーネルに読み込ませるとともに,新規ラベル付けしたファイルのみタイプを付与 する」
を押します。設定の反映は通常はこのボタンを使えば十分です。

その後,namedを再起動し,ドメインを確認します。
#/etc/init.d/vsftpd restart
#ps -eZ
root:system_r:vsftpd_t           4396 pts/1    00:00:00 vsftpd

vsftpd_tドメインが割り当てられていることが分かります。

しかし,enforcingモードに切り替えてvsftpdを動作しても動きません。
アクセス権限が足りないためです。
デフォルトでvsftpd_tドメインが持つ権限は,「global」ドメインで許可されている権限だけです。
一部のファイルの読み込み権限ぐらいしかありません。
アクセス権限を与える設定が必要になってきます。

3.4      パーミッション付与
vsftpd に、アクセスする必要のあるリソースへのアクセス権を与えます。
なお、普通は「アクセスする必要のあるリソース」を全て知ることはできません。
現実には、 permissiveモードでプロセスを動かし、ログを見てアクセスする必要のあるリソースを判別します。

(1)    ファイルACL 設定
(a)   守りたいファイルを指定する
「ACL設定」→「globalを選択」→「ファイルACL」を選択します。
/var/ftp,deny
/etc/vsftpd, deny (/etc/vsftpdに移動し「デフォルト」denyチェックが楽です)
をチェックします。これで,vsftpd関連ファイルに誰もアクセスできなくなります。
globalドメインとは,全てのドメインに引き継がれるデフォルトの権限です。
そのプロセス専用に使うファイルがある場合は,globalドメインで禁止しておけば,
他のドメインがデフォルトでアクセスできないことを保証できます。
globalドメインで禁止されたアクセス権限は,他のドメインで明示的に許可しない限り,
他のドメインに許可されることはありません。

(b)    必要なファイルへのアクセス権付与
・「ACL設定」→「namedを選択」→「ファイルACL」を選択します。
  ・/etc/vsftpd,に「r」をチェックします。
  ・/var/ftpに,"r"をチェックします。
  ファイルアップロードを許す場合はそのディレクトリへの書き込み権限も与えます。
      ・/var/logに「r,w」,「子ディレクトリに適用」→「no」をチェックします。
※注:/var/logにある他のファイルにも書き込めてしまいます。/var/log/xferlog単体にアクセス制御し うようとしても,ログのローテートなどでinodeが変わり,普通に設定してはうまくいきません。/var/log/xferlog単体に書き込み権限を 与えたい場合は,「動的ラベル付けの定義」が必要になってきます。ここでは簡単のため,「動的ラベルの定義」を使いません。書き込み範囲を最小限にするた め,「子ディレクトリに適用」→「no」としています。

(3)    ネットワークACL設定
ネットワークACLを選択し、「ネットワーク利用許可」、「ネットワーク接続許可」をチェックし、「Well -knownポートの予約」にtcp,udp の20,21を入力します。

(4)   syslogとの通信に必要な設定
vsftpdはsyslogと通信します Syslogと通信するドメインの設定方法は決まっていて、
・「ネットワークACL設定」→unixドメインソケット、にsyslogd_tを選択する。
・「ファイルACL設定」→/dev/logにr,w権限を与えます。/dev/logは、/devの下の動的ラベル付けファイルのと ころにあり、「dev_log_t」という名前がついています。

(5) chrootの利用
    ・「管理権限設定」→「chrootシステムコールの利用」をチェックします。

(6)initrc_tの設定 
initrc_tは、起動スクリプトのためのドメインです。デーモン関連ファイルへのアクセスを要求することが多いです。
 ・「ACL設定」→「namedを選択」→「initrc_t」を選択します。
 ・/etc/vsftpdに「r」をチェックします。

3.5      設定の反映
トップメニューに移動し、「設定を反映する」→「設定をカーネルに読み込ませるとともに,新規ラベル付けしたファイルのみタイプを付与 する」を押します。
警告が表示されますが,無害なものです。
 
3.6     動作テスト
動作テストをします。ログが出なければenforcingモードでテストします。
# setenforce 1
ブート時からenforcingモードにする場合は,
/etc/selinux/configを
SELINUX=enforcing
とします。

このほか,ユーザーごとにftpログインしたい場合は,
/etc/shadowの読み込み権限を与える必要があります。
ちなみに,”/sbin/unix_chkpwd”にドメインを与えれば
vsftpdに/etc/shadowの読み込み権限を与えずにすみます。

4     設定例2(BIND)

 高度な設定の例として, BIND(/usr/sbin/named) の設定をする例を示します。bindには「named_t」という名前のドメインを割り当てるとします。

4.1             ドメイン作成
「新規ドメイン作成」画面で、新規ドメイン/ロール名に「named_t」と入力し、「作成」ボタンを押します。
 
4.2             ドメイン遷移設定
 次に作ったドメインをプログラムと関連付けます。「ドメイン遷移設定画面」を選択します。bind は、/etc/rc.d/init.d以下のスクリプトから起動するので、bindの遷移元のドメインは、「initrc_t」になります。そこで、「遷 移を追加」ラジオボックスを選択したのち、「initrc_t」をクリックします。右の画面で、ドメイン名:「named_t」、エントリポイント 「/usr/sbin/named」を入力し、「適用」ボタンをクリックします。これで、bindはnamed_tドメインで起動するようになります。

4.3           ドメイン遷移設定の確認
トップメニューに移動し、「設定を反映する」→「設定をカーネルに読み込ませるとともに,新規ラベル付けしたファイルのみタイプを付与 する」

namedを再起動し,ドメインを確認します。
#/etc/init.d/named restart
#ps -eZ
root:system_r:named_t            2782 ?        00:00:00 named
named_tドメインが割り当てられていることが分かります。

4.4      パーミッション付与
 BIND に、アクセスする必要のあるリソースへのアクセス権を与えます。
(1)    ファイルACL 設定
(a)    設定ファイルを守る
「ACL設定」→「globalを選択」→「ファイルACL」を選択します。
/var/named,denyをチェックします。これで,named関連ファイルに誰もアクセスできなくなります。

(b)    必要なファイルへのアクセス権付与
・「ACL設定」→「namedを選択」→「ファイルACL」を選択します。
  ・/var/named,に「r」をチェックします。
  ・/var/named/chroot/var/runに,r,wをチェックします。
  セカンダリサーバとして使う場合は,ゾーンファイルへの書き込み権限も与えます。

(3)    ネットワークACL設定
ネットワークACLを選択し、「ネットワーク利用許可」、「ネットワーク接続許可」をチェックし、「Well -knownポートの予約」にtcp,udp の53,953を入力します。

(4)   syslogとの通信に必要な設定
・「ネットワークACL設定」→unixドメインソケット、にsyslogd_tを選択する。
・「ファイルACL設定」→/dev/logにr,w権限を与えます。/dev/logは、/devの下の動的ラベル付けファイルのと ころにあり、「dev_log_t」という名前がついています。

(5) chrootの利用
    ・「管理権限設定」→「chrootシステムコールの利用」をチェックします。

(6)initrc_tの設定 
 ・「ACL設定」→「namedを選択」→「initrc_t」を選択します。
 ・/var/named に「r 」をチェックします。
・/var/named/chroot/etc/localtime に「r,w」をチェックします。
・「管理権限設定」→「chrootシステムコールの利用」をチェックします。
#セキュリティを高めたい場合は,起動スクリプトの中で使われているコマンド個々のドメインを分けます

4.5      設定の反映
トップメニューに移動し、「設定を反映する」→「設定をカーネルに読み込ませるとともに,新規ラベル付けしたファイルのみタイプを付与 する」を押します。
 
4.6     動作テスト
動作テストをし,ログを確認します。
怪しいログが出ていないようなら,enforcingモードでテストします。

5       ログの見方

注意:この章はまだアップデートされていませんが,参考にはなると思います。

5.1             基本

SELinuxでは、アクセスが拒否された場合カーネルのメッセージとしてログが出力されます。デフォ ルトでは/var/log/messagesにログが出力されます。ログの例を示します。

avc:  denied  { read } for  pid=8903 exe=/bin/cat path=/var/www/html/index.html

dev=08:01 ino=131308 scontext=root:sysadm_r:sysadm_t

tcontext=system_u:object_r:var_www_t tclass=file

5.1 ログの例


様々 な情報がありますが、全てのログに共通する情報は赤く示してあります。赤く示したフィールドについて説明します。

-       { 操作名 }:拒否された操作を表します。この場合は、「read」という操作が拒否されています。

-        scontext:リソースにアクセスしようとしたドメインを示します。

-         tcontext:リソースについたラベルを示します。

-        tclass:リソースの種別を表します。


5.1の 場合、ドメイン「sysadm_t」を持ったプロセスが、「var_www_t」というラベルのついた「file」への「read」アクセスが失敗したと いう意味になります。設定をする場合は、ドメインsysadm_tにvar_www_tへの「read」アクセス権を与えなくてはならないということが分 かります。このようにしてSELinuxではドメインに必要なアクセス権を判別し設定していきます。もちろん、拒否された操作が本当に必要な操作なのかきちんと見極める必要が あります。

ただ し、SELinuxに相当精通した人でなければこのログを見ただけでは設定をすること は難しいかもしれません。そこで、以降はどのようなログがでたらどんな設定をすればよいかをSELinux Policy Editorの設定項目に沿って説明していきます。

 

5.2       ファイルACL

 ファイルに関する設定が不足している場合はファイルへのアクセスが拒否されたと いうログが出力されます。5.2に ログの例を示します。

 

avc:  denied  { read } for  pid=8903 exe=/bin/cat path=/var/www/html/index.html

dev=08:01 ino=131308 scontext=root:sysadm_r:sysadm_t

tcontext=system_u:object_r:var_www_t tclass=file

5.2 ファイル関連のログの例

赤い 部分がファイルに関連するログの特徴です。sysadm_tドメインの /var/www/html/index.htmlへの読み込みアクセスが拒否されていることが分かります。

ここ で注意すべきは、「path」 が示すのはマウントポイントからのパスになっていることです。例えば/usr/localにファイルシステムがマウントされている場合、「path」を見 ただけでは「/var/www/html」なのか「/usr/local/var/www/html」なのか分かりません。どのファイルシステムなのかは 「dev」のフィールドを見れば分かります。「dev=08:01」というのはマウントされているパーティションのメジャー番号とマイナー番号です。メ ジャー番号・マイナー番号とマウントポイントの対応は/proc/partitions、/etc/mtabを見れば分かります。

5.1にSELinux Policy Editorで許可すべきパーミッションとログの特徴を示します。この表を参考にして与えるべきパーミッションを決めてください。

 

5.1SELinux Policy Editorで許可すべきパーミッションとログの特徴(ファイル)

許可すべきパーミッション

ログの特徴

{}に、read lock unlock ioctlが表示

{}に、write append create setattr addname unlink link renameが表示

{}にexecute execute_no_transが表示

{}にsearch getattrが表示

 

上の ログの場合、sysadm_tというドメインに /var/www/html/index.htmlへの読み込み権を与えればよいということになります。SELinux Policy Editorではsysadm_tはsysadm_rロールがログインした時のユーザシェルのドメインなので、sysadm_rというロールに対して /var/www/html/index.htmlの読み込み権を与えます。


5.3             ネットワーク

 ネットワーク関係の操作が拒否された場合、様々なログが出力されます。SELinux Policy Editorでどんなパーミッションを許可すればよいか、5.2に 示します。

 

 5.2許可すべきパーミッションとログの特徴(ネットワーク)

許可すべきパーミッション

ログの特徴

ネットワークソケットの使用許可

netif=eth0、 tclass=tcp_socket(udp_socket)

Rawソケットの使用許可

{net_raw}

Wellknownポートの予 約/予約されていないWell-knownポート全ての利用を許可/他ドメインで予約されたポートの予約をする

{ name_bind }、port=xxx、tclass=tcp_socket(udp_socket)というエントリがあった場合、xxx番のtcp/udpポートの使用 が拒否されています

 

5.4             プロセス間通 信

 プロセス間通信関連の許可すべきパーミッションとログの特徴を5.3に 示します。

5.3許可すべきパーミッションとログの特徴(プロセス間通信)

許可すべきパーミッション

ログの特徴

tcp/udp/unixソ ケット

tclass=tcp_socket/udp_socket/unix_stream_socket

scontext=ドメインA

tcontext=ドメインB

というエントリがあった場合、ドメインA にドメインBとの通信を許可する必要があります

セマフォ/メッセージ/メッセージキュー/共有メモリ/パイプ

tclass=sem/msg/msgq/shm/pipe

scontext=ドメインA

tcontext=ドメインB

sigchld/sigkill/sigstop/ その他

{ sigchld }/{ sigkill }/{ sigstop }/{ signal }

scontext=ドメインA

tcontext=ドメインB

 

5.5             端末

5.5.1       端末名

 始めに、端末名について述べます。

ドメイン/ロール特有の端末には、

普通の端末:(ドメイン・ロール名)_tty_device_t

擬似端末:(ドメイン・ロール名)_pts_device_t

という名前がつき、

ラベル付け前の端末:tty_device_t

ラベル付け前の擬似端末:devpts_t,ptmx_t

という名前がつきます。

 

5.5.2       ログの特徴

端 末関連の許可すべきパーミッションとログの特徴を5.4に 示します。

 

5.4許可すべきパーミッションとログの特徴(端末)

許可すべきパーミッション

ログの特徴

端末作成

この場合はログを見ただけではよく分かりません。

端末作成はロールと、sshd_login_t, rlogind_tでしか使いません。実際に設定をする場合は、新規ロール作成ぐらいです。

この設定が正しく行われているかどうかのチェックは、ログインした後 に、

ローカルログインの場合は

ls context /dev/tty(端末番号)

とし、

リモートログインの場合は、

ls--context/dev/pts/

として、ロール・ドメイン特有の端末名がついていることを確認しま す。

読み込み/書き込み許可

{ read } {write}

tcontext =端末名

が出た場合、tcontext に対応する端末のアクセス権を与える必要があります。

端末のラベル付け許可

これも滅多に設定することはありません。

tcontext =端末名

{relabelfrom relabelto}という

ログが出たらこの設定が足りない可 能性があります。

 

5.6             管理権限

 

5.5許可すべきパーミッションとログの特徴(管理権限)

許可すべきパーミッション

ログの特徴

全ファイルのラベル付け

書き込み権限のあるファイルのラベル付け

{ relabelfrom relabelto }

必要に応じて、左のどちらかのパーミッションを与えます。

chsidシステムコールの使 用

{ chsid }

avc_toggleコマンド の使用

{ avc_toggle }

load_policyコマン ドの使用

{ load_policy }

arp,routeテーブルの 書き換え

{ net_admin }

ブート権限

{ sys_boot }

モジュールをカーネルに読み込ませる権限

{ sys_module }

ディスククォータをONにする 権限

{ quotaon }

swapを有効にする権限

{ swapon }

マウントに必要な権限

{ mounton }

raw I/Oに必要な権限

{ sys_rawio }

ptraceシステムコールの 使用

{ sys_ptrace }

chrootシステムコールの 使用

{ sys_chroot }

全ディレクトリのサーチ権限

全ファイルの読み込み権限

全ファイルの書き込み権限

ラベル付け前ファイルの読み書き

 

5.7             procファイルシステム

ログ にpath=/xxx,dev=00:02と出力されるので、それを見ることで procファイルシステム関連のログであることが分かります。あとは、ファイル名に応じて、アクセス許可を与えてください。

 

5.8             tmpfsファイルシステム

 ログにpath =/xxx,dev=00:07と出力されるので、それによりtmpfsファイルシステム関連のログであることが分かります。

 

5.8.1       ラベル名

tmpfsに は、以下のようなラベルがついたファイルが生成される。

ラベル付け前:tmpfs_t

ドメイン・ロールが生成した場合:<ドメイン・ロール名>_tmpfs_t:

tcontext にはこれらのラベル名が表示される。以下に許可すべきパーミッションとログの特徴を示します。

 

5.8.2       ログの特徴

5.6許可すべきパーミッションとログの特徴(tmpfsファイルシステム)

許可すべきパーミッション

ログの特徴

tmpfsに自分専用ファイル を作成可

{ write } tcontext=tmpfs_t

読み込み/書き込み

{ read }/{ write }が表示され、

tcontext に5.8.1で示したラベルが表示さ