Last-Modified: 2002-03-19(Tue)

by たけ(tk)

たけ(tk)のホームページへ

スクリプトの追っかけ

Unix 流に慣れるには「スクリプトの追っかけ」になれる必要がありそうだ。

課題:システムからルート宛に送られてくるメールのうち、不必要なものは受け取りたくない。

たとえば、次のようなメールが届く。これはユーザが印刷した、というだけの情報だ。これの受け取り拒否を設定してみよう。

Unusual System Events
=-=-=-=-=-=-=-=-=-=-=
Nov 28 12:41:34 EDiCube-01 kernel: parport0: PC-style at 0x378 [SPP]
Nov 28 12:41:34 EDiCube-01 kernel: parport0: no IEEE-1284 device present.
Nov 28 12:41:34 EDiCube-01 kernel: lp0: using parport0 (polling).
対策:

(1)メールの時刻を見る。

この種のメールは毎時刻01分に送られてくる。ということは crontab で hourly で送られてくるのだろう。

(2)crontab を見る。

    [root@EDiCube-01 /root]# cat /etc/crontab

    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    HOME=/
    # run-parts
    01 * * * * root run-parts /etc/cron.hourly
    02 4 * * * root run-parts /etc/cron.daily
    22 4 * * 0 root run-parts /etc/cron.weekly
    42 4 1 * * root run-parts /etc/cron.monthly

    [root@EDiCube-01 /root]#
これを見ると、/etc/cron.hourly が次の調査対象であることがわかる。

(3)/etc/cron.hourly を見る。

    [root@EDiCube-01 /root]# ll /etc/cron.hourly/

    total 8
    -rwx------   1 root     root           29 Aug 10  2000 logcheck*
    -rwx------   1 root     root           25 Aug 10  2000 rmmod*

    [root@EDiCube-01 /root]#
/etc/cron.hourly/ というのはディレクトリらしい。その中に2個のファイルが入っている。おそらく、run-parts というのは、指定されたディレクトリに入っているスクリプトを実行するものだろう。とすると、2個のファイルのうちのどちらかがメールを送っている可能性が高い。「logcheck」はログ点検、ということはこれが怪しい。

(4)/etc/cron.hourly/logcheck を見る。

    [root@EDiCube-01 /root]# cat /usr/sbin/logcheck
う。長い・・。落ち着いて見たいので samba/public にコピーして Windows のエディタで見ることにしよう。(vi で覗いてうかつに変更してしまうとまずそうだ)。

    [root@EDiCube-01 /root]# cp /usr/sbin/logcheck /home/samba/public/
    [root@EDiCube-01 /root]# chmod +r /home/samba/public/logcheck
Windows のエディタで(印刷して)見てみると、最後のほうに次のような部分が見つかる。

      # Do reverse grep on patterns we want to ignore
    if [ -f "$IGNORE_FILE" ]; then
        if $GREP -v -f $IGNORE_FILE $TMPDIR/check.$$ > $TMPDIR/checkoutput.$$; then
            echo >> $TMPDIR/checkreport.$$
            echo "Unusual System Events" >> $TMPDIR/checkreport.$$
            echo "=-=-=-=-=-=-=-=-=-=-=" >> $TMPDIR/checkreport.$$
            cat $TMPDIR/checkoutput.$$ >> $TMPDIR/checkreport.$$
            FOUND=1
        fi
    fi
メールに書いてあった「Unusual System Events」「=-=-=-=-=-=-=-=-=-=-=」を出しているのはこの部分だ。

中身の部分は「cat $TMPDIR/checkoutput.$$ >> $TMPDIR/checkreport.$$」だから、$TMPDIR/checkoutput.$$ というファイルに書いてあるらしい。

この $TMPDIR/checkoutput.$$ というファイルは「$GREP -v -f $IGNORE_FILE $TMPDIR/check.$$ > $TMPDIR/checkoutput.$$;」で作っている。

意味はよくわからないが、 $IGNORE_FILE というのが期待が持てそう。ん?。コメントがある。「 # Do reverse grep on patterns we want to ignore(無視したいパターンを逆 grep で除外する)」。これはますます期待が持てそうだ。

前のほうで IGNORE_FILE を捜すと次のような部分があった。

    IGNORE_FILE=/etc/logcheck/logcheck.ignore
(5)/etc/logcheck/logcheck.ignore を見る。

    [root@EDiCube-01 /root]# cat /etc/logcheck/logcheck.ignore

    PAM_pwdb.*session opened
    PAM_pwdb.*session closed
    authsrv.*AUTHENTICATE
        ・・・
    popper: -ERR Unknown command: "uidl".
    pop3d.*connect from
    pop3d.* Login
    pop3d.* Logout
    qmail.*new msg
        ・・・
    tcplogd.*port 113
    tcpdlogd.*port 25 connection attempt from localhost
    *-- MARK --

    [root@EDiCube-01 /root]#
うわ。長い。しかし、ワンパターンのリストのようだ。grep のためのリストなのだから、各行が正規表現になっているのだろう。

「.*」は任意の長さの文字列だ。たとえば「pop3d.*connect from」なら「・・・pop3d・・・connect from・・・」にマッチすることになる。これにマッチしたものは除外される、という仕組みだ。

(6)/etc/logcheck/logcheck.ignore の書き換えの作戦を練る。

除外したいのは次のようなものだ。

Nov 28 12:41:34 EDiCube-01 kernel: parport0: PC-style at 0x378 [SPP]
Nov 28 12:41:34 EDiCube-01 kernel: parport0: no IEEE-1284 device present.
Nov 28 12:41:34 EDiCube-01 kernel: lp0: using parport0 (polling).
このうち日付の部分はマッチ条件に含めてはまずいだろう。「[」とか「(」とかは正規表現のための記号とみなされる可能性があるので、条件に入れないほうがいいかもしれない。EDiCube-01 というのはこのサーバの名前。入れても入れなくてもよいが、他のサーバにコピーしてスクリプトの使いまわしをする可能性を考えると、入れないほうがよいだろう。それ以外は、数字も含めてできる限り長いマッチ条件にするのがよい。ということで、次のように決定。

kernel: parport0: PC-style at 0x378.*SPP
kernel: parport0: no IEEE-1284 device present
kernel: lp0: using parport0.*polling
(7)vi で開いて変更する。

    [root@EDiCube-01 /root]# vi /etc/logcheck/logcheck.ignore

            (編集する)

    [root@EDiCube-01 /root]# cat /etc/logcheck/logcheck.ignore

    kernel: parport0: PC-style at 0x378.*SPP
    kernel: parport0: no IEEE-1284 device present
    kernel: lp0: using parport0.*polling
    PAM_pwdb.*session opened
    PAM_pwdb.*session closed
    authsrv.*AUTHENTICATE
これでOK。

Windows のようにマウスでプチプチ、というわけにはいかないが、スクリプトを追っかけるだけで、何をやっているかが完全に明らかになるようになっている、というのはいいね。

* ちなみに、これらの作業は Windows マシンから TeraTerm を使って行った。TeraTerm ではマウスで囲んで ALT+C でテキストをクリップボードに保存することができる。これを Windows のエディタで Ctrl+V でコピーすれば簡単に記録を残すことができる。逆に Windows のエディタから Linux のシステム用のスクリプトにコピーしたい場合には、vi で開いておいて [esc]i ALT+V でOKだ。

2002-03-19(火):後日談

じつは、このとき同時に、次のような除外パターンも入れた。これは Linux root 宛のメールを tk 氏に転送したというログだ。root 宛のシステム管理メールを tk 氏が windows のメーラ(Becky!)で読めるようにしていたからだ。

    pop3d.*port 110 service init from 192\.168\.1\.10
    pop3d.*Moved .* to /home/tk/mbox .*192\.168\.1\.10
ところが、最近になって、次のような警告が再び届くようになった。

Mar 19 10:03:40 EDiCube-01 ipop3d[14765]: port 110 service init from 192.168.1.13
Mar 19 10:03:42 EDiCube-01 ipop3d[14765]: Moved 947 bytes of new mail to /home/tk/mbox from /var/spool/mail/tk host= [192.168.1.13]
「おかしいなぁ。この手のメールは除外したはずなのになぁ」と思いつつ vi /etc/logcheck/logcheck.ignore してみた。すると、上のようになっていた。

そういえば、たしかに、最近 tk 氏はマシンを変えていたのであった。今度のマシンのアドレスは 192.168.1.13 だ。だから、ちゃんと正確に警告を出してくれていた、ということだ。除外リストを変更したことは、言うまでもない。


powered by Apeed.rb & pi.rb .. (^_^;) .. and .. Link to KOJIRO .. and .. Netscape

author: KUMAGAI Hidetake