Info: Version 1.8.x is available.
Last modified: $Date: 2024-03-30 20:25:00 +0900 (Sat, 30 Mar 2024) $
前回は, TOMOYO Linux の導入からファイルに対するアクセスの自動学習の手順と学習結果の保存までを紹介しました.今回は TOMOYO Linux における制御モードとプロファイルについて紹介し,それらを組み合わせて実際に強制アクセス制御を行うまでを紹介します.
前回, /etc/ccs/profile.conf には図1のような内容を記述しました.このうち, mode= で指定されている文字列を制御モードと呼びます.制御モードは disabled / learning / permissive / enforcingのいずれかを取り,それぞれの意味は図2となります.
■図1 前回使用したプロファイル
PROFILE_VERSION=20090903
0-CONFIG::file={ mode=learning }
|
■図2 制御モード
|
前回は learning を指定したので,学習モードとして動作していました.その結果,発生したすべてのファイルに関するアクセス要求が許可され,その内容がシステム起動時に読み込まれたポリシーに追加されていったわけです.
ポリシーを策定する基本的な流れは以下のようになります.
この流れに沿って,今回は確認モードと強制モードを使用してみます.
起動時に制御モードを切り替えたい場合は, /etc/ccs/profile.conf の内容を編集します.起動後に制御モードを切り替えたい場合は ccs-setlevel または ccs-editpolicy コマンドを使用します.たとえば,図3のコマンドを実行すると確認モードに,図4を実行すると強制モードになります( TOMOYO Linux の確認モードが SELinux の permissive モードに,強制モードが SELinux の enforcing モードに相当します).
■図3 確認モードに変更
# /usr/sbin/ccs-setlevel '0-CONFIG::file={ mode=permissive }'
0-CONFIG::file={ mode=permissive grant_log=yes reject_log=yes }
|
■図4 強制モードに変更
# /usr/sbin/ccs-setlevel '0-CONFIG::file={ mode=enforcing }'
0-CONFIG::file={ mode=enforcing grant_log=yes reject_log=yes }
|
TOMOYO Linux では,ファイル以外にもネットワークやケイパビリティなどに対する強制アクセス制御を行うことも可能です.現在の設定内容は /proc/ccs/profile で知ることができますが,最初からたくさんの項目を有効にすると混乱するため,今回はファイルに関するアクセス制御のみを有効にします.使い方を理解してきたら,他の項目も有効にしてみるのが良いでしょう.
TOMOYO Linux では,強制アクセス制御のモードについてドメイン単位で指定することが可能です.任意のドメインについて他のドメインとは独立に制御モードを変更することができます.そのために,プロファイルと呼ばれる制御モードの定義を複数作成し(図5), ccs-setprofile または ccs-editpolicy コマンドを用いてプロファイルをドメインに割り当てて使用します(図6). ccs-setprofile コマンドの使い方は後述します.
■図5 プロファイルを作成する
|
■図6 プロファイルをドメインに割り当てる
|
本連載では,4種類のプロファイルを使用します. /etc/ccs/profile.conf の内容を図7のように書き換えてください.
■図7 この連載で使用するプロファイル
PROFILE_VERSION=20090903
PREFERENCE::learning={ verbose=no }
PREFERENCE::permissive={ verbose=yes }
PREFERENCE::enforcing={ verbose=yes }
0-CONFIG::file={ mode=disabled }
1-CONFIG::file={ mode=learning }
2-CONFIG::file={ mode=permissive }
3-CONFIG::file={ mode=enforcing }
|
行頭の数字がプロファイルの番号(プロファイル番号は 0 から 255 まで使用できます.)であり,同じものは同一プロファイルに所属します.プロファイル番号の割り当ては自由ですが,本連載では,制御モードとの対応を連想しやすいように,0番を「アクセス制御を行わないプロファイル」用,1番を「アクセス許可を学習させるためのプロファイル」用,2番を「アクセス許可の不足がないかを確認するためのプロファイル」用,3番を「アクセス制御を行うためのプロファイル」用として使用することにします.
/etc/ccs/profile.conf を図7のように修正したら,それを反映するために TOMOYO Linux カーネルで再起動するか,あるいは図8のコマンドを実行してください.
■図8 プロファイルの再読み込み
# /usr/sbin/ccs-loadpolicy p |
強制アクセス制御の例として, Apache を対象としたポリシーの作り方を説明します. Apache 本体のパス名は,使用しているディストリビューションにより異なります. CentOS の場合は /usr/sbin/httpd , Debian の場合は /usr/sbin/apache2 です.
最初に,このパス名を initialize_domain に指定します.図9のように ccs-editpolicy を e オプション付きで実行してください.
■図9 ポリシーエディタを実行
# /usr/sbin/ccs-editpolicy e |
すると,「 <<< Exception Policy Editor >>> 」という画面が表示されます.この画面をスクロールしていくと, initialize_domain で始まる行が現れます(図10.表示される内容は環境により異なります).
■図10 例外ポリシーの initialize_domain 指定部分
|
連載第1回の手順を実行していれば,その中に「 initialize_domain /usr/sbin/httpd 」という行が存在しているはずです.もし存在していない場合は,次の手順により追加してください.
まず最初に,キーボードの「 A 」を押してください.「 Enter new entry> 」というプロンプトが画面の最下行に表示されます.続けて「 initialize_domain /usr/sbin/httpd 」と入力して,「 Enter 」を押してください.入力した内容が追加されるはずです.反対に削除する場合は,まず「↑」「↓」を使って「 initialize_domain /usr/sbin/httpd 」という行にカーソルを合わせてください.そこでキーボードの「 D 」を押すと「 Delete selected entry? ('Y'es/'N'o) 」と尋ねられるので,「 Y 」を押すとその行の内容が削除されます.
TOMOYO Linux では,同一のプログラムであったとしてもそれを起動した経緯によって異なるドメインが割り当てられます.これは状況に応じて異なるアクセス許可を与えたい場合には便利ですが,デーモンプロセスのように状況に依らず同じアクセス許可を与えたいという場合もあります.それを解決するために TOMOYO Linux では initialize_domain と呼ばれる機能を実現しています.
利用方法は,起動した経緯によらず同一ドメインとして扱いたいプログラムについて, initialize_domain というキーワードで登録します.そうするとシステムの起動時に自動的に起動された場合でも管理者がログインしてサービスを再起動させた場合でも <kernel> 直下の同じドメインで動作させることができます(図11).
■図11 initialize_domain による指定
|
まず, Apache を動作させるためのドメインを作成します(図12).
■図12 Apache を起動
# service httpd restart |
これにより, /etc/rc.d/init.d/httpd が実行され,その中から /usr/sbin/httpd が実行されますが, /usr/sbin/httpd が initialize_domain として登録されていると,「 <kernel> /usr/sbin/httpd 」というドメインが作成されます(もし,例外ポリシーで「 initialize_domain /usr/sbin/httpd 」という指定がされていなかった場合, /usr/sbin/httpd が動作するためのドメインは /usr/sbin/httpd を実行したプロセスの属しているドメインの子ドメインとして作成されます).
先ほど作成したプロファイルの中から学習用のプロファイルを割り当ててみます(図13).引数の -r は,「 <kernel> /usr/sbin/httpd 」ドメイン配下のすべてのドメイン(ドメイン名が「 <kernel> /usr/sbin/httpd 」で始まるすべてのドメイン)を適用対象とするという意味です. ccs-setprofile コマンドでドメイン名を指定する場合,適切に引用符を付けてやらないと, < や > がシェルのリダイレクトとして解釈されてしまいますので注意してください.
■図13 学習用プロファイルを割り当て
# /usr/sbin/ccs-setprofile -r 1 '<kernel> /usr/sbin/httpd' 1 <kernel> /usr/sbin/httpd |
図13のコマンドを実行した後で,許可したい操作(たとえばページの閲覧や Wiki の操作)を行います.
ひととおりの操作が完了したら,今度は確認用のプロファイルを割り当ててみましょう(図14).確認用に作成したプロファイルでは,「 PREFERENCE::permissive={ verbose=yes } 」という指定がされているので,ポリシー違反が発生するとコンソールに「 WARNING: 」で始まるメッセージが表示されます.許可したい操作を行ってもこのメッセージが表示されないようであれば,許可したい操作を行うのに必要なアクセス許可がポリシーに含まれていることがわかります.
■図14 確認用プロファイルを割り当て
# /usr/sbin/ccs-setprofile -r 2 '<kernel> /usr/sbin/httpd' 2 <kernel> /usr/sbin/httpd |
また,この段階でポリシーのチューニングを行います.チューニングの手順については後述します.
ポリシーが完成したと判断したら,強制用のプロファイルを割り当てます(図15).
■図15 強制用プロファイルを割り当て
# /usr/sbin/ccs-setprofile -r 3 '<kernel> /usr/sbin/httpd' 3 <kernel> /usr/sbin/httpd |
これにより,「 <kernel> /usr/sbin/httpd 」ドメイン配下で動作するプログラムに対して,強制アクセス制御が適用された状態になります.
状態を確認するには,前回紹介した ccs-pstree コマンドを使用します. ccs-pstree コマンドの出力の行頭には,プロファイル番号が表示されています.保護したいアプリケーション(この例で言えば /usr/sbin/httpd )に意図したとおりのプロファイル番号が割り当てられていることを確認してください.
強制モードで動作するプロファイルを割り当てて初めて,強制アクセス制御により保護された状態になることに注意してください.
強制用のプロファイルでは,「 PREFERENCE::enforcing={ verbose=yes } 」という指定がされているので,ポリシー違反が発生するとコンソールに「 ERROR: 」で始まるメッセージが表示されます.
ポリシーでは必要なアクセスについて許可を与えることが必要ですが,プログラムによっては /tmp/ などのディレクトリにランダムな英数字やプロセスIDなどを名前に含むファイルを作成するものがあります.そうした場合には,学習モードで追加されたパス名だけでは正しく動作できません.
TOMOYO Linux では,こうした場合を想定して,ポリシーでのワイルドカードの使用に対応しています(図16).ワイルドカードを適切に使用することによりアクセス許可の数を減らし,メモリ消費を節約することができます.
■図16 TOMOYO Linux で使用可能なワイルドカード
|
\ 記号はパターンを表すためのエスケープ文字として使用されるため, \ 記号自身を表すときは \\ のように2つ重ねて使用します(画面に表示できない文字( ASCII 制御コードなど)や日本語文字は \ooo という8進数で表記します.).
パス名をパターン化する操作は,ポリシーエディタを用いて行うことができます. ccs-editpolicy を起動すると,「 <<< Domain Transition Editor >>> 」という画面が表示されます.そこから,「 <kernel> /usr/sbin/httpd 」というドメインを探してください.「 <kernel> /usr/sbin/httpd 」という行にカーソルを合わせてから「 Enter 」を押すと,「 <<< Domain Policy Editor >>> 」という画面が表示されるはずです(図17.表示される内容は環境により異なります).
■図17 Apache 用のポリシー
|
Webサーバは /var/www/ ディレクトリ以下のファイルをアクセスします.そこで, /var/www/html/ ディレクトリ以下のファイルの参照を許可するには,図18のように指定します.「 A 」を押して1行ずつ追加します(図19).
■図18 /var/www/html/ 以下の参照を許可する例
allow_read /var/www/html/\*
allow_read /var/www/html/\{\*\}/\*
|
■図19 Apache に対して /var/www/html/ 以下の参照を許可
|
アプリケーションによっては,テンポラリファイルを使用します.たとえば,図20のようなエントリが含まれていた場合,これらは /tmp/phpXXXXXX というパターンで作成されるテンポラリファイルであると考えることができます.そのため, /tmp/phpXXXXXX というパターンを TOMOYO Linux におけるワイルドカードで表記した /tmp/php\?\?\?\?\?\? というパターンで置き換えます.操作手順は,次のようになります.
■図20 テンポラリファイル
allow_read/write /tmp/phpAb9fD1 allow_read/write /tmp/phpkzqf5p allow_read/write /tmp/php3lo7ab |
まず,キーボードの「 A 」を押して,図20の内容をパターン化した「 allow_read/write /tmp/php\?\?\?\?\?\? 」というエントリを入力してください.次に,「 allow_read/write /tmp/php\?\?\?\?\?\? 」というエントリの行にカーソルを合わせてキーボードの「 O 」を押すと,「 allow_read/write /tmp/php\?\?\?\?\?\? 」に包含されているアクセス許可の行頭に & マークが表示されます.図20の内容について行頭に & マークが表示されていることを確認後,キーボードの「 D 」を押すと「 Delete selected entries? ('Y'es/'N'o) 」と尋ねられますので,キーボードの「 Y 」を押してください.
確認モードで動作させながら,必要なアクセス許可が与えられるまでチューニングを行ってください.
起動時は /sbin/ccs-init によってディスク上のポリシーがカーネルへと自動的にロードされますが,シャットダウン時はカーネル内のポリシーがディスクへと自動的にセーブされません.そのため,ポリシーの追加や削除を行ったり,プロファイルの割り当てを変更したりした場合,システムをシャットダウンさせる前に ccs-savepolicy を実行することを忘れないでください.
学習モードではポリシーは既存の内容に追加されますが,作成済みのポリシーを使用せず新規に学習を行いたい場合は, /etc/ccs/domain_policy.conf という名前のシンボリックリンクを削除して再起動します.
今回は実際にアクセス制御を行う手順と,Webサービスを保護する方法について紹介しました. TOMOYO Linux の基本的な操作方法は,前回と今回で説明した内容に含まれており,ここに書かれた内容を理解すれば,「 TOMOYO Linux を使える」と言って良いでしょう.
次回は, TOMOYO Linux のドメイン遷移について紹介します.どうぞお楽しみに.