<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja-JP">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>TOMOYO Linux の世界　第２回：「アクセス制御を経験しよう」</title>
<link rel="stylesheet" href="http://tomoyo.sourceforge.jp/tomoyo.css" media="all" type="text/css">
</head>
<body>
<p style="text-align:right;"><a href="tutorial-2.html.en">English Page</a></p>
<p style="text-align:right;">Last modified: $Date: 2011-07-01 13:55:23 +0900 (Fri, 01 Jul 2011) $</p>

<h1>TOMOYO Linux の世界<br>第２回：「アクセス制御を経験しよう」</h1>

<h2>今回の内容</h2>

<p>前回は， TOMOYO Linux の導入からファイルに対するアクセスの自動学習の手順と学習結果の保存までを紹介しました．今回は TOMOYO Linux における制御モードとプロファイルについて紹介し，それらを組み合わせて実際に強制アクセス制御を行うまでを紹介します．</p>

<h2>制御モードとプロファイル</h2>

<h3>制御モードについて</h3>

<p>前回， /etc/ccs/profile.conf には図１のような内容を記述しました．このうち， mode= で指定されている文字列を制御モードと呼びます．制御モードは disabled / learning / permissive / enforcingのいずれかを取り，それぞれの意味は図２となります．</p>

<table border="1" summary="fig">
<tr><td>
■図１　前回使用したプロファイル
<pre>
PROFILE_VERSION=20100903
0-CONFIG::file={ mode=learning }
</pre>
</td></tr>
</table>

<table border="1" summary="fig">
<tr><td>
■図２　制御モード<br>
<table border="1" summary="fig">
<tr><td>モード</td><td>内容</td><td>動作</td></tr>
<tr><td>disabled</td><td>無効</td><td>通常のカーネルと同様に動作する．</td></tr>
<tr><td>learning</td><td>学習</td><td>ポリシー違反が発生しても要求を拒否しない．<br>ポリシー違反が発生しないようにするのに必要なアクセス許可を，ポリシーに追加する．</td></tr>
<tr><td>permissive</td><td>確認</td><td>ポリシー違反が発生しても要求を拒否しない．</td></tr>
<tr><td>enforcing</td><td>強制</td><td>ポリシー違反が発生したら要求を拒否する．</td></tr>
</table>
</td></tr>
</table>

<p>前回は learning を指定したので，学習モードとして動作していました．その結果，発生したすべてのファイルに関するアクセス要求が許可され，その内容がシステム起動時に読み込まれたポリシーに追加されていったわけです．</p>

<p>ポリシーを策定する基本的な流れは以下のようになります．</p>

<ol>
<li>学習モードにする・・・アクセスを制限したい対象を決めて，許可したい操作を行うことでポリシーを生成する．</li>
<li>確認モードにする・・・操作に必要な許可がポリシーに与えられているかどうかを確認する．必要に応じてポリシーをチューニングする．</li>
<li>強制モードにする・・・運用を開始する．</li>
</ol>

<p>この流れに沿って，今回は確認モードと強制モードを使用してみます．</p>

<p>起動時に制御モードを切り替えたい場合は， /etc/ccs/profile.conf の内容を編集します．起動後に制御モードを切り替えたい場合は ccs-setlevel または ccs-editpolicy コマンドを使用します．たとえば，図３のコマンドを実行すると確認モードに，図４を実行すると強制モードになります（ TOMOYO Linux の確認モードが SELinux の permissive モードに，強制モードが SELinux の enforcing モードに相当します）．</p>

<table border="1" summary="fig">
<tr><td>
■図３　確認モードに変更
<pre>
# /usr/sbin/ccs-setlevel '0-CONFIG::file={ mode=permissive }'
0-CONFIG::file={ mode=permissive grant_log=yes reject_log=yes }
</pre>
</td></tr>
</table>

<table border="1" summary="fig">
<tr><td>
■図４　強制モードに変更
<pre>
# /usr/sbin/ccs-setlevel '0-CONFIG::file={ mode=enforcing }'
0-CONFIG::file={ mode=enforcing grant_log=yes reject_log=yes }
</pre>
</td></tr>
</table>

<p>TOMOYO Linux では，ファイル以外にもネットワークやケイパビリティなどに対する強制アクセス制御を行うことも可能です．現在の設定内容は /proc/ccs/profile で知ることができますが，最初からたくさんの項目を有効にすると混乱するため，今回はファイルに関するアクセス制御のみを有効にします．使い方を理解してきたら，他の項目も有効にしてみるのが良いでしょう．</p>

<h3>プロファイルについて</h3>

<p>TOMOYO Linux では，強制アクセス制御のモードについてドメイン単位で指定することが可能です．任意のドメインについて他のドメインとは独立に制御モードを変更することができます．そのために，プロファイルと呼ばれる制御モードの定義を複数作成し（図５）， ccs-setprofile または ccs-editpolicy コマンドを用いてプロファイルをドメインに割り当てて使用します（図６）． ccs-setprofile コマンドの使い方は後述します．</p>

<table border="1" summary="fig">
<tr><td>
■図５　プロファイルを作成する<br>
<img src="tutorial/fig-2-5-ja.png" alt="fig-2-5-ja.png" width="640" height="320">
</td></tr>
</table>

<table border="1" summary="fig">
<tr><td>
■図６　プロファイルをドメインに割り当てる<br>
<img src="tutorial/fig-2-6.png" alt="fig-2-6.png" width="800" height="600">
</td></tr>
</table>

<h4>●プロファイルの作成</h4>

<p>本連載では，４種類のプロファイルを使用します． /etc/ccs/profile.conf の内容を図７のように書き換えてください．</p>

<table border="1" summary="fig">
<tr><td>
■図７　この連載で使用するプロファイル
<pre>
PROFILE_VERSION=20100903
0-CONFIG::file={ mode=disabled }
1-CONFIG::file={ mode=learning }
2-CONFIG::file={ mode=permissive }
3-CONFIG::file={ mode=enforcing }
</pre>
</td></tr>
</table>

<p>行頭の数字がプロファイルの番号（プロファイル番号は 0 から 255 まで使用できます．）であり，同じものは同一プロファイルに所属します．プロファイル番号の割り当ては自由ですが，本連載では，制御モードとの対応を連想しやすいように，０番を「アクセス制御を行わないプロファイル」用，１番を「アクセス許可を学習させるためのプロファイル」用，２番を「アクセス許可の不足がないかを確認するためのプロファイル」用，３番を「アクセス制御を行うためのプロファイル」用として使用することにします．</p>

<p>/etc/ccs/profile.conf を図７のように修正したら，それを反映するために TOMOYO Linux カーネルで再起動するか，あるいは図８のコマンドを実行してください．</p>

<table border="1" summary="fig">
<tr><td>
■図８　プロファイルの再読み込み
<pre>
# /usr/sbin/ccs-loadpolicy -p &lt; /etc/ccs/profile.conf
</pre>
</td></tr>
</table>

<h2>Ｗｅｂサービスを保護してみよう</h2>

<p>強制アクセス制御の例として， Apache を対象としたポリシーの作り方を説明します． Apache 本体のパス名は，使用しているディストリビューションにより異なります． CentOS の場合は /usr/sbin/httpd ， Debian の場合は /usr/sbin/apache2 です．</p>

<h3>例外ポリシーの更新</h3>

<p>最初に，このパス名を initialize_domain に指定します．図９のように ccs-editpolicy を e オプション付きで実行してください．</p>

<table border="1" summary="fig">
<tr><td>
■図９　ポリシーエディタを実行
<pre>
# /usr/sbin/ccs-editpolicy e
</pre>
</td></tr>
</table>

<p>すると，「 &lt;&lt;&lt; Exception Policy Editor &gt;&gt;&gt; 」という画面が表示されます．この画面をスクロールしていくと， initialize_domain で始まる行が現れます（図１０．表示される内容は環境により異なります）．</p>

<table border="1" summary="fig">
<tr><td>
■図１０　例外ポリシーの initialize_domain 指定部分<br>
<img src="tutorial/fig-2-10.png" alt="fig-2-10.png" width="720" height="400">
</td></tr>
</table>

<p>連載第１回の手順を実行していれば，その中に「 initialize_domain /usr/sbin/httpd from any 」という行が存在しているはずです．もし存在していない場合は，次の手順により追加してください．</p>

<p>まず最初に，キーボードの「 A 」を押してください．「 Enter new entry&gt; 」というプロンプトが画面の最下行に表示されます．続けて「 initialize_domain /usr/sbin/httpd from any 」と入力して，「 Enter 」を押してください．入力した内容が追加されるはずです．反対に削除する場合は，まず「↑」「↓」を使って「 initialize_domain /usr/sbin/httpd from any 」という行にカーソルを合わせてください．そこでキーボードの「 D 」を押すと「 Delete selected entry? ('Y'es/'N'o) 」と尋ねられるので，「 Y 」を押すとその行の内容が削除されます．</p>

<p>TOMOYO Linux では，同一のプログラムであったとしてもそれを起動した経緯によって異なるドメインが割り当てられます．これは状況に応じて異なるアクセス許可を与えたい場合には便利ですが，デーモンプロセスのように状況に依らず同じアクセス許可を与えたいという場合もあります．それを解決するために TOMOYO Linux では initialize_domain と呼ばれる機能を実現しています．</p>

<p>利用方法は，起動した経緯によらず同一ドメインとして扱いたいプログラムについて， initialize_domain というキーワードで登録します．そうするとシステムの起動時に自動的に起動された場合でも管理者がログインしてサービスを再起動させた場合でも &lt;kernel&gt; 直下の同じドメインで動作させることができます（図１１）．</p>

<table border="1" summary="fig">
<tr><td>
■図１１　initialize_domain による指定<br>
<img src="tutorial/fig-3-3.png" alt="fig-3-3.png" width="800" height="500">
</td></tr>
</table>

<h3>起動</h3>

<p>まず， Apache を動作させるためのドメインを作成します（図１２）．</p>

<table border="1" summary="fig">
<tr><td>
■図１２　Apache を起動
<pre>
# service httpd restart
</pre>
</td></tr>
</table>

<p>これにより， /etc/rc.d/init.d/httpd が実行され，その中から /usr/sbin/httpd が実行されますが， /usr/sbin/httpd が initialize_domain として登録されていると，「 &lt;kernel&gt; /usr/sbin/httpd 」というドメインが作成されます（もし，例外ポリシーで「 initialize_domain /usr/sbin/httpd from any 」という指定がされていなかった場合， /usr/sbin/httpd が動作するためのドメインは /usr/sbin/httpd を実行したプロセスの属しているドメインの子ドメインとして作成されます）．</p>

<h3>学習モード</h3>

<p>先ほど作成したプロファイルの中から学習用のプロファイルを割り当ててみます（図１３）．引数の -r は，「 &lt;kernel&gt; /usr/sbin/httpd 」ドメイン配下のすべてのドメイン（ドメイン名が「 &lt;kernel&gt; /usr/sbin/httpd 」で始まるすべてのドメイン）を適用対象とするという意味です． ccs-setprofile コマンドでドメイン名を指定する場合，適切に引用符を付けてやらないと， &lt; や &gt; がシェルのリダイレクトとして解釈されてしまいますので注意してください．</p>

<table border="1" summary="fig">
<tr><td>
■図１３　学習用プロファイルを割り当て
<pre>
# /usr/sbin/ccs-setprofile -r 1 '&lt;kernel&gt; /usr/sbin/httpd'
1 &lt;kernel&gt; /usr/sbin/httpd
</pre>
</td></tr>
</table>

<p>図１３のコマンドを実行した後で，許可したい操作（たとえばページの閲覧や Wiki の操作）を行います．</p>

<h3>確認モード</h3>

<p>ひととおりの操作が完了したら，今度は確認用のプロファイルを割り当ててみましょう（図１４）．ポリシー違反が発生すると /proc/ccs/stat のカウンタが増加します．許可したい操作を行ってもこのカウンタが増えないようであれば，許可したい操作を行うのに必要なアクセス許可がポリシーに含まれていることがわかります．</p>

<table border="1" summary="fig">
<tr><td>
■図１４　確認用プロファイルを割り当て
<pre>
# /usr/sbin/ccs-setprofile -r 2 '&lt;kernel&gt; /usr/sbin/httpd'
2 &lt;kernel&gt; /usr/sbin/httpd
</pre>
</td></tr>
</table>

<p>また，この段階でポリシーのチューニングを行います．チューニングの手順については後述します．</p>

<h3>強制モード</h3>

<p>ポリシーが完成したと判断したら，強制用のプロファイルを割り当てます（図１５）．</p>

<table border="1" summary="fig">
<tr><td>
■図１５　強制用プロファイルを割り当て
<pre>
# /usr/sbin/ccs-setprofile -r 3 '&lt;kernel&gt; /usr/sbin/httpd'
3 &lt;kernel&gt; /usr/sbin/httpd
</pre>
</td></tr>
</table>

<p>これにより，「 &lt;kernel&gt; /usr/sbin/httpd 」ドメイン配下で動作するプログラムに対して，強制アクセス制御が適用された状態になります．</p>

<p>状態を確認するには，前回紹介した ccs-pstree コマンドを使用します． ccs-pstree コマンドの出力の行頭には，プロファイル番号が表示されています．保護したいアプリケーション（この例で言えば /usr/sbin/httpd ）に意図したとおりのプロファイル番号が割り当てられていることを確認してください．</p>

<p>強制モードで動作するプロファイルを割り当てて初めて，強制アクセス制御により保護された状態になることに注意してください．</p>

<h2>ポリシーのチューニング</h2>

<h3>パス名のパターン化について</h3>

<p>ポリシーでは必要なアクセスについて許可を与えることが必要ですが，プログラムによっては /tmp/ などのディレクトリにランダムな英数字やプロセスＩＤなどを名前に含むファイルを作成するものがあります．そうした場合には，学習モードで追加されたパス名だけでは正しく動作できません．</p>

<p>TOMOYO Linux では，こうした場合を想定して，ポリシーでのワイルドカードの使用に対応しています（図１６）．ワイルドカードを適切に使用することによりアクセス許可の数を減らし，メモリ消費を節約することができます．</p>

<table border="1" summary="fig">
<tr><td>
■図１６　TOMOYO Linux で使用可能なワイルドカード<br>
<table border="1" summary="fig">
<tr><td>表記</td><td>意味</td></tr>
<tr><td>\*</td><td>/ 以外の０文字以上</td></tr>
<tr><td>\@</td><td>/ と . 以外の０文字以上</td></tr>
<tr><td>\?</td><td>/ 以外の１文字</td></tr>
<tr><td>\$</td><td>１桁以上の１０進数</td></tr>
<tr><td>\+</td><td>１０進数１桁</td></tr>
<tr><td>\X</td><td>１桁以上の１６進数</td></tr>
<tr><td>\x</td><td>１６進数１桁</td></tr>
<tr><td>\A</td><td>１文字以上のアルファベット</td></tr>
<tr><td>\a</td><td>アルファベット１文字</td></tr>
<tr><td>\-</td><td>パス名を除外する演算子</td></tr>
<tr><td>/\{dir\}/</td><td>/ に続く「１回以上の dir/ の繰り返し」に一致する演算子</td></tr>
</table>
</td></tr>
</table>

<p>\ 記号はパターンを表すためのエスケープ文字として使用されるため， \ 記号自身を表すときは \\ のように２つ重ねて使用します（画面に表示できない文字（ ASCII 制御コードなど）や日本語文字は \ooo という８進数で表記します．）．</p>

<h3>パス名をパターン化してみよう</h3>

<p>パス名をパターン化する操作は，ポリシーエディタを用いて行うことができます． ccs-editpolicy を起動すると，「 &lt;&lt;&lt; Domain Transition Editor &gt;&gt;&gt; 」という画面が表示されます．そこから，「 &lt;kernel&gt; /usr/sbin/httpd 」というドメインを探してください．「 &lt;kernel&gt; /usr/sbin/httpd 」という行にカーソルを合わせてから「 Enter 」を押すと，「 &lt;&lt;&lt; Domain Policy Editor &gt;&gt;&gt; 」という画面が表示されるはずです（図１７．表示される内容は環境により異なります）．</p>

<table border="1" summary="fig">
<tr><td>
■図１７　Apache 用のポリシー<br>
<img src="tutorial/fig-2-17.png" alt="fig-2-17.png" width="720" height="400">
</td></tr>
</table>

<p>Ｗｅｂサーバは /var/www/ ディレクトリ以下のファイルをアクセスします．そこで， /var/www/html/ ディレクトリ以下のファイルの参照を許可するには，図１８のように指定します．「 A 」を押して１行ずつ追加します（図１９）．</p>

<table border="1" summary="fig">
<tr><td>
■図１８　/var/www/html/ 以下の参照を許可する例
<pre>
file read /var/www/html/\*
file read /var/www/html/\{\*\}/\*
</pre>
</td></tr>
</table>

<table border="1" summary="fig">
<tr><td>
■図１９　Apache に対して /var/www/html/ 以下の参照を許可<br>
<img src="tutorial/fig-2-19.png" alt="fig-2-19.png" width="720" height="400">
</td></tr>
</table>

<p>アプリケーションによっては，テンポラリファイルを使用します．たとえば，図２０のようなエントリが含まれていた場合，これらは /tmp/phpXXXXXX というパターンで作成されるテンポラリファイルであると考えることができます．そのため， /tmp/phpXXXXXX というパターンを TOMOYO Linux におけるワイルドカードで表記した /tmp/php\?\?\?\?\?\? というパターンで置き換えます．操作手順は，次のようになります．</p>

<table border="1" summary="fig">
<tr><td>
■図２０　テンポラリファイル
<pre>
file write /tmp/phpAb9fD1
file write /tmp/phpkzqf5p
file write /tmp/php3lo7ab
</pre>
</td></tr>
</table>

<p>まず，キーボードの「 A 」を押して，図２０の内容をパターン化した「 file write /tmp/php\?\?\?\?\?\? 」というエントリを入力してください．次に，「 file write /tmp/php\?\?\?\?\?\? 」というエントリの行にカーソルを合わせてキーボードの「 O 」を押すと，このエントリに包含されているアクセス許可の行頭に &amp; マークが表示されます．図２０の内容について行頭に &amp; マークが表示されていることを確認後，キーボードの「 D 」を押すと「 Delete selected entries? ('Y'es/'N'o) 」と尋ねられますので，キーボードの「 Y 」を押してください．</p>

<p>確認モードで動作させながら，必要なアクセス許可が与えられるまでチューニングを行ってください．</p>

<h3>ポリシーの保存について</h3>

<p>起動時は /sbin/ccs-init によってディスク上のポリシーがカーネルへと自動的にロードされますが，シャットダウン時はカーネル内のポリシーがディスクへと自動的にセーブされません．そのため，ポリシーの追加や削除を行ったり，プロファイルの割り当てを変更したりした場合，システムをシャットダウンさせる前に ccs-savepolicy を実行することを忘れないでください．</p>

<h3>ポリシーの新規作成について</h3>

<p>学習モードではポリシーは既存の内容に追加されますが，作成済みのポリシーを使用せず新規に学習を行いたい場合は，図２１のように操作して初期化後、再起動してください（ /etc/ccs/policy/current や /etc/ccs/policy/previous の末尾に / が付いていないことに注意してください）．</p>

<table border="1" summary="fig">
<tr><td>
■図２１　ポリシーを再初期化する
<pre>
# mv /etc/ccs/policy/current /etc/ccs/policy/previous
# /usr/lib/ccs/init_policy
</pre>
</td></tr>
</table>

<h2>次回予告</h2>

<p>今回は実際にアクセス制御を行う手順と，Ｗｅｂサービスを保護する方法について紹介しました． TOMOYO Linux の基本的な操作方法は，前回と今回で説明した内容に含まれており，ここに書かれた内容を理解すれば，「 TOMOYO Linux を使える」と言って良いでしょう．</p>

<p>次回は， TOMOYO Linux のドメイン遷移について紹介します．どうぞお楽しみに．</p>

<p><a href="tutorial-1.html.ja">第１回へ戻る</a>　<a href="tutorial-3.html.ja">第３回へ進む</a></p>

<hr>

<p><a href="index.html.ja#tutorial">目次へ戻る</a></p>
<p><a href="http://sourceforge.jp/"><img src="http://sourceforge.jp/sflogo.php?group_id=1973" width="96" height="31" alt="sflogo.php" title="SourceForge.jp"></a></p>
</body>
</html>
