Info: Version 1.3 is available.
Last modified: $Date: 2011-07-01 13:55:23 +0900 (Fri, 01 Jul 2011) $
ほとんどのユーザはこの章と次の章で紹介されているツールだけで足りるはずである。
現在のポリシーを /proc/ccs/policy/ ディレクトリから読み込み、編集を行う。
コマンドラインパラメータとして s e d のいずれかの文字を指定することで最初に表示される画面を指定できる。省略すると最初にドメイン一覧表示画面が表示される。
以下のキーを使用して操作する。
<全画面共通のキー>
q/Q | 終了する。 |
r/R | 最新の情報に更新する。 |
↑ | 1行上へ移動する。 |
↓ | 1行下へ移動する。 |
PageUp | 1画面上へ移動する。 |
PageDown | 1画面下へ移動する。 |
<システムポリシー編集画面でのみ有効なキー>
a/A | エントリを追加する。 |
d/D | エントリを削除する。 |
Tab | 例外ポリシー編集画面へ移動する。 |
<例外ポリシー編集画面でのみ有効なキー>
a/A | エントリを追加する。 |
d/D | エントリを削除する。 |
Tab | ドメイン一覧表示画面へ移動する。 |
<ドメイン一覧表示画面でのみ有効なキー>
a/A | ドメインを作成する。 |
d/D | 選択中のドメイン以下を削除する。 |
Tab | システムポリシー編集画面へ移動する。 |
Enter | 選択中のドメインに対するアクセス許可編集画面へ移動する。 |
@ | ドメインを検索する。 |
← | 逆方向へドメインを検索する。 |
→ | 順方向へドメインを検索する。 |
<ドメインに対するアクセス許可編集画面でのみ有効なキー>
Enter | ドメイン一覧表示画面に戻る。 |
a/A | アクセス許可を追加する。 |
d/D | アクセス許可を削除する。 |
このプログラムはファイル名を記憶するメモリ領域を節約するために、初出のファイル名を動的メモリに保存して、以後、同名のファイル名が現れた場合にはそのメモリのポインタを返すようにしている。そのため、この動的メモリはプログラムが終了するまで解放されない。
同じ事が TOMOYO Linux カーネルにも当てはまる。カーネルがファイル名を記憶しておくために割り当てたメモリは解放されない。そのため、永遠に学習モードで稼働していると、システムがメモリ不足に陥る可能性があるので注意が必要である。 ただし、実際のドメインの数やアクセス許可を与えるファイルの数にもよるが、 TOMOYO Linux カーネルが消費するRAMはほとんどの環境では1MB以内であろう。
カーネルがアクセスログを記憶するためのRAMは動的に確保され、ユーザランドプログラムから読み出され次第そのRAMは解放される。カーネルが記憶可能なアクセスログの件数には上限を設けているため、アクセスログを読み出さなくともカーネルが全てのRAMを消費してしまうことが無いようになっている。
ディスク上のポリシーをカーネルに読み込む。
以下のコマンドラインオプションを指定可能である。
現在の制御レベルの変更( /proc/ccs/status への書き込み)を行う。
コマンドラインパラメータで制御レベルを指定する。コマンドラインパラメータの有無に関係なく現在の制御レベルを表示する。
/proc/ccs/ への書き込みは /root/security/manager.txt に記述されたプログラムのみが行える。ポリシー策定時はシェルや /bin/cat 等も指定しても構わないが、システム運用時は loadpolicy editpolicy setlevel だけを指定するべきである。
カーネル内のポリシーをディスクに保存する。
以下のコマンドラインオプションを指定可能である。
/dev 用のファイルシステム SYAORAN 用の設定ファイルである syaoran.conf を作成する。ルートファイルシステムが読み込み専用の場合や /dev ディレクトリ内のデバイスファイルの改ざんを防止したい場合に使用する。
syaoran.conf に記録されていないファイルは作成できないので、動的にデバイスファイルが作成される環境の場合はこのプログラムを実行する前に全てのデバイスを接続し、必要なデバイスファイルが全て syaoran.conf に記録されるように注意する。
/proc/ccs/info/grant_log および /proc/ccs/info/reject_log の内容をコマンドラインで指定された場所に保存する。
コマンドラインの最初のパラメータがアクセス許可ログを保存するファイル名、2番目のパラメータがアクセス拒否ログを保存するファイル名である。ファイル名として /dev/null を指定しても良い。アクセスログをファイルに保存する必要が無い場合は実行する必要はない。
デーモンとして動作するので、 RedHat Linux の場合、 /etc/rc.d/rc.local で起動すればよい。 /proc/ccs/info/grant_log および /proc/ccs/info/reject_log に保持できる件数は、プロファイルの「MAX_GRANT_LOG=数値」および「MAX_REJECT_LOG=数値」という行で指定できる。
標準入力からドメイン用ポリシーの内容を受け取り、書き込み許可を含むパーミッションに対してパス名が存在するかどうかをチェックし、存在しなかったパス名を表示する。
存在しなかったパス名はテンポラリなパス名として使用されている可能性が高いので、同様のパス名から規則性を判断して /root/security/exception_policy.txt および /proc/ccs/policy/exception_policy にパターン化したパス名を追加していく。
コマンドラインパラメータとして --all が指定された場合、全ての存在しないパス名を表示する。
/root/security/domain_policy.txt または /proc/ccs/policy/domain_policy の内容をリダイレクトまたはパイプを使用して標準入力へ渡せばよい。
/etc/ld.so.cache に登録されている共有ライブラリファイルのパス名の変化を検出し、自動的に allow_read キーワードを使って例外ポリシーに登録する。
このプログラムをソフトウェアのアップデート時に実行しておくことで、共有ライブラリファイルのパス名が変化したために共有ライブラリファイルへアクセスできないことが原因でプログラムの起動に失敗するというエラーを回避することができる。
ポリシー違反を検出し、要求されたアクセスの内容を表示する。管理者は、その内容の妥当性を判断して許可(あるいは許可およびポリシーへの追加)あるいは拒否をシステムに伝えることができる。
このプログラムをソフトウェアのアップデート時に実行しておくことで、アクセス許可の不足によるエラーを回避することができる。
無条件に要求されたアクセスを許可しないこと。ポリシー違反の原因はパッケージの更新によって発生するものとは限らず、攻撃者による悪意ある要求の可能性もある。もし、攻撃者による悪意ある要求に対して許可を与えてしまった場合、システムに侵入されることになる。
このプログラムを使うには、 /proc/ccs/status の「MAX_ENFORCE_GRACE=数値」という行に適切な最大遅延時間(秒)を指定する必要がある。
この章で説明しているプログラムは、ログイン認証の強化を行う場合のみ使用する。
kill 等の内部コマンドを持たないシェルである。 /etc/passwd でログインシェルとして指定する。不正ログイン対策として追加のログイン認証を行う場合のみ使用する。
追加のログイン認証を行うためのプログラムは自分で作成することを推奨する。以下のサンプルプログラムをそのまま使用してはいけない。
正しいタイミングで正しいパスワードを入力しないと認証が失敗する。通常の認証ではパスワードを入力するタイミングはチェックしないが、このプログラムではタイミングもチェックすることで、総当り攻撃を防止する。
親プロセスが起動してから10秒以内に起動して正しいパスワードを入力しないと認証が失敗する。通常の認証では、認証を開始するまでの時間制限を設けていないが、このプログラムでは一定時間内に認証を開始しないと認証が成功しないようにすることで、総当り攻撃を防止する。
パスワードを入力するためのプロンプトが表示されるが、パスワードの入力内容はチェックせず、 /tmp/.lockme というファイルの有無で認証を行う。普段はロックされた状態にしておくことで、総当り攻撃を防止する。このプログラムはデモ用であり、攻撃者が一目で正解だと判るようなファイル名を使用している。利用する場合は必ずカスタマイズすること。
これらのプログラムは時間同期方式でトークンを生成する。 gettoken が生成したトークンを checktoken に渡すことで認証が成功するようになっている。これらはデモ用プログラムであり、トークンの生成アルゴリズムも貧弱である。利用する場合は必ずカスタマイズすること。
このプログラムを実行すると、チャレンジとして文字列が表示される。表示された文字列の中から、レスポンスとして数字のみを抽出したものを入力することで認証が成功する。このプログラムはデモ用であり、アルゴリズムが単純すぎる。利用する場合は必ずカスタマイズすること。
この章で説明しているプログラムは、ルートファイルシステムを読み込み専用で運用する場合のみ使用する。
ルートファイルシステムを読み書きモードで再マウントし、スワップパーティションをマウントする。また、 /initrd/ にマウントされた initrd.img を強制的にアンマウントする。
カーネルのコマンドラインに readonly という文字列が含まれていた場合はルートファイルシステムを読み書きモードで再マウントしない。また、 noswap という文字列が含まれていた場合はスワップパーティションをマウントしない。
ルートファイルシステムのループバックマウントを行うための linuxrc を含んだ初期RAMディスクである。ルートファイルシステムがループバックマウントで動作するイメージファイルの場合のみ使用する。ループバックマウントは、このプログラムを使用せずとも標準の nash スクリプトで実現できるが、 nash スクリプトの場合はエラーハンドラが存在しないため、カーネルパニックになるまで停止できない。このプログラムでは、エラーが発生した時点で停止するようになっている。
置き換える前の linuxrc ( nash スクリプト)が linuxrc.org という名前で存在する場合、それを読み込み、 insmod または sleep で始まる行を実行する。 insmod は外部コマンドを使用するので、 initrd.img の中に含めておく必要がある。ただし、 insmod を実行するために共有ライブラリファイルを必要とする場合、 initrd.img が大きくなってしまうので、 initrd.img で組み込むべきモジュールはカーネルコンパイル時にビルトインしてしまうことを推奨する。
ループバックマウントしたイメージファイルの中に /.linuxrc というファイルが存在する場合、それを実行する。
イメージファイルの場所はカーネルのコマンドラインから ROOTIMG= で指定する。デフォルトは /rootimg である。
イメージファイルを含むデバイスは root= で指定する。ただし、 /dev/sda のようにデバイスファイル名で指定する必要がある。( nash ではないので root=LABEL=/ という指定は認識できない。)
イメージファイルのファイルシステムタイプは IMAGE= で指定する。また、イメージファイルを含むデバイスのファイルシステムタイプは CONTAINER= で指定する。なお、ファイルシステムタイプが ext2 ext3 iso9660 vfat reiserfs xfs jfs のいずれか場合は自動認識するので省略できる。
この章で説明しているプログラムは、必要最低限のファイルを含む最小サイズのルートファイルシステムを作成する場合のみ使用する。
標準入力からハードリンクすべきファイルの一覧を受け取り、ハードリンクを作成する。これは、コピー元においてハードリンクされていたファイルを、コピー先においてもハードリンクされた状態を実現するために使用する。ハードリンクを一覧表示するプログラムと作成するプログラムを分離しているのは、コピー先がコピー元の一部に含まれていると都合が悪い場合があったり、コピー元とコピー先が別マシンであったりするような場合に対処するためである。
ハードリンクされたファイルの一覧を表示する。このプログラムの出力をファイルに保存後、 makelink に渡す。
標準入力からシンボリックリンクすべきファイルの一覧を受け取り、シンボリックリンクを作成する。シンボリックリンクとハードリンクが相互に依存している場合があるので、ハードリンク作成プログラムと交互に使用する。
シンボリックリンクされたファイルの一覧を表示する。このプログラムの出力をファイルに保存後、 makesymlink に渡す。