Info: Version 1.8.x is available.

English Page

Last modified: $Date: 2024-03-30 20:25:00 +0900 (Sat, 30 Mar 2024) $

第2章: TOMOYO Linux の初期化

このページでは、 TOMOYO Linux を使うために必要となる基本操作について説明します。


ステップ1:ポリシーの初期化

ファイルに対するアクセス制御だけを有効にしたい場合には

[root@tomoyo ~]# /usr/lib/ccs/init_policy --file-only-profile

を、全機能を有効にしたい場合には

[root@tomoyo ~]# /usr/lib/ccs/init_policy

を実行することで、ポリシーを初期化してください。

TOMOYO Linux のポリシーファイルが /etc/ccs/ ディレクトリの中に作成されます。


ステップ2:ポリシーエディタの使い方を学習する

/etc/ccs/ というオプションと一緒に、 TOMOYO Linux のポリシーエディタである ccs-editpolicy を実行すると、以下のような画面が表示されます。

[root@tomoyo ~]# /usr/sbin/ccs-editpolicy /etc/ccs/

editpolicy-domain-list1.png

この画面には、ドメインツリーが表示されています。現時点では、 <kernel> ドメインだけが定義されています。しかし、システムが動作するにつれて、 TOMOYO Linux は新しいドメインを作成してこのツリーに追加していきます。以下の画面ではたくさんのドメインが定義されています。

editpolicy-domain-list2.png

TOMOYO Linux における強制アクセス制御はドメインを単位として適用されます。全てのプロセスは1個のドメインに属しており、原則としてプログラムが実行される度に異なるドメインへと遷移します。ドメインの名前はプロセスの実行履歴として連結された文字列です。例えば、カーネルが属するドメインの名前は <kernel> 、カーネルから起動された /sbin/init が属するドメインの名前は <kernel> /sbin/init 、 /sbin/init から起動された /etc/rc.d/rc が属するドメインの名前は <kernel> /sbin/init /etc/rc.d/rc となります。この遷移規則の例外については後述します。

各行の2番目の数字に注目してください。

editpolicy-domain-profile-number.png

この数字はプロファイル番号と呼ばれるものです。プロファイル番号は0~255の整数値をとります。

w キーを押すと、選択肢が表示されます。

editpolicy-window-list.png

p キーを押すと、プロファイルの一覧が表示されます。

もし、 /usr/lib/ccs/init_policy を実行する際に --file-only-profile というオプションを指定していた場合、以下のエントリが表示されます。

editpolicy-profile-list-file-only.png

もし、 /usr/lib/ccs/init_policy を実行する際に --file-only-profile というオプションを指定しなかった場合、以下のエントリが表示されます。

editpolicy-profile-list.png

項目内容
PREFERENCE::audit アクセスログの取得方法に関する設定。
PREFERENCE::learning 学習モードに関する設定。
PREFERENCE::permissive 確認モードに関する設定。
PREFERENCE::enforcing 強制モードに関する設定。
COMMENT プロファイルの内容を説明するための1行コメント。
CONFIG 強制アクセス制御のモード設定。

PREFERENCE::learning PREFERENCE::permissive PREFERENCE::enforcing の verbose については以下の値を指定できます。

値 内容
no ポリシー違反のメッセージを表示しない。
yes ポリシー違反のメッセージを表示する。

CONFIG 行で指定されている mode については以下の値を指定できます。

値 内容
disabled 無効。通常のカーネルと同様に動作する。
learning 学習モード。ポリシーに違反してもエラーにせず、ポリシーへの自動追加を行う。
permissive 確認モード。ポリシーに違反してもエラーにせず、ポリシーへの自動追加も行わない。
enforcing 強制モード。ポリシーに違反したらエラーとする。

w キー、 e キーの順に押すことで、以下の画面が表示されます。

editpolicy-exception-list1.png

矢印キーや Home/End/PageUp/PageDown キーを使ってスクロールすることができます。

この画面には以下の例外設定が表示されます。

(1) パス名のパターン

file_pattern というキーワードを使用して、パス名のパターンを登録します。アクセス許可を学習する際に、要求されたパス名が file_pattern というキーワードを使用して登録されたパス名のパターンと一致した場合、パターン化されたパス名でアクセス許可が学習されます。
目安としては以下のものが挙げられます。

  • /proc/PID/ ディレクトリ以下に存在するファイルのパス名
  • /sys/ ディレクトリ以下に存在するファイルのパス名(カーネル 2.6 系の場合のみ)
  • /dev/ ディレクトリ以下の一部のパス名
  • /etc/ccs/ ディレクトリ以下のポリシーファイルのパス名
  • マニュアルページのパス名
  • スプールディレクトリのパス名
  • メールの送受信時に作成されるテンポラリファイルのパス名
  • man コマンドが作成するテンポラリファイルのパス名
  • mount コマンドが作成するテンポラリファイルのパス名

システムにインストールされているアプリケーションやその設定により、上記以外にもパターン化されたパス名が必要になります。不足しているパターンは、実際にどのようなアクセスが行われるかを観察してから、適切にパターン化して追加します。

(2) パス名のグループ

path_group というキーワードを使用して、パス名のパターンを登録します。これは、複数のパス名を集約することでポリシーの記述量を減らすためのマクロです。使い方は後述します。

(3) 数値のグループ

number_group というキーワードを使用して、数値のパターンを登録します。これは、複数の数値を集約することでポリシーの記述量を減らすためのマクロです。使い方は後述します。

(4) アドレスのグループ

address_group というキーワードを使用して、 IPv4 または IPv6 アドレスのパターンを登録します。これは、複数の IP アドレスを集約することでポリシーの記述量を減らすためのマクロです。使い方は後述します。

(5) 無条件に読み込みを許可するファイル

allow_read というキーワードを使用して、全てのプログラムへの読み込みアクセスを許可するファイルのパス名を登録します。パターンも使用できます。読み込みモードで要求されたパス名が allow_read というキーワードを使用して登録されたパス名と一致した場合、ドメインポリシーで明示的に許可が与えられていなかった場合でも読み込みアクセスが許可されます。
目安としては以下のものが挙げられます。

  • ldconfig に登録されている共有ライブラリ
  • /proc/ ディレクトリ以下に存在するファイルの一部
  • /usr/share/locale/ ディレクトリ以下に存在するロケールデータの一部

システムにインストールされているアプリケーションやその設定により、上記以外にも常に読み込みアクセスを許可したいファイルがあるかもしれません。不足しているファイルは、実際にどのようなファイルを読み込むかを観察してから、必要に応じてその都度追加していきます。

(6) 無条件に受け取ってよい環境変数名

allow_env というキーワードを使用して、全てのプログラムが受け取ってよい環境変数の名前を登録します。パターンも使用できます。プログラムの実行時に渡された環境変数の名前が allow_env というキーワードを使用して登録された名前と一致した場合、ドメインポリシーで明示的に許可が与えられていなかった場合でも受け取りが許可されます。
目安としては以下のものが挙げられます。

  • PATH や HOME のように、どのようなプログラムに渡されても構わないような環境変数名

システムにインストールされているアプリケーションやその設定により、上記以外にも常に許可したい環境変数名があるかもしれません。不足している環境変数名は、実際にどのような環境変数名が使われているかを観察してから、必要に応じてその都度追加していきます。

(7) 書き換えを禁止するファイル

deny_rewrite というキーワードを使用して、既に記録されている部分の書き換えを禁止したいファイル(ログファイル等)のパス名を登録します。パターンが使用できます。 deny_rewrite というキーワードを使用して登録されたファイルは、後述するドメインポリシーの中で明示的に allow_rewrite というキーワードを用いて許可が与えられない限り、追記ではない書き込みモードでのオープンとファイルの切り詰めが禁止されます。
目安としては以下のものが挙げられます。

  • /var/log/ ディレクトリ以下のファイル

システムにインストールされているアプリケーションやその設定により、上記以外にも書き換えを禁止したいファイルがあるかもしれません。不足しているファイルは、実際にどのようなファイルが追記専用で使われているかを観察してから、必要に応じてその都度追加していきます。

(8) プログラム名の集約

複数のプログラムを単一のプログラム名で扱うには、 aggregator というキーワードに続けて集約前のプログラム名と集約後のプログラム名を指定します。集約前のプログラム名にはパターンを使用できます。
例えば、 /usr/bin/tac と /bin/cat は似ているので、 aggregator /usr/bin/tac /bin/cat という指定をすることで /usr/bin/tac を /bin/cat のドメインで実行することができるようになります。

(9) ドメイン遷移を初期化するプログラム

initialize_domain というキーワードを使用して、ドメイン遷移履歴をリセットするプログラムのパス名を登録します。パターンは使用できません。 initialize_domain というキーワードを使用して登録されたパス名のプログラムが実行された場合、そのプログラムは <kernel> 直下のドメインで動作します。
目安としては以下のものが挙げられます。

  • /etc/init.d/ ディレクトリ以下にあるデーモンプログラム等を起動・終了させるためのスクリプト
  • 上記スクリプトから起動されるデーモンプログラムの内、ドメイン名を短くしたいもの(httpd や sshd など)

システムにインストールされているアプリケーションやその設定により、上記以外にもドメイン遷移履歴をリセットさせたいプログラムがあるかもしれません。最初にドメイン遷移履歴を作成して、実際にどのようなプログラムを指定したらよいかを考慮しながら、必要に応じてその都度追加していきます。その際、他のドメインへの影響に注意してください。例えば、ドメインポリシーとして

<kernel> ... /bin/bash
use_profile 3
allow_execute /bin/tcsh

<kernel> ... /bin/bash /bin/tcsh
use_profile 3
allow_execute /bin/cat

<kernel> ... /bin/bash /bin/tcsh /bin/cat
use_profile 3
allow_read /etc/fstab

というポリシーが既に存在している状態で /bin/tcsh を initialize_domain として追加した場合、 /bin/tcsh は <kernel> /bin/tcsh というドメインへ遷移することになるため、 <kernel> ・・・ /bin/bash /bin/tcsh というドメインへは遷移できなくなってしまいます。そのような場合は、以下のように、 <kernel> ・・・ /bin/bash /bin/tcsh で始まる部分を <kernel> /bin/tcsh で始まるようにドメインポリシーを変更してやる必要があります。

<kernel> ... /bin/bash
use_profile 3
allow_execute /bin/tcsh

<kernel> /bin/tcsh
use_profile 3
allow_execute /bin/cat

<kernel> /bin/tcsh /bin/cat
use_profile 3
allow_read /etc/fstab
(10) ドメイン遷移を初期化させないプログラム

no_initialize_domain というキーワードを使うことで、 initialize_domain キーワードの効果を打ち消すことができます。特定の条件下ではドメイン遷移を初期化させたくない場合に使用します。

(11) ドメイン遷移を行わないドメイン

keep_domain というキーワードを使用して、ドメイン遷移を行わないドメインを指定することができます。
例えば、 keep_domain <kernel> /usr/sbin/sshd /bin/tcsh という行が含まれている場合、 <kernel> /usr/sbin/sshd /bin/tcsh というドメインに属しているプロセスは、 initialize_domain というキーワードで指定されたプログラムが実行されない限り、そのドメインに留まります。

(12) ドメイン遷移を行うドメイン

no_keep_domain というキーワードを使うことで、 keep_domain キーワードの効果を打ち消すことができます。特定の条件下でドメイン遷移を行わせたい場合に使用します。

(13) 予約するローカルポート番号

deny_autobind というキーワードを使用して、ポートの自動選択機能によって割り当てられてしまうことを防ぐことができます。
特定のサービスが使用するポート番号が、ポートの自動選択機能によって割り当てられてしまうことで、そのサービスの動作に影響を与える場合があります。 このキーワードを使うことで、ポートの自動選択機能によって割り当てられてしまうことを防ぐことができます。

q キーを押してポリシーエディタを終了してください。

以後、必要に応じてポリシーエディタのチュートリアルページであるポリシーエディタの使い方を参照してください。


ステップ3:アクセスログ取得の設定(省略可)

TOMOYO Linux は、「アクセス許可ログ」(ポリシーに違反しなかったアクセス要求のログ)と「アクセス拒否ログ」(ポリシーに違反したアクセス要求のログ)を記録することができます。
アクセスログはドメインポリシーの形式と同じであり、そのままドメインポリシーへと追加することができます。「アクセス拒否ログ」に記録された要求の中で、許可すべきものと判断したものをドメインポリシーに追加してください。

アクセス許可ログ /proc/ccs/grant_log とアクセス拒否ログ /proc/ccs/reject_log をカーネルから読み出してファイルに保存する為に、 ccs-auditd というデーモンプログラムを利用できます。以下のコマンドを /etc/rc.local 等から実行するようにしてください。

/usr/sbin/ccs-auditd アクセス許可ログの保存場所 アクセス拒否ログの保存場所

アクセス許可ログを保存する必要が無い場合は、プロファイルで PREFERENCE::audit={ max_grant_log=0 } という指定をして、アクセス許可ログの保存場所として /dev/null を指定することができます。 ccs-auditd にはフィルタリング機能がありませんので、アクセス許可ログを保存する場合はディスク容量に注意してください。

アクセス拒否ログを保存する必要が無い場合は、プロファイルで PREFERENCE::audit={ max_reject_log=0 } という指定をして、アクセス拒否ログの保存場所として /dev/null を指定することができます。アクセス拒否ログは保存しておくことを推奨します。この手順書では、アクセス拒否ログを /var/log/tomoyo/reject_log.conf に保存するものとします。

/usr/sbin/ccs-auditd /dev/null /var/log/tomoyo/reject_log.conf

アクセスログを保存するディレクトリは予め作成しておいてください。

[root@tomoyo ~]# mkdir -p /var/log/tomoyo

logrotate によるローテーションを行わせたい場合は、以下のような内容のファイルを /etc/logrotate.d/tomoyo に作成してください。なお、 nocreate オプションを必ず指定してください。 nocreate オプションを忘れると、最初のローテーションが実行されて以降のログが保存されなくなってしまいます。

/var/log/tomoyo/reject_log.conf {
  weekly
  rotate 9
  missingok
  notifempty
  nocreate
}

アクセス許可ログ・アクセス拒否ログのどちらも保存しない場合には ccs-auditd を実行する必要はありません。また、プロファイルで PREFERENCE::audit={ max_grant_log=0 max_reject_log=0 } を指定しておくことで、消費メモリの節約と応答速度の向上が期待できます。


ステップ4:ポリシー違反の発生をメールで通知するよう設定(省略可)

TOMOYO Linux では、メールなどの通知手段を予め設定しておくことにより、強制モードにおけるポリシー違反の発生を報告することができます。

通知のために cron デーモンを使うことができます。例えば、1時間に1回まで root@example.com 宛のメールで通知するには

00 * * * * root /usr/lib/ccs/ccs-notifyd 0 'mail root@example.com'

という行を /etc/crontab に追加してください。


ステップ5:システムの再起動

システムを再起動して、起動時に TOMOYO Linux 対応カーネルを選択してください。

[root@tomoyo ~]# reboot

目次へ戻る

sflogo.php