いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.156 / 読者数:1304名

こんばんは、うすだです。

黄金週間まっただ中ですが、お休みを満喫されていますでしょうか。

弊社の休みは暦どおりですので、連休は昨日からスタートです。
ですので、昨日、「大型連休も後半になり…」とか TV などで聞く度に、 後半じゃないよ今日からだよ! と心の中で突っ込んでおりました。

しかし、5日間も休みがあるなあ、なんて思っていたら、 あっという間に休みが終わってしまうんですよね。
なるべく有意義に過ごせるよう、計画を立てておきたいと思います。

…って、休みはもう3日しか残ってませんね…ああ。

ちょっと萎えましたが、今回もはりきってまいりたいと思います。

今回のお題 - dnotify でディレクトリを監視する

われわれシステム管理者は、 悪いひとが侵入してこないよう阻止することを生業のひとつとしていますが、 侵入されたらいち早く気づいて対処することも、同じくらい必要なことだと思います。

たとえば、身に覚えがないのに、/etc 以下のファイルが知らぬ間に変更されていたり、 ファイルがなくなっていたりしますと、限りなく怪しい!ということになりますよね。

しかし、自分で定期的に確認するのは大変ですし、 ls -lR などの結果をメールで送るように仕込んでも、前との違いを見極めるのは、 やはり面倒です。それよりも、/etc 以下などで、 ファイルを作ったり消したり変更したりなどされた瞬間に、 そのことを知ることができれば、作業をもっと簡単にできます。

というわけで今回は、dnotify というものを使って、 ディレクトリ以下の状態の変化をいち早く知る方法を、ご紹介したいと思います。


dnotify というのは、ディレクトリや、 そのディレクトリ内のファイルに対して行われた操作を、 ユーザアプリケーションに通知する機能です。
Linux カーネル 2.4.19 以降で、dnotify が追加されているようです。

そして、dnotify という同じ名称のプログラムがあり、 dnotify の機能を簡単に使うことができます。
ですので、まずは、dnotify を入れるところから始めてみましょう。

Ubuntu など Debian 系のディストリビューションを使用されている貴兄は、 すでにパッケージがありますので、apt-get するだけです。

  # apt-get install dnotify       (root 権限で行う場合)
  $ sudo apt-get install dnotify  (一般ユーザで行う場合)

そうでない貴兄は、Debian のパッケージのソースをもとに、 パッケージを作ってください。
Fedora や CentOS など RPM な貴兄のための作成例を、以下に示します。

まず、ソース・アーカイブを、以下などから入手してください。

http://packages.qa.debian.org/d/dnotify.html
http://ftp.debian.org/debian/pool/main/d/dnotify/dnotify_0.18.0.orig.tar.gz

アーカイブの中に、spec ファイルの雛型がありますので、以下のようにして、 spec ファイルを作成します。

  $ tar xvfz dnotify_0.18.0.orig.tar.gz dnotify-0.18.0/dnotify.spec.in
  $ sed -e 's/@PACKAGE@/dnotify/;s/@VERSION@/0.18.0/' \
    -e 's/Copyright:/License:/;/Serial:/d' \
    dnotify-0.18.0/dnotify.spec.in > ~/rpmbuild/SPECS/dnotify.spec
  $ rm -rf dnotify-0.18.0

作成したら、アーカイブを所定の位置へ移動させ、 rpmbuild コマンドに RPM パッケージを作っていただきます。

  $ mv dnotify_0.18.0.orig.tar.gz ~/rpmbuild/SOURCES/dnotify-0.18.0.tar.gz
  $ rpmbuild -bb ~/rpmbuild/SPECS/dnotify.spec
  $ sudo rpm -i ~/rpmbuild/RPM/i386/dnotify-0.18.0-1.i386.rpm

もし、 gcc がないとか rpmbuild がないとか make がないなどと言われてしまいましたら、 それらのパッケージをインストールしてから、rpmbuild を再度実行してください。

  # yum install rpm-build
  # yum install gcc
  # yum install make

dnotify がインストールできましたら、早速動作確認してみましょう。

まず、確認用のディレクトリを作成します。
以下では、/tmp/usutest を、確認用として作成しています。

  $ mkdir /tmp/usutest

そして、以下のように、dnotify コマンドを実行します。

  $ dnotify -CD /tmp/usutest -e ls -l {}

実行すると待ち状態になりますので、別の端末から、 /tmp/usutest の下にファイルを作成してみましょう。

  $ touch /tmp/usutest/a

すると、dnotify コマンドを実行中の端末に、以下が出力されます。

  total 0
  -rw-r--r-- 1 usu adm 0 Apr 29 12:30 a

ちなみに、他のファイルを作ったり消したりしても、その瞬間に、 同様の出力が得られます。いろいろ試してみてください。

 

お試し実行ができたところで、一般的な使いかたをご紹介しましょう。
dnotify コマンドの書式は、以下の通りです。

  dnotify オプション ディレクトリ... [-e コマンド]

まず、オプションで、通知してほしい操作の内容を指定します。
以下に、主なオプションとその意味を示します。

  -C ファイルが生成されたとき
  -D ファイルが削除されたとき
  -M ファイルが変更されたとき
  -A ファイルがアクセスされたとき
  -R ファイル名が変更されたとき
  -B ファイルの属性(モードや所有者など)が変更されたとき
  -a 上記のすべて

先ほどの例では、-CD と指定しましたので、 ファイルの生成と削除の際に通知するよう指定していました。

そして、監視したいディレクトリを指定します。
先ほどの例では /tmp/usutest だけを監視しましたが、複数指定することもできます。

そして最後に、通知されたときに実行されるコマンドを、 -e オプションで指定します。 {} の部分は、対象のディレクトリ名に置換されます。
ちなみに、-e オプションを省略すると、echo {} が実行されます。


使いかたが、なんとなくわかりましたでしょうか。
それでは、以降で、監視の自動化を試みたいと思います。

まず、以下の単純なシェルスクリプトを作成しましょう。

  #!/bin/sh
  LANG=C /bin/ls -l $1 | /usr/bin/Mail -s "[notice] $1" $USER

これを、たとえば ~/dnotify-test.sh というファイル名で保存したら、 以下のように実行してみてください。

  $ chmod +x ~/dnotify-test.sh
  $ dnotify -CD /tmp/usutest -e ~/dnotify-test.sh {}

そして、先ほどと同様、/tmp/usutest にファイルを作成(もしくは削除)しますと、 自分宛に以下のようなメールが飛んできます。

  To: usu@usupi.org
  Subject: [notice] /tmp/usutest

  total 4K
  -rw-r--r-- 1 usu adm 0 Apr 29 12:30 a
  -rw-r--r-- 1 usu adm 5 Apr 29 15:23 b

対象のディレクトリを ls -l した結果を、メールで通知するようにしています。

 

これを、/etc に対して行えば、監視に使えそうです。
ただ、/etc 直下だけでなく、/etc/ssh などの下も監視したいですよね。
そんなときには、-r オプションを指定します。
-r オプションを指定しますと、 そのディレクトリ以下すべてを監視してくれます。
たとえば、以下のように、/tmp/usutest/dir というディレクトリを作成してから、 -r オプションつきで dnotify を実行します。

  $ mkdir /tmp/usutest/dir
  $ dnotify -CDMRr /tmp/usutest -e ~/dnotify-test.sh {}

そして、/tmp/usutest/dir 以下を変更などしますと、

  $ touch /tmp/usutest/dir/a

やはり、同様にメールが飛んできます。
(/tmp/usutest/dir の ls -l の結果であるところが、ややミソです。)

  To: usu@usupi.org
  Subject: [notice] /tmp/usutest/dir

  total 0K
  -rw-r--r-- 1 usu adm 0 Apr 29 15:35 a

さて、あとは、システムの起動とともに、自動的に動いてくれれば、 目的を達成できそうです。

いくつか方法が考えられますが、 ここでは init を使って実現してみたいと思います。
以下の1行を、/etc/inittab の最後に追加してみてください。

  dn:235:respawn:/usr/bin/dnotify -CDMRBr /etc -e /home/usu/dnotify-test.sh {}

そして、init に SIGHUP シグナルを送って、気づいてもらいます。

  # kill -HUP 1
  # ps uww -C dnotify
  USER     PID %CPU %MEM    VSZ   RSS TTY   STAT START   TIME COMMAND
  root    9363  0.0  0.2   1572   416 ?     Ss   15:46   0:00 \
  /usr/bin/dnotify -CDMRBr /etc -e /home/usu/dnotify-test.sh {}

上記のように、dnotify が動作していることを確認してください。
ただ、これですと、監視していることがバレバレですね。
まあ、今のところは、目をつぶっていただけますと幸いです。

さて、ほんとにこれで大丈夫か、動作確認してみましょう。
以下では、例としてパスワードを変更しています。

  # passwd usu
  Changing password for user usu.
  New UNIX password: (パスワードを入力)
  Retype new UNIX password: (パスワードを再入力)
  passwd: all authentication tokens updated successfully.

すると、2通来ますが、メールで通知されることが確認できます。

 

2通届くのもやや面倒ですが、もっと面倒なのは、 ls -l /etc の出力結果をメールで送られても、変更内容がよくわからない、 ということです。

ですので、前回の状態(ls -l)を残しておいて、変化があったときだけ、 その差分をメールするようにしてみました。

  #!/bin/sh
  LANG=C
  export LANG
  ESCNAME="`echo $1 | /usr/bin/tr / _`"
  PREVFILE="/usr/local/etc/dnotify/$ESCNAME"
  TEMPFILE="/usr/local/etc/dnotify/tmp-${ESCNAME}-$$"
  DIFFFILE="/usr/local/etc/dnotify/diff-${ESCNAME}-$$"
  trap "rm -f $TEMPFILE $DIFFFILE" 0 1 2 3 9 11 15
  /bin/ls -l $1 > $TEMPFILE
  if [ -f $PREVFILE ]; then
      /usr/bin/diff -u $PREVFILE $TEMPFILE > $DIFFFILE
      if [ "`/usr/bin/wc -c $DIFFFILE|/bin/awk '{print $1}'`" -gt 0 ]
      then
          /bin/cat $DIFFFILE | /usr/bin/Mail -s "[notice] $1" $USER
      fi
  else
      /bin/cat $TEMPFILE | /usr/bin/Mail -s "[notice] $1" $USER
  fi
  mv $TEMPFILE $PREVFILE

/usr/local/etc/dnotify というディレクトリ以下を使用するようにしています。 ですので、以下の手順であらかじめ作成してください。

  # mkdir /usr/local/etc/dnotify
  # chmod 700 /usr/local/etc/dnotify

そして、試しに、/etc/usutest というファイルを作成してみますと…

  # touch /etc/usutest

以下のようなメールが飛んできました。
まだまだ見やすいとは言いがたいですが、 ls -l の出力結果よりはわかりやすくなったのではないかと思います。

  Subject: [notice] /etc

  --- /usr/local/etc/dirnotify/_etc ...年月日は略...
  +++ /usr/local/etc/dirnotify/tmp-_etc-15387 ...年月日は略...
  ...中略...
  @@ -151,6 +151,7 @@
   -rw-r--r--  1 root root  807103 Jan  7  2007 termcap
   drwxr-xr-x  5 root root     224 Sep 25  2008 udev
   -rw-r--r--  1 root root     127 Mar 15  2007 updatedb.conf
  +-rw-r--r--  1 root root       0 May  3 22:44 usutest
   -rw-r--r--  1 root root    1488 May 10  2007 vimrc
   -rw-r--r--  1 root root    1488 May 10  2007 virc
   drwxr-xr-x  3 root root    4096 Oct 15  2008 vz

以上、dnotify を使ったディレクトリの監視方法を、ご紹介しました。

操作の種別がわからないのが難点ですが、ディレクトリは特定できますので、 そこそこ監視に使えるのではないかと思います。

十分な備えがあれば、憂いはそこそこ小さくできます。
気になる貴兄は、まず試しに実行してみてください。

宿題の答え

前回の宿題は、

  rdiff-backup の、バックアップ対象と管理用データのサイズの関連を
  調べてみましょう。

でした。

ファイルの数が増減する場合と、単一のファイルのサイズが増減する場合を、 簡単に計測してみました。

まずは、以下のように、ファイルの数を単純に増やしてみましょう。

  $ [ -d daiji ] && rm -rf daiji/* || mkdir daiji
  $ rm -rf daiji-backup
  $ cnt=0
  $ while [ $cnt -lt 100 ]; do
  > rdiff-backup daiji daiji-backup
  > echo `du -sk daiji|awk '{print $1}'` \
  `du -sk daiji-backup/rdiff-backup-data|awk '{print $1}'`
  > zcat /usr/share/doc/JF/CD-Writing-HOWTO.txt.gz > daiji/${cnt}.txt
  > cnt=`expr $cnt + 1`
  > sleep 2
  > done > result1.log

result1.log には、各行に、オリジナルのデータの容量と、 管理データの容量が記録されます。
たとえば、gnuplot で以下のように結果を見ますと、 見事に比例していることがわかります。

  $ gnuplot
  gnuplot> plot 'result1.log'
  gnuplot> quit

引き続き、ファイルの数を減らしてみましょう。

  $ while [ $cnt -gt 0 ]; do
  > rdiff-backup daiji daiji-backup
  > echo `du -sk daiji|awk '{print $1}'` \
  `du -sk daiji-backup/rdiff-backup-data|awk '{print $1}'`
  > cnt=`expr $cnt - 1`
  > rm -f daiji/${cnt}.txt
  > sleep 2
  > done > result2.log

同様に、result2.log に容量が記録されています。
以下のように、gnuplot で先ほどの result1.log とともに結果を見ますと、 管理データの容量が、先ほどよりも大きく増加しています。

  $ gnuplot
  gnuplot> plot 'result1.log', 'result2.log'

次に、単一のテキストファイルのサイズを増やしてみましょう。

  $ [ -d daiji ] && rm -rf daiji/* || mkdir daiji
  $ rm -rf daiji-backup
  $ cnt=0
  $ while [ $cnt -lt 100 ]; do
  > rdiff-backup daiji daiji-backup
  > echo `du -sk daiji|awk '{print $1}'` \
  `du -sk daiji-backup/rdiff-backup-data|awk '{print $1}'`
  > zcat /usr/share/doc/JF/CD-Writing-HOWTO.txt.gz >> daiji/text.txt
  > cnt=`expr $cnt + 1`
  > sleep 2
  > done > result3.log

ファイルの数を増やしたときよりも、 管理データの容量が大きく増加することがわかります。

そして、引き続き、テキストファイルのサイズを減らしてみましょう。

  $ while [ $cnt -gt 0 ]; do
  > rdiff-backup daiji daiji-backup
  > echo `du -sk daiji|awk '{print $1}'` \
  `du -sk daiji-backup/rdiff-backup-data|awk '{print $1}'`
  > cnt=`expr $cnt - 1`
  > lines=`expr $cnt \* $LINES`
  > tail -n $lines daiji/text.txt > text.txt
  > mv text.txt daiji/text.txt
  > sleep 1
  > done > result4.log

今度は、ファイルのサイズを増やしたときと同程度に、 管理データの容量が増加していきました。

あえて、結果のグラフは公開しないでおきます。(すみません…)
ぜひ、ご自身で実行して、確認してみてくださいませ。

今回の宿題

今回の宿題は、

  dnotify で監視していることを気づかれないよう細工してみましょう。

です。

本題での自動監視では、dnotify を実行していることが、 ps コマンドですぐにわかってしまいました。
限界はあると思いますが、なるべく、ぱっと見でばれないよう、細工してみてください。

あとがき

現在、ThinkPad X24 という、骨董品に近いノートPC をメインに使用していますが、 緩やかに調子が悪くなってきております。

いい加減、新しくしてもいいかなと思い、中古の ThinkPad を探し、 よい条件のものを見つけ出しました。

さあ買うぞ! と思い、購入ボタンを押す直前まできて、今月、 自動車税を支払わなければならないことに気がつきました。

4万円。よんまんえん。たいしたことのないようで、そうとも言い難い、 微妙な金額。ノートPC を買ってしまうと、 今月非常に厳しいことになることがわかってしまう金額。…ああ、ヨンマンエン。

…というわけで、購入ボタンが押せないまま、今日に至っております…。
(デュアルコアの夢は、夢で終わってしまいそうな気配です…。)

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、5月17日(日) 頃にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−クリマに出店します…うっかり申し込んでしまいました。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本