<!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-1.html.en">English Page</a></p>
<p style="text-align:right;">Last modified: $Date: 2013-01-17 23:04:43 +0900 (Thu, 17 Jan 2013) $</p>

<h1>TOMOYO Linux の世界<br>第１回：「ポリシー自動学習を経験しよう」</h1>

<h2>TOMOYO Linux の世界へようこそ</h2>

<h3>TOMOYO Linux とは</h3>

<p>TOMOYO Linux は NTT データが開発し， 2005 年 11 月に GPL ライセンスで公開したセキュアＯＳです．一部の機能は 2009 年 6 月にリリースされた Linux カーネル 2.6.30 にも含まれています．技術的な情報については，『ネットワークセキュリティ Expert 5 』（技術評論社／ ISBN4-7741-2973-9 ）や SourceForge の<a href="http://tomoyo.sourceforge.jp/">プロジェクトページ</a>にて紹介していますが，本連載では読者の方々に実際に TOMOYO Linux を体験し，使いこなしていただくことを目的として解説したいと思います．どうぞ最後までおつきあいください．</p>

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

<p>セキュアＯＳの概要と TOMOYO Linux の導入手順について説明します．手順については， VMware 上に構築した CentOS 5.9 にコンパイル済みの TOMOYO Linux カーネルバージョン 1.8.0 を導入します．導入しただけではつまらないので，実際に TOMOYO Linux カーネルで起動し， TOMOYO Linux のポリシー自動学習を「体験」していただくまでが今回の内容です．</p>

<h2>セキュアＯＳについて</h2>

<p>セキュアＯＳは一般には，強制アクセス制御と最少権限を備えたＯＳとして説明されることが多いでしょう．いずれの機能も，ＯＳが提供する機能の利用を制限するためのしくみです．筆者は「セキュアＯＳは負の技術」だと思っています．その意味は，セキュアＯＳを導入しても機能やできることが増えるわけではなく，その逆に「できることを減らす」のがセキュアＯＳだからです．さらに「できることを減らすための作業や負荷が伴う」という嬉しくないおまけまで付きます．なぜ，わざわざ手間暇かけてできることを制限しなければならないのでしょうか？その理由は，セキュリティの強化につきます．標準のＯＳは，不正アクセスなどによりコントロールを奪われてしまうと，その汎用性が仇になりかねません．たとえば，インターネットに公開しているＷｅｂサーバでは，「Ｗｅｂサービスだけ提供できれば良い」のであって，他の機能は使えないほうが良いわけです．もともと汎用の機能を目指して作られたものを制限する，それがセキュアＯＳです（図１，図２）．</p>

<table border="1" summary="fig">
<tr><td>
■図１　標準のＯＳではアクセスは自由<br>
<img src="tutorial/fig-1-1.jpg" alt="fig-1-1.jpg" width="500" height="350">
</td><td>
■図２　セキュアＯＳはポリシーに従いアクセスを制限する<br>
<img src="tutorial/fig-1-2.jpg" alt="fig-1-2.jpg" width="500" height="350">
</td></tr>
</table>

<h3>どのように制限するか，なぜセキュアＯＳは普及しないのか？</h3>

<p>「制限」は，おもにアクセス制御の強化という形で実装されます．それがいわゆる「強制アクセス制御」， MAC （ Mandatory Access Control ）です．コンピュータには，どれが必要であり，どれが必要でないかはわかりません．したがって，強制アクセス制御という仕組みに対して，実行して良い機能と悪い機能を告げる必要があります．その定義が「ポリシー」です．つまりセキュアＯＳを導入するということはポリシーを管理するという作業が義務付けられるということになります．セキュリティに関する重要度は日増しに高まる一方です．それなのになぜセキュアＯＳはなかなか普及しないのでしょうか？それにはいくつかの要因が存在しますが，その最大のポイントは「セキュアＯＳの概念が難しく，ポリシーの管理運用が非常に複雑」な点にあるのではないかと思います．ここでは深く説明しませんが，長年 Linux の管理をしてきた人であってもポリシーを書くという作業は容易には行えないのです．</p>

<h3>そして TOMOYO Linux</h3>

<p>このセキュアＯＳの本質的な課題であるポリシーについて，「ＯＳ自体がポリシーを自分で生成する」というアプローチにより実用レベルの「使いこなせるセキュアＯＳ」を実現したのが TOMOYO Linux です． TOMOYO Linux であれば， Linux をインストール，管理した経験があれば，誰でもその日から使うことができます．連載の第１回では， TOMOYO Linux の導入から，最初のポリシーを自動学習するまでを解説します．とくに難しい部分はないので，ぜひ実際に手を動かし， TOMOYO Linux が拓く新しい世界を体験してみてください．</p>

<h2>TOMOYO Linux のインストール</h2>

<h3>準備</h3>

<p>TOMOYO Linux はカーネル 2.4.30 以降および 2.6.11 以降に対応しています．図３のディストリビューションについては<a href="http://tomoyo.sourceforge.jp/1.8/install.html.ja#install_from_repository"> i686 向けのコンパイル済みカーネルとツールのパッケージ</a>を用意しています．</p>

<table border="1" summary="fig">
<tr><td>
■図３　バイナリパッケージが提供されているディストリビューション<br>
<ul>
<li>Fedora 14/15</li>
<li>CentOS 3.9/4.9/5.8/6.3</li>
<li>Debian Lenny/Squeeze</li>
<li>OpenSUSE 11.3/11.4/12.1</li>
<li>Asianux 2.0/3.0</li>
<li>Ubuntu 8.04/10.04/10.10/11.04/11.10/12.04</li>
<li>Vine Linux 5.2/6.1</li>
</ul>
</td></tr>
</table>

<p>本連載では， CentOS 5.9 を例に挙げて説明しますが，上記ディストリビューションであればほぼ同じ手順で利用いただけます．</p>

<h4>●カーネルのインストール</h4>

<p>コンパイル済みのカーネルパッケージをダウンロードし，インストールします（図４）．</p>

<table border="1" summary="fig">
<tr><td>
■図４　コンパイル済みカーネルのインストール
<pre>
# wget http://I-love.SAKURA.ne.jp/kumaneko-key
# rpm --import kumaneko-key
# wget -O /etc/yum.repos.d/ccs.repo http://tomoyo.sourceforge.jp/repos-1.8/CentOS5/ccs.repo
# yum -y install ccs-kernel
</pre>
</td></tr>
</table>

<p>カーネルのインストールが成功していれば， /boot/grub/grub.conf には図５のようなエントリが追加されているはずです．</p>

<table border="1" summary="fig">
<tr><td>
■図５　grub.conf に追加される TOMOYO Linux カーネル用のエントリ
<pre>
title CentOS (2.6.18-194.26.1.el5_tomoyo_1.8.0)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.18-194.26.1.el5_tomoyo_1.8.0 ro root=LABEL=/
        initrd /boot/initrd-2.6.18-194.26.1.el5_tomoyo_1.8.0.img
</pre>
</td></tr>
</table>

<h4>●ユーティリティのインストール</h4>

<p>ポリシーを管理するためのユーティリティをダウンロードし，インストールします（図６）．</p>

<table border="1" summary="fig">
<tr><td>
■図６　ユーティリティのインストール
<pre>
# yum -y install ccs-tools
</pre>
</td></tr>
</table>

<p>ユーティリティは /usr/sbin/ ディレクトリにインストールされます．各プログラムの役割は図７のとおりです．それぞれの使い方については，本連載の中で登場したところで説明していきます．</p>

<table border="1" summary="fig">
<tr><td>
■図７　TOMOYO Linux の管理を行うためのプログラム<br>
<table border="1" summary="fig">
<tr><td>プログラム名</td><td>役割</td></tr>
<tr><td>ccs-loadpolicy</td><td>ポリシーの再読み込みを行う</td></tr>
<tr><td>ccs-editpolicy</td><td>ポリシーエディタ</td></tr>
<tr><td>ccs-savepolicy</td><td>現在のポリシーを保存する</td></tr>
<tr><td>ccs-queryd</td><td>アクセス要求を対話的に許可する</td></tr>
<tr><td>ccs-setlevel</td><td>プロファイルの内容を変更する（ ccs-editpolicy からも変更できます）</td></tr>
<tr><td>ccs-setprofile</td><td>ドメインに割り当てるプロファイルを変更する（ ccs-editpolicy からも変更できます）</td></tr>
</table>
</td></tr>
</table>

<h3>TOMOYO Linux の初期設定</h3>

<h4>●コマンド検索パスの追加</h4>

<p>TOMOYO Linux のユーティリティを保存してある場所を環境変数 PATH に追加しておきます． /bin/bash を使っている場合は ~/.bashrc に図８の行を追加します．</p>

<table border="1" summary="fig">
<tr><td>
■図８　環境変数 PATH の設定
<pre>
export PATH=$PATH:/usr/sbin
</pre>
</td></tr>
</table>

<h4>●ポリシーの初期化</h4>

<p>TOMOYO Linuxではポリシーに書かれていないアクセスは拒否されます．必要なアクセスはすべて洗い出して記述しなければなりませんが，ポリシーをコンパクトにするために「例外ポリシー」という概念を持っています．</p>

<p>例外ポリシーの内容は，ポリシーを策定しながら随時見直しを行いますが，図９のコマンドを実行することにより初期値を登録します．</p>

<table border="1" summary="fig">
<tr><td>
■図９　ポリシーの初期化
<pre>
# /usr/lib/ccs/init_policy
Creating policy directory... OK
Creating configuration directory... OK
Creating exception policy... OK
Creating domain policy... OK
Creating manager policy... OK
Creating default profile... OK
Creating stat policy... OK
Creating module loader... OK
Creating configuration file for ccs-editpolicy ... OK
Creating configuration file for ccs-auditd ... OK
Creating configuration file for ccs-patternize ... OK
Creating configuration file for ccs-notifyd ... OK
</pre>
</td></tr>
</table>

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

<p>TOMOYO Linuxではアクセス制御の方法をプロファイルという概念により管理します．プロファイルの詳細と制御の方法（手順）については，次回以降紹介します．</p>

<p>先ほど実行した init_policy により /etc/ccs/profile.conf というファイルが作成されていますが，今回はこのファイルの内容を図１０の内容で上書きしてください．１行目はプロファイルのバージョン，２行目は「ファイルのアクセス制御を学習モードにする」という意味です．</p>

<table border="1" summary="fig">
<tr><td>
■図１０　/etc/ccs/profile.confに指定する内容
<pre>
PROFILE_VERSION=20100903
0-CONFIG::file={ mode=learning }
</pre>
</td></tr>
</table>

<h4>●TOMOYO Linuxカーネルで再起動</h4>

<p>ここまでで準備は完了です（お疲れさまでした）．</p>

<p>reboot コマンドによりシステムを再起動します（図１１）．</p>

<table border="1" summary="fig">
<tr><td>
■図１１　再起動
<pre>
# reboot
</pre>
</td></tr>
</table>

<p>再起動後表示される GRUB メニューでは TOMOYO Linux カーネルを選択してください（図１２）．</p>

<table border="1" summary="fig">
<tr><td>
■図１２　TOMOYO Linuxカーネルを選択<br>
<img src="tutorial/fig-1-12.png" alt="fig-1-12.png" width="640" height="480">
</td></tr>
</table>

<p>ここまでの手順が正しく行われると，「学習モード」で TOMOYO Linux が起動します（図１３）．</p>

<table border="1" summary="fig">
<tr><td>
■図１３　TOMOYO Linux カーネルが起動<br>
<img src="tutorial/fig-1-13.png" alt="fig-1-13.png" width="720" height="400">
</td></tr>
</table>

<h3>TOMOYO Linux を無効化する方法について</h3>

<p>もし， TOMOYO Linux が原因でシステムが起動できなくなった場合には，カーネル起動時のコマンドラインに ccsecurity=off というパラメータを追加することにより， TOMOYO Linux を無効化して起動することができます．</p>

<h3>TOMOYO Linux をアンインストールする方法について</h3>

<p>TOMOYO Linux は Linux 標準のライブラリやユーザランドのツール類を書き換えないのでアンインストールは簡単です．都合により TOMOYO Linux をアンインストールしたくなった場合には，起動時にポリシーを読み込むためのプログラムである /sbin/ccs-init を削除すると元の状態に戻ります．また，カーネルも削除したい場合には TOMOYO Linux でないカーネルで再起動してから rpm コマンドでパッケージの削除を実行してください．</p>

<h2>振る舞いを観察してみよう</h2>

<h3>ドメインとドメイン遷移</h3>

<p>TOMOYO Linux ではドメインという単位でアクセス制御を行います．すべてのプロセスはいずれか１個のドメインに属しており，原則としてプログラムを実行するたびに異なるドメインへ遷移します（図１４）．</p>

<table border="1" summary="fig">
<tr><td>
■図１４　ドメイン遷移<br>
<img src="tutorial/fig-3-1.png" alt="fig-3-1.png" width="800" height="600">
</td></tr>
</table>

<p>TOMOYO Linux におけるドメインは， &lt;kernel&gt; を基点としたプロセスの起動履歴を文字列として結合したものになります．たとえば，「カーネルプロセス」のドメインが「 &lt;kernel&gt; 」，「カーネルプロセスから起動される /sbin/init 」のドメインは「 &lt;kernel&gt; /sbin/init 」，「 /sbin/init から起動された /etc/rc.d/rc 」のドメインは「 &lt;kernel&gt; /sbin/init /etc/rc.d/rc 」のようになります．</p>

<h3>ポリシーエディタで確認</h3>

<p>それでは，実際に TOMOYO Linux が学習した内容を確認してみましょう． TOMOYO Linux には，ＣＵＩのポリシーエディタが付属しています． root でログインして， ccs-editpolicy コマンドを実行してください（図１５．図１２で TOMOYO Linux カーネルを選択しなかった場合はエラーメッセージが表示されます）．</p>

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

<p>ポリシーエディタには複数の機能がありますが，起動直後は「 &lt;&lt;&lt; Domain Transition Editor &gt;&gt;&gt; 」（ドメイン遷移エディタ）となっています（図１６）．画面の１行目はタイトルを表示する領域，２行目はメッセージを表示する領域，３行目は現在カーソルのある行のドメイン名を表示する領域です．４行目以降について，先頭の数字が行番号，２番目の数字がプロファイル番号です（プロファイル番号については次回説明します）．図１６では全部で 340 のドメイン遷移が学習されていることがわかります（プロファイル番号やドメイン遷移の数は操作内容や設定により変化します）．</p>

<table border="1" summary="fig">
<tr><td>
■図１６　ポリシーエディタ起動直後の画面<br>
<img src="tutorial/fig-1-16.png" alt="fig-1-16.png" width="720" height="400">
</td></tr>
</table>

<p>矢印キーを用いてスクロールしながら TOMOYO Linux が「学習」したドメインの遷移内容を一覧してみましょう．図１７は /sbin/init からのドメイン遷移です． /sbin/init から /etc/rc.d/rc が実行され， /etc/rc.d/rc から /etc/rc.d/init.d/ ディレクトリにあるプログラムを実行していることがわかります．</p>

<table border="1" summary="fig">
<tr><td>
■図１７　/sbin/initのドメイン<br>
<img src="tutorial/fig-1-17.png" alt="fig-1-17.png" width="720" height="400">
</td></tr>
</table>

<p>ここでは具体例として，実行しているポリシーエディタ自体のドメインのアクセス制御の内容について調べてみましょう．「 F 」を入力すると，カーソルが最下行に移り入力待ちとなるので， ccs-editpolicy と入力して「 Enter 」を押すと，現在操作を行っているポリシーエディタのドメインにカーソルが移動します（図１８）．</p>

<table border="1" summary="fig">
<tr><td>
■図１８　/usr/sbin/ccs-editpolicyのドメイン<br>
<img src="tutorial/fig-1-18.png" alt="fig-1-18.png" width="720" height="400">
</td></tr>
</table>

<p>図１８では， TOMOYO Linux はポリシーエディタのドメインを「 &lt;kernel&gt; /sbin/mingetty /bin/login /bin/bash /usr/sbin/ccs-editpolicy 」（ /sbin/mingetty から起動された /bin/login から起動された /bin/bash から起動された /usr/sbin/ccs-editpolicy ）として認識していることがわかります（ /usr/sbin/sshd から起動された /bin/bash から起動された /usr/sbin/ccs-editpolicy の場合には「 &lt;kernel&gt; /usr/sbin/sshd /bin/bash /usr/sbin/ccs-editpolicy 」として認識します）．</p>

<p>このドメインに対して，学習されているアクセス制御の内容を見るためには「 Enter 」を入力します．すると図１９のような画面になるはずです．画面の最上部の行が「 &lt;&lt;&lt; Domain Transition Editor &gt;&gt;&gt; 」から「 &lt;&lt;&lt; Domain Policy Editor &gt;&gt;&gt; 」になりました．この画面は，「 &lt;kernel&gt; /sbin/mingetty /bin/login /bin/bash /usr/sbin/ccs-editpolicy 」ドメインのアクセス制御内容で，画面では現在９つの内容が登録されています．４行目以降について，各行の先頭の数字は行番号です． file read は「読み込みモードでのオープンを許可」， file write は「書き込みモードでのオープンを許可」， file ioctl は「指定された番号での ioctl 要求を許可」を意味します． use_group 0 は例外ポリシーの中で acl_group 0 で始まるアクセス許可を自動的に適用するという意味です．</p>

<table border="1" summary="fig">
<tr><td>
■図１９　/usr/sbin/ccs-editpolicyのドメインに対するアクセス許可<br>
<img src="tutorial/fig-1-19.png" alt="fig-1-19.png" width="720" height="400">
</td></tr>
</table>

<p>この状態から再びドメイン遷移エディタに戻るためには「 Enter 」を入力します．ポリシーエディタ自身の終了は「 Q 」により行います． ccs-editpolicy は（ディスク上のポリシーファイルではなく）現在カーネルに存在しているポリシーを直接編集するためのエディタです．そのため， ccs-editpolicy で行ったポリシーの登録，削除の操作は即時に反映されますし，学習モードであれば時々刻々追加されたポリシーの内容をモニターすることができます．</p>

<p>さまざまなコマンドを実行し，それがどのようにドメインとして登録され，アクセス制御内容が記録されているかを確認してみてください．何度か操作を行うことにより， TOMOYO Linux のドメイン管理，学習機能，ポリシーについて自然にご理解いただけると思います．このわかりやすさこそが TOMOYO Linux の特徴です．</p>

<ul>
<li><a href="http://tomoyo.sourceforge.jp/1.8/tool-editpolicy.html.ja">ポリシーエディタの使い方</a></li>
</ul>

<h3>プロセスとドメインの関係を確認</h3>

<p>現在実行中のプロセスが属しているドメインとそのドメインに割り当てられているプロファイルを確認するには ccs-pstree コマンドを実行してください．プロファイル番号，プロセス名，プロセスＩＤ，ドメイン名の順番で pstree のように出力されます（図２０）．</p>

<table border="1" summary="fig">
<tr><td>
■図２０　実行中のプロセスに割り当てられているドメインを表示<br>
<img src="tutorial/fig-1-20.png" alt="fig-1-20.png" width="1220" height="450">
</td></tr>
</table>

<h3>ポリシーファイルの保存と読み込み</h3>

<p>カーネル内部に保持されているポリシーをディスクに保存するには， ccs-savepolicy コマンドを実行してください（図２１）． ccs-savepolicy を実行することで， /etc/ccs/policy/YYYY-MM-DD.hh:mm:ss/ ディレクトリに exception_policy.conf domain_policy.conf profile.conf manager.conf という４つのファイルが作成されます．</p>

<table border="1" summary="fig">
<tr><td>
■図２１　カーネル内のポリシーをディスク上のファイルに保存する
<pre>
# /usr/sbin/ccs-savepolicy
</pre>
</td></tr>
</table>

<p>TOMOYO Linux のポリシーはファイル名，ディレクトリ名をそのまま用いたテキストファイルとなっています．ディスク上に保存されているポリシーをカーネル内部に読み込むには， ccs-loadpolicy コマンドを実行してください（図２２）．</p>

<table border="1" summary="fig">
<tr><td>
■図２２　ディスク上のポリシーファイルをカーネルに読み込ませる
<pre>
# /usr/sbin/ccs-loadpolicy -df &lt; /etc/ccs/domain_policy.conf
# /usr/sbin/ccs-loadpolicy -ef &lt; /etc/ccs/exception_policy.conf
</pre>
</td></tr>
</table>

<p>オプションの f は上書きを意味しています． f を指定しなかった場合，現在のカーネル内のポリシーに追加されます．</p>

<h3>次回予告</h3>

<p>今回は TOMOYO Linux の導入から，ファイルに対するアクセスの自動学習の手順と学習結果の保存までをご紹介しました．次回は定義されたポリシーに基づきアクセスを制御するまでを紹介します．どうぞお楽しみに．</p>

<p><a href="tutorial-2.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>
