連載
» 2004年07月23日 00時00分 公開

止められないUNIXサーバのセキュリティ対策(最終回):Tripwireのポリシーを最適化する (2/3)

[木村靖,三井物産GTI]

1. セクションの定義

 ポリシーファイルをセクションによって区分させる。セクションは、@@sectionというディレクティブ【注】によって定義され、テンプレートではGLOBALとFSの予約された2つのセクションが定義されている。

ディレクティブ名 内容
@@section セクションを定義する。予約されているセクション名にはGLOBALとFSがある。GLOBALは、ポリシーファイル全体に適用されるセクションを意味する。また、FSはUNIX系OSの場合に指定するセクション名で、OSによって異なる(例えばWindowsの場合はNTFSなどを指定)
@@ifhost
@@else
@@endif
ifhost、else endifでホスト名による条件分岐を指定する。||により複数のホスト名を指定できる
@@print メッセージを標準出力(STDOUT)に出力。引数には出力するメッセージを指定する。主にデバッグ時に利用される
@@error メッセージを標準出力(STDOUT)に出力し、終了する。引数には出力するメッセージを指定する。主にデバッグ時に利用される
@@end ポリシーファイルの終わりを示す。@@end以降は無視する
表1 ディレクティブ名
【注】Tripwireのディレクティブ(命令語)には、表1に示すようなものがあるが、通常の運用では@@section以外は使うことはほとんどない。

・GLOBALセクション(@@section GLOBAL)

 GLOBALセクションには、ポリシーファイル全体に適用される変数が指定されている。例えば、RedHat Linux RPM付属のテンプレートの場合、以下のような変数が定義されている。なお、ポリシーでは、#から行末まではコメントとして扱われる。

TWROOT="/usr/sbin"; # Tripwireのトップディレクトリ
TWBIN="/usr/sbin"; # Tripwireの関連プログラムの格納先
TWPOL="/etc/tripwire"; # ポリシーファイルの格納先
TWDB="/var/lib/tripwire"; # Tripwireデータベースの格納先
TWSKEY="/etc/tripwire"; # サイトキーの格納先
TWLKEY="/etc/tripwire"; # ローカルキーの格納先
TWREPORT="/var/lib/tripwire/report"; # レポートの格納先
HOSTNAME=atmarkit.example.co.jp; # このホストのホスト名 
RedHat Linux RPM付属のテンプレート

・FSセクション(@@section FS)

 FSセクションには、FSセクション内で利用する変数やルールが指定される。ルールには、Tripwireの監査対象となるファイルや監査内容などを定義する。なお、ルールの詳細については、後述の「3. ルールの定義」で説明する。

2. 変数の定義

 各セクションには、GLOBALセクションで説明した変数や、例えば以下のような変数が定義されている。これらの変数値は、環境に応じて必要であれば変更する。なお、変数値に空白やスラッシュ(/)が含まれる場合は、ダブルクオート(")で囲む必要があるので注意すること。例えば、TWROOT変数には/usr/sbinという値がセットされている。

TWROOT = "/usr/sbin" ;
SEC_CRIT = $(IgnoreNone)-SHa ;
SEC_SUID = $(IgnoreNone)-SHa ;
SEC_BIN = $(ReadOnly) ;
SEC_CONFIG = $(Dynamic) ;
SEC_LOG = $(Growing) ;
SEC_INVARIANT = +tpug ;
SIG_LOW = 33 ;
SIG_MED = 66 ;
SIG_HI = 100 ;
変数の定義例

 また、上記のSEC_CRIT変数には、$(IgnoreNone)などのような置換変数が指定されている。置換変数は「$(変数名)」の形式で指定し、定義済みの変数を値に置換させたい場合に指定する。例えばSEC_CRIT変数には、「IgnoreNone変数の値-SHa」がセットされる。

 なお、変数名の中には、表2に示すとおり特殊な意味を持つ予約変数がある。これらは複数からなるプロパティ値(後述)を、分かりやすい変数名で利用できるようにしたものである。

変数名 内容
ReadOnly 読み取り専用ファイル
プロパティ値+pinugtsdbmCM-rlacSHと同じ意味を持つ
Dynamic 可変ファイル
プロパティ値+pinugtd-srlbamcCMSHと同じ意味を持つ
Growing サイズが増加するファイル
プロパティ値+pinugtdl-srbamcCMSHと同じ意味を持つ
Device デバイスファイル
プロパティ値+pugsdr-intlbamcCMSHと同じ意味を持つ
IgnoreAll すべてのプロパティを無視する
プロパティ値-pinugtsdrlbamcCMSHと同じ意味を持つ
IgnoreNone すべてのプロパティを有効にする
プロパティ値+pinugtsdrbamcCMSH-lと同じ意味を持つ
表2 特殊変数

3. ルールの定義

 FSセクションなどで定義されているルールでは、監査対象となるファイルの指定やどのような整合性チェックを行うかを定義する。一般的な書式は次のとおりとなる。

(ルール属性)
{
  オブジェクト名1 -> 置換変数1;
  オブジェクト名2 -> 置換変数2;
  オブジェクト名3 -> 置換変数3 (ルール属性);
  オブジェクト名4 -> プロパティ1;
  オブジェクト名5 -> プロパティ2;
  オブジェクト名6 -> プロパティ3 (ルール属性);
  (以下必要分を定義)
}
ルールの書式

 { }内が1つのルールとなり、最初の( )でそのルールに適用されるルール属性を定義する。

・ルール属性

 ルール属性には、表3で示すような値をセットする。{ }の前に定義した場合、属性はそのルール全体に適用され、オブジェクト名に指定した場合は、そのオブジェクトのみに適用される。

 例えば、Webページ関連の監査を行うために、ルール名「Web contents」を新たに定義したい場合は、以下のように追加すればよい。

(
  rulename = "Web contents",
  emailto = www@atmarkit.example.co.jp,
  severity = 100
)
{
  /www/htdocs -> $(ReadOnly) (recurse = true);
}
ルール名「Web contents」

 ( )内がこのルールの属性で、rulenameでWeb contentsというルール名を定義し、emailtoでこのルール内で違反が発生した際の連絡先を指定し、severityで重用度を100に設定している。また、オブジェクトごとの属性指定として、Webコンテンツが格納されているディレクトリの/www/htodcsに対しては、recurse = tureで/www/htdocs以下のすべてのファイルやディレクトリを監査対象とするように指定している。

属性名 意味
rulename ルール名を指定する
emailto ルール違反が発生した際の通知先メールアドレス-M (--email-report)オプションで使用される
severity 重要度を指定する。0から1000000の範囲で指定(デフォルトは0)
recurse 監査対象ディレクトリ内を再帰的にチェックする階層を指定
true(-1)、false(0)または、数値(-1から1000000)を指定
trueは、ディレクトリ内のすべてのファイルやサブディレクトリを再帰的にチェックし、逆にfalseはチェックしない。
表3 ルール属性

・オブジェクト名とプロパティ

 オブジェクト名には、主に監査対象となるファイルを定義し、プロパティにはオブジェクトに対する実際の監査内容を定義する(表4)。

属性名 意味
- プロパティをチェックしない
+ プロパティをチェックする
a アクセス時刻(ファイルへのアクセス時刻が変更)
b ブロック割り当て番号
c iノードの時刻
d iノードが存在するデバイスのID
g ファイルのグループID(gid)
i iノード番号
l サイズが増加したファイル
m 修正時刻(ファイルの修正時刻が変更)
n リンク番号(iノードの参照回数)
p ファイルパーミッション
r iノードによって示されるデバイスID
s ファイルサイズ
t ファイルタイプ
u ファイルの所有者ID(uid)
C CRC-32ハッシュ値
H Havalハッシュ値
M MD5ハッシュ値
S SHAハッシュ値
表4 プロパティ

 オブジェクトとプロパティの例を以下にいくつか示す。

/etc -> +p;
/etc -> -p;
/etc -> +pinugtsdbmCM-rlacSH;
/etcディレクトリに関する設定例

 上記はいずれも/etcディレクトリに関する設定例だが、1行目は/etcディレクトリのパーミッション(p)をチェックする(+)ことを示している。逆に、2行目のルールはチェックしない(-)ことを示している。

 3行目は、プロパティを複数指定した場合の例で、p、i、n、u、g、t、s、d、b、m、C、Mはチェックするが、-以降のr、l、a、c、S、Hはチェックしないことを示している。

 ただし、通常の運用では、こういったプロパティを個別指定するのではなく、表2に示した特殊変数の方を指定するのがよいだろう。ちなみに3行目のプロパティ値 +pinugtsdbmCM-rlacSHは、ReadOnly変数が同じ意味を持つ。

/etc -> $(ReadOnly);
特殊変数を用いた設定例

・オブジェクトをチェック対象外にしたい場合

 特定のオブジェクトをチェック対象外にしたい場合、オブジェクト名の前にエクスクラメーションマーク(!)を付け加えればよい。

! オブジェクト名 ;
オブジェクトをチェック対象外にする

 例えば、Webコンテンツディレクトリ/www/htdocs内のwhatsnew.htmlファイルのみチェック対象外としたい場合は、以下のとおり指定すればよい。

{
  /www/htdocs -> $(ReadOnly) (recurse = true);
  !/www/htdocs/whatsnew.html
}
チェックを対象外にする例

ポリシーの更新

 クリアテキストのポリシーファイルを修正したら、ポリシーファイルの暗号化・署名、およびデータベースの更新を行う。ポリシーの暗号化・署名は、前回説明したとおりとなる。

# twadmin -m P twpol.txt
Wrote policy file: /etc/tripwire/tw.pol
ポリシーの暗号化・署名

上記の例では、クリアテキストのポリシーファイル(twpol.txt)を基に、tw.polの暗号化・署名されたポリシーファイルを更新している。更新が完了したら、新しいポリシーファイルの内容をチェックするのを忘れずに行うこと。

# twadmin -m p
ポリシーファイルの内容の確認

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。