Chapter 6: ポリシーはどのように作成しますか?
6.1. テンポラリファイルをパターン化する
特定のドメインでは、多数の資源に対して多数のアクセス許可を必要とすることがあります。「強制モード」では明示的に許可された資源へのアクセスだけが認められるため、必要な資源を全て網羅しておくことが重要です。網羅するために、アクセス許可をパターン化することができます。パターン化されたアクセス許可を使うと、多数のドメインポリシーのエントリを1個に集約することができます。
パターン化は、使い捨てのパス名が利用されるテンポラリファイルへの対処を行うのに有効です。以下に紹介する手順で対処することもできますし、ポリシーエディタを用いて対話的に対処することもできます。対話的に対処する手順の詳細については冗長なエントリを削除するを参照してください。
tomoyo-findtemp コマンドを利用して、テンポラリファイルの可能性があるパス名を抽出します:
# /usr/sbin/tomoyo-findtemp < /sys/kernel/security/tomoyo/domain_policy
/etc/mtab.tmp /etc/mtab~ /etc/mtab~2302 /etc/mtab~2328 /etc/mtab~2329 /etc/mtab~2330 /etc/mtab~2331 /etc/mtab~2332 /etc/mtab~2339 /etc/mtab~2383 /halt /selinux/disable /selinux/enforce /selinux/policyvers /tmp/sh-thd-1163110572 /tmp/sh-thd-1163113704 /var/cache/samba/browse.dat. /var/lib/nfs/etab.tmp /var/lib/nfs/xtab.tmp /var/lock/mrtg/mrtg_l
この例では、 /etc/mtab~数値 および /tmp/sh-thd-数値 がテンポラリファイルであると考えられます。そのため、これらのパス名をパターン化します。
最初に、どのようなパターンを利用するかを決めます。10進数の数値が使用されていると考えられます。そのため、1桁以上の10進数に一致する \$ が妥当だと考えられます。詳細についてはパターンの表記規則を参照してください。
tomoyo-patternize コマンドを利用して、ドメインポリシーの中の「 /etc/mtab~数値 」および「 /tmp/sh-thd-数値」を「 /etc/mtab~\$ 」および「 /tmp/sh-thd-\$ 」に置換します:
# /usr/sbin/tomoyo-savepolicy -d | /usr/sbin/tomoyo-patternize '/etc/mtab~\$' '/tmp/sh-thd-\$' | /usr/sbin/tomoyo-loadpolicy -d
必要であれば、学習する際に自動的にパターン化されるようにするために、例外ポリシーにパターンを登録しておくことができます:
# echo 'file_pattern /etc/mtab~\$' | /usr/sbin/tomoyo-loadpolicy -e # echo 'file_pattern /tmp/sh-thd-\$' | /usr/sbin/tomoyo-loadpolicy -e
6.2. ファイルのアクセス許可をパターン化する
学習モードでは必ずしもアクセスされないファイルに対するアクセス許可を追加します。例えば、 WWW サーバがアクセスするコンテンツを扱うために、以下のようにパターン化を行うことができます:
|
修正前 |
修正後 |
|---|---|
|
<kernel> /usr/sbin/httpd allow_read /var/www/html/index.html allow_read /var/www/html/alice/index.html allow_read /var/www/html/alice/page1.html allow_read /var/www/html/alice/page2.html allow_read /var/www/html/alice/image1.jpg allow_read /var/www/html/alice/image2.jpg allow_read /var/www/html/alice/archive/page1.html allow_read /var/www/html/alice/archive/image1.jpg allow_read /var/www/html/alice/archive/page2.html allow_read /var/www/html/alice/archive/image2.jpg allow_read /var/www/html/bob/index.html allow_read /var/www/html/bob/page1.html allow_read /var/www/html/bob/page2.html allow_read /var/www/html/bob/image1.jpg allow_read /var/www/html/bob/image2.jpg allow_read /var/www/html/bob/archive/page1.html allow_read /var/www/html/bob/archive/image1.jpg allow_read /var/www/html/bob/archive/page2.html allow_read /var/www/html/bob/archive/image2.jpg |
<kernel> /usr/sbin/httpd allow_read /var/www/html/\*.html allow_read /var/www/html/\{\*\}/\*.html allow_read /var/www/html/\{\*\}/\*.jpg |
例外ポリシーで以下のようなグループを定義しておくことにより:
path_group WEB-CONTENTS /var/www/html/\*.html
path_group WEB-CONTENTS /var/www/html/\{\*\}/\*.html
path_group WEB-CONTENTS /var/www/html/\{\*\}/\*.jpg
ドメインポリシーでの記述を以下のように単純化することができます:
<kernel> /usr/sbin/httpd allow_read @WEB-CONTENTS
6.3. 数値パラメータをパターン化する
ファイルのDACモードなどの数値で表現されるパラメータについてもパターン化を行うことができます。
以下のドメインポリシーの例では <kernel> /sbin/init ドメインに対して /dev/console への任意の ioctl 要求を許可するようにパターン化しています:
|
修正前 |
修正後 |
|---|---|
|
<kernel> /sbin/init allow_ioctl /dev/console 0x5401 allow_ioctl /dev/console 0x5402 allow_ioctl /dev/console 0x540B allow_ioctl /dev/console 0x540E allow_ioctl /dev/console 0x540F |
<kernel> /sbin/init allow_ioctl /dev/console 0-0xFFFFFFFF |
例外ポリシーで以下のようなグループを定義しておくことにより:
number_group ANY_NUMBER 0-0xFFFFFFFF
ドメインポリシーでの記述を以下のように単純化することができます:
<kernel> /sbin/init allow_ioctl /dev/console @ANY_NUMBER
6.4. 収集されたアクセス許可を確認する
Apache に許可したい操作を一通り行ったと判断したら、ポリシーエディタを実行してプロファイル番号を 2 に変更します。
Apache は(例えば /bin/sh /usr/bin/perl /usr/lib/sendmail のような)外部のプログラムを実行したことにより、 Apache に子ドメインや孫ドメインが作成されているかもしれません。 Apache 本体のドメインだけでなくその子孫ドメインのプロファイル番号も変更するのを忘れないようにしてください。
q キーを押してポリシーエディタを終了してください。その後、 Apache に対して許可したい操作を再度行ってください:
もしプロファイルで PREFERENCE::permissive={ verbose=yes } と設定されている場合(デフォルトでそうなっています)、ポリシーで許可されていない操作を行うと WARNING: というメッセージがコンソールに表示されます。
