[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+] |
昔から、特定のファイルなどの書き込みを監視できないかと思っていましたが、
Dazukoという便利なものを見つけました。
Linux のアンチウィルスソフトによく使われているようですが、
とりあえず /etc 直下の書き込みの監視に使ってみました。
Dazuko 自体は Linux の他に FreeBSD にも対応していますが、
今回は Linux 上で試しました。
試した環境は、Vine Linux 2.5R です。カーネルは、2.4.22 です。
Dazuko は、試した当時の安定版である 2.0.2 を使用しました。
Dazuko は、カーネル・モジュールとして動作します。
sys_call_table[] を書き換えて、open などのシステムコールが呼ばれたときに、
Dazuko のラッパー関数(linux_dazuko_sys_open など)が呼ばれるようにします。
そして、あらかじめユーザが指定したパスと一致すると、ユーザにその旨を通知するようにします。
# パスの登録や通知を得るためには、write システムコールを用います。
…詳しくは、ソースコードをご覧ください。
長いように見えますが、共通部分は dazuko_xp.c に、
Linux(カーネル2.4)依存部分は dazuko_linux.c で、
この2つのファイルを眺めれば、何をやっているかだいたいの見当がつきます。
# example_c/examle.c も見たほうがいいかもしれません。
まず、カーネルのソースコードを準備します。
/usr/src/linux 以下に何もなければ、ソースを入手してください。
(例えば kernel-source パッケージをインストールします。)
ソースを入れただけの状態でしたら、せめて make menuconfig などしておきます。
私は以下のようにしておきました。
# cd /usr/src/linux # cp -p configs/kernel-2.4.22-i686.config .config # make oldconfig |
次に、Dazuko のサイト から、
dazuko-2.0.2.tar.gz をダウンロードして、展開します。
あとは、configure と make を実行するだけです。
# tar xfz dazuko-2.0.2.tar.gz # cd dazuko-2.0.2 # ./configure # make |
そして、できたカーネル・モジュール(dazuko.o)をインストールします。
さらに、デバイスのメジャー番号を調べ、デバイスファイルを作成しておきます。
# insmod dazuko.o # grep dazuko /proc/devices 253 dazuko # mknod -m 600 /dev/dazuko c 253 0 |
example という、指定したパスを監視して、
逐一標準出力に出力してくれるサンプルプログラムが同時にできています。
これを、以下のように実行します。
# mkdir /tmp/z # ./example /tmp/z registered with Dazuko successfully set access mask successfully set scan path successfully |
ここで、別の端末から、ls /tmp/z などとしますと、以下のような出力が得られます。
OPEN uid:68 pid:5860 mode:0 flags:100352 file_uid:0 file_gid:0 \ file_device:771 file_size:4096 file:/tmp/z CLOSE uid:68 pid:5860 file:/tmp/z |
OPEN にある mode や flags の値は、sys_open に渡される値そのままです。
他にも、いろいろアクセスして試してみてください。
では、本題の /etc への書き込みの監視をしたいと思います。
新たにプログラムを作成するのは面倒ですし、example はよくできていますので、
これをそのまま利用します。
ただし、まるっきりそのままですと、読み込みなど監視する必要のないアクセスもすべて出力してくれてしまいます。
そこで、必要最小限の出力だけにするフィルタを作成します。
flags は、open システムコールの第2引数と同じものです。 O_RDWR(==2) か O_WRONLY(==1) のアクセスだけに限定すればいいので、 flags & 3 が 0 でなければ書き込みということになります。
というわけで作成した Perl スクリプトが、以下です。
# cat writecheck.pl #!/usr/bin/perl use strict; if($#ARGV != 1) { print STDERR "Usage: $0 example_path check_path\n"; exit 1; } my $EXAMPLE = shift; my $CHECKDIR = shift; if(open(DAZUKO, "$EXAMPLE $CHECKDIR|")) { while(<DAZUKO>) { chop; my $line = $_; if(/flags:(\d+)/) { my $flags = $1; if($flags & 3) { print "$line\n"; #`/usr/bin/logger -p kern.notice dazuko:$line`; } } } close DAZUKO; } else { die "cannot exec $EXAMPLE."; } |
以下のように、example のパスと監視したいパスを指定して実行します。
# ./writecheck.pl ./example /etc OPEN uid:0 pid:8684 mode:438 flags:33857 file_uid:0 file_gid:0 \ file_device:771 file_size:0 file:/etc/z OPEN uid:0 pid:8855 mode:438 flags:33857 file_uid:0 file_gid:0 \ file_device:771 file_size:2 file:/etc/z |
logger の実行箇所をコメントアウトしてありますが、 このコメントを外すと syslog にも出力します。
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-] | |
usu@usupi.org | Last modified : Sat Jul 31 00:45:40 2004 |