rssh の chroot 設定ではまったこととか

えーっと、なんか、dpkg-reconfigure しないと駄目なのね。aptitude install で dpkg-reconfigure 必要なパッケージはなんか教えてよ orz
そんで、mkchroot.sh は /usr/share/doc/rssh/examples にあって、実行しても ld-linux.so と /lib/ld-2.3.6.so と /etc/ld.so.conf.d/i486-linux-gnu.conf はコピーしてくれないっぽい。ld.so.conf.d が必要かどうかは知らんけれども。
最後に、chroot 以下にコピーされたファイル群をアップデートする必要があるので、こんなシェル作った

#!/bin/bash

# 変数定義
CHROOT_DIR=/usr/chroot

# ldd する必要のあるファイルを指定
BINFILES='/usr/lib/rssh/rssh_chroot_helper
          /usr/lib/openssh/sftp-server
          /usr/bin/rssh
          /usr/bin/scp'

# シンボリックリンクなファイルを指定
LINKFILES='/lib/ld-linux.so.2
           /lib/libnss_compat.so.2
           /lib/libnss_files.so.2'

# 単純にコピーしてくればよいファイルを指定
CONFFILES='/etc/nsswitch.conf
           /etc/ld.so.conf
           /etc/ld.so.cache
           /etc/ld.so.hwcappkgs
           /etc/ld.so.conf.d/i486-linux-gnu.conf'

APTARC_DIR=/var/cache/apt/archives
APTTIME_FILE=/var/tmp/apt_time
TEMPFILE=/tmp/$$.tmp

# 関数定義
LINKTO()
{
    echo $(dirname ${1})/$(LINKNAME ${1})
}

LINKNAME()
{
    stat -c %N ${1} | sed -e 's/^.*-> `//g' -e "s/'"'$//g'
}

# apt でファイル取得が実行されたかどうかのチェック
if [ $(stat -c %Y ${APTARC_DIR}) -eq $(stat -c %Y ${APTTIME_FILE}) ]
then
    exit 0
fi

touch -r ${APTARC_DIR} ${APTTIME_FILE}

# シンボリックリンクの更新
for f in ${LINKFILES}
do
    if [ $(LINKNAME ${CHROOT_DIR}${f}) != $(LINKNAME ${f}) ]
    then
        echo update link ${CHROOT_DIR}${f}
        rm $(LINKTO ${CHROOT_DIR}${f})
        rm ${CHROOT_DIR}${f}
        ln -s $(LINKNAME ${f}) ${CHROOT_DIR}${f}
    fi
done

# 更新対象ファイルリストの作成
ldd ${BINFILES} | egrep -v ':$|linux-gate.so' | sed -e 's/^.* => //g' -e 's/ (.*)//g' > ${TEMPFILE}

for f in ${LINKFILES}
do
    LINKTO ${f}
done >> ${TEMPFILE}

for f in ${CONFFILES}
do
    echo ${f}
done >> ${TEMPFILE}

echo "${BINFILES}" >> ${TEMPFILE}

# 変更の有ったファイルを更新
sort ${TEMPFILE} | uniq | egrep -v $(echo ${LINKFILES} | tr ' ' '|') | while read f
do
    if [ ! -f ${CHROOT_DIR}${f} ]
    then
        echo copy file ${CHROOT_DIR}${f}
        cp -pf ${f} ${CHROOT_DIR}${f}
    fi

    if [ $(stat -L -c %Y ${CHROOT_DIR}${f}) -ne $(stat -L -c %Y ${f}) ]
    then
        echo update file ${CHROOT_DIR}${f}
        cp -pf ${f} ${CHROOT_DIR}${f}
    fi
done

rm ${TEMPFILE}

ホントは Makefile を書くつもりだったけど、書き方よー分からんかったのと、細かく動作制御すんのめんどくさかったから、bash スクリプト。で、aptitude upgrade して更新が有った場合だけ実行すりゃいいんだけれども、忘れると嫌なんで、このスクリプトを cron.daily に放り込んだ。

なんか BINFILES が更新されない。更新対象としてファイルに出力してないじゃん。何ヶ月気づいてないんだよ、もう一年近く経ってるのに orz
ちゅうことで、echo "${BINFILES}" >> ${TEMPFILE} を追加。これで多分実行モジュールも更新される。

fresh-clam で更新しても clamd が読み込んでなかったりとか

clamd を使ってみることにした。当然 fresh-clam も使うことに。
はじめ数日は clamd が読み込んでないなんてまるっきり気がついてなかったのだけれども、何気なく /var/log/clamav/freshclam.log と /var/log/clamav/clamd.log を覗いたら、何か知らん、fresh-clam で更新されても clamd がなんもしてないっぽい。駄目じゃん orz。
結局、南極、/etc/init.d/clamav-freshclam の start でコマンド引数を指定してなんとかなった。

start_daemon $DAEMON -d --quiet
↑これを↓こうした。
start_daemon $DAEMON -d --quiet --daemon-notify=${CLAMAV_CONF_FILE}
これで↓こんなログが出るようになった。
Mon Jan 14 05:15:10 2008 -> No stats for Database check - forcing reload<
Mon Jan 14 05:15:10 2008 -> Reading databases from /var/lib/clamav<
Mon Jan 14 05:15:25 2008 -> Database correctly reloaded (191357 signatures)<
もちっとスマートな解決方法がありそうな気もしなくも無いし、forcing reload ってのがちょっと気になったりはするんだけれども、その辺は思考停止することにして、ついでに、立ち上げっぱなしだとメモリ喰い潰してる気がするから、1日1回再起動することに。
#!/bin/bash

/etc/init.d/clamav-freshclam restart
/etc/init.d/clamav-daemon restart

とか書いて、/etc/cron.daily に放り込んだ。
これでなんかちゃんと動いてるっぽいけど、よく分からん(汗

cron.hourly のログが鬱陶しい

cron.hourly のログが auth.log に出て鬱陶しいです。毎時実行させるタスクがないのなら、cron.hourly を止めてしまえばよいw

/etc/crontab
17 * * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6 * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
↑これを↓こうする。
# 17 * * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6 * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
以上終わり。
... のはずだったのだが!DDNS のアドレス更新のためにタスクを毎時実行させたくなってしまった orz
かといって1時間に1回ログを吐かれても鬱陶しいだけだ。そんなにクリティカルな処理をさせるわけでもなく、まぁ、たまに処理が止まってても気にしないくらいの勢いが大切だ(爆
ということで、cron.hourly の代替シェルを書いてみた。
#!/bin/bash

PIDFILE=/var/run/cron.hourly.pid

if [ -f "${PIDFILE}" ]
then
    PID=$(head -1 ${PIDFILE})
fi
if [ -n "${PID}" ]
then
    ps -f h -p ${PID} >/dev/null
    ISALIVE=${?}
else
    ISALIVE=1
fi

case $1 in
    start)
        if [ ${ISALIVE} -eq 0  ] ; then exit 0 ; fi
        (
            while true
            do
                run-parts --report /etc/cron.hourly
                sleep 1h
            done
        ) > /dev/null 2>&1 &
        echo $! > ${PIDFILE}
        ;;

    stop)
        if [ ${ISALIVE} -eq 0  ]
        then
            CPID=$(pgrep -P ${PID})
            kill ${PID}
            kill ${CPID}
        fi
        if [ -f "${PIDFILE}"] ; then rm ${PIDFILE} ; fi
        ;;

    restart)
        $0 stop
        $0 start
        ;;

    *)
        ;;
esac

exit 0
で、これを init.d に放り込んで、rc?.d からシンボリックリンク張って終わり。実はバックグラウンドにしたサブシェルの PID を取得するのにすごく時間かかったって言うのは内緒。何かもっといい方法ありそうなんだけど。バックグラウンドにしたプロセスの PID は $! で取れるって最近気づいたよ orz

そもそもの発端、ddo.jp の無料アカウントを更新するシェルも作ったから、備忘録代わりに書いておこう。
別に普通に wget するだけなんだけどね。でもね、毎時アクセスかけるのも無駄なんで、DHCP で WAN 側 IP が変化したときだけ更新するようにしたかったわけ。しかも LAN 内なんで、WAN のアドレス変わったのなんかわかんないわけ。でも、ルーター(AirStation)の管理ページに WAN アドレスは書いてあるの。だから、AirStation に wget するんだけれど、ベーシック認証かかってるわけ。wget でベーシック認証通せるのか?と思ったら、ちゃんと通ったっていうお話。
HTTP_USER=admin
HTTP_PASSWD=passwd
BASEINFO_URL=http://192.168.1.1/diag/baseinfo.cgi
DDOJP_URL=http://free.ddo.jp/dnsupdate.php
DDOJP_DOMEIN=hoge
DDOJP_PASSWD=passwd
UPDATE_LOG=/tmp/ddns_update.log

NOW_IP=$(wget --http-user ${HTTP_USER} --http-passwd ${HTTP_PASSWD} ${BASEINFO_URL} -q -O - | head -
211 | tail -1 | sed 's#^.*<strong>\(.*\)</strong.*$#\1#g')

# 前のアドレスと比較して同じなら
if ( [ -f ${GLOBAL_ADDRESS_FILE} ] && [ "${1}" != "force" ] )
then
    OLD_IP=$(cat ${GLOBAL_ADDRESS_FILE})
    if [ ${NOW_IP} == ${OLD_IP} ]
    then
        exit 0
    fi
fi

echo ${NOW_IP} > ${GLOBAL_ADDRESS_FILE}

wget -q -O ${UPDATE_LOG} ${DDOJP_URL}?dn=${DDOJP_DOMEIN}&pw=${DDOJP_PASSWD}

exit ${?}
これを cron.hourly に放り込んだ。で、force オプションをつけると IP の更新があっても無くても ddo.jp にアクセスするようにしてみた。cron.weekly にこんなシェルを放り込んだ。
#!/bin/bash

../cron.hourly/ddns_update force

1ヶ月以上アクセスしないとアカウント消されちゃうから、1週間に1回は ddo.jp にアクセスに行くって寸法。

cron で実行されると defunct する orz

上のシェルですが、cron から実行されると [defunct] が出来ます orz
原因は標準出力が閉じないからじゃないかと思われます。つまり、親シェルは終わるけどサブシェルをバックグラウンドにしてるから、サブシェルの標準出力が生きていて、親シェルの標準出力が閉じないので、cron は親シェルの終了シグナルを受け付けないのだと思われ(ホントかよ?!)
と言うことで、早々、"> /dev/null 2>&1" を追加。問題解決。
defunct 怖いですね、恐ろしいですね。さよなら、さよなら、さよなら。

インストールできない!ブートオプション acpi との格闘!

忘れないように書いときますが、そもそもインストールで嵌ったんでした。実ははじめ Ubuntu 入れようとしていたの。でもインストールできなかったの。Ubuntu デスクトップに必要なメモリー量が無かったから、デスクトップが入らなかったのは当然として、Ubuntu サーバも入らなかったの。irqpoll オプションつけろって言われるから、オプションつけてインストールするんだけど、インストールできないと言うか、何度やってもインストールの途中で止まっちやうの。Ubuntu サーバならギリ入るはずなんだけどなー、変だなー、と思いつつ Ubuntu をあきらめて Debian にしてみることに。Debian でもインストール開始直後に文句を言われる。前に FreeBSD(というか FreeNAS なんだけど)は動いたなー、とおもいつつ FreeNAS を CD で動かすとちゃんと動く。インストールも出来て問題なく HDD から動く。FreeBSD も嫌いじゃないんだけど、FreeBSD は古臭いし、これからはやっぱ Linux だよ!FreeBSD で動いて Linux が動かないわけがない!とか強く思ったわけ(そういえば、Solaris 10 とか使ってると BSD 臭がぬけてきてる希ガス)。
はぁ、というわけで、再び Debian でトライ。Ubuntu も Debian も Core は一緒!とばかりに irqpoll オプションを指定してインストールしてみる。あっさり入った。なんだよー、と思いつつ、次は telnetd のインストールだ!と勢い込む。この時点で既に2日経過
このマシーン、ノートなんだけど、サーバ用途限定で放熱を良くして出来るだけ無駄な電力使わないようにいらないものを外しまくってる。バッテリーパック、FDD、モデムはもちろん、キーボード、タッチパット、液晶画面(!)。ついでに HDD の放熱が良くなるように、ケース自体まで破壊してあったりw 背面のディスプレー端子と PS2 にデスクトップで使ってる液晶ディスプレーとキーボードさして、内臓 LAN ボードがないから PCI に LAN カードと言う状態。なので、デスクトップマシンでウェブで調べるにもいちいちディスプレーつなぎかえという馬鹿さ加減。もうディスプレー切替器買っちゃおうかと。こんなならインストールしてから筐体破壊すればよかったよと(爆
そんなわけで一刻も早くリモートからログインできるようにしたかったわけ。なのでとにもかくにも telnetd。Debian は楽でいいな!apt-get!!と勢い込んだけど、ネットワークからパッケージを取り込んでる最中に何故か固まる。そして強制電源断。あひゃ。Linux だぞー、ゲイツ OS じゃないのになんだよー、と思いつつ、懲りずに apt-get 今度は上手くいく。
よし、リモートから乗り入れて設定だ!と telnet で入ってしばらくたつと固まる。そして強制電源断。あひゃ。ハードと相性が悪いのかなー、FreeBSD にしようかなー、などと日和ったことを考えながら、次は ntpd かなと。その間に何度もターミナルからの接続が切られている。そして apt-get で再び固まる。そして強制電源断。あひゃ?あひゃひゃ??もしかしてネットワーク?そういえば Ubuntu のインストールが止まったのも外につなぎに行った後だったよなと思い直す。ネットで調べると、acpi ゆう機能があって電源管理をするんだが、ハードウェアの割り込みとかにも関係有るらしい(ハード寄りのことはさっぱりわからんw)。割り込みは /proc/interupts をみるとわかるらしい。なんかひどく acpi の割り込みが多い、でもこんなもんなのかも?とかそのときは思う。が、今にして思うと timer より acpi の割り込みが多いのは明らかにおかしい(爆
acpi ゆうのはは結構問題を起こすらしい。なんか noacpi ってオプションもあるらしい。ふうんそうなんだと。で、ブートオプションの指定はどこでしてるの?irq って割り込みだけど irqpoll って何?acpi?何?それおいしいの?やっぱハードウェア割り込みとソフトウェア割り込みが分かってないわ自分wとか思いつつ、もう Google 先生に聞きまくりのディスプレイ繋ぎ変えまくりで noacpi とか acpi=no とか nolacpi とか lacpi=no とかいろいろやったけど、結局ネットワークが途中で切れる。悪いときにはネットワーク自体が使えない。手当たりしだにページ読んでもいまいちよく分からない。しかも irqpoll が一番まともに動く気がする。あわせ技も駄目。むしろ irqpoll 含めないとちょっとも動かない。はてなダイアリーでおんなじような苦労をしている人を発見!何?acpi=noirq?ま、ものは試しとやってみたところ、何かよさげ。ここで、さらに3日経過w
あれれ?それでも切れる!深夜〜明方は切れないけど、夜は切れる!うわぁ!なんじゃー!ひょっとして LAN 内飛んでるパケットが悪さしてるんか?!とか思って、パケットキャプチャしてみたら、なんか、ブロードキャストが飛んでくるときれる!このパケットがいけないんじゃ!このアドレスは!Debian からだ!この mac アドレスは!あれ?無線 LAN の mac で登録してるぞ?有線でつないでるのになんで無線 LAN ??あ、あれ??ま、まさか... はい、IP 衝突してました orz
そう、DHCP 止めて静的に割り振ってるから、振り間違えると衝突する。通信が深夜に切れないのは親父のマシンが上がってないから。IP 振りなおして、問題解決。もう一度ブートオプションを irqpoll にしてみるけど、やっぱり irqpoll じゃ不安定。acpi=noirq が正解だったらしい。ここまでたどり着くまで、トータル1週間www
家のマシンのネットワークは全台私が設定してるのに IP 振り間違える私も馬鹿だけど、なんで irqpoll にしろなんていうんだろう?はじめから acpi=noirq にしろってメッセージ出してくれれば、今頃は Ubuntu サーバだったのに。ま、管理が楽そうな deb 系にしたかっただけだから、結局 Debian で不満はないんだけど.
結論。irqpoll や noacpi で上手くいかなかったら、acpi=noirq を試してみると良い。うん、がっつり書いたら、すっきりしたw

/boot/grub/menu.lst
title           Debian GNU/Linux, kernel 2.6.18-5-686
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18-5-686 root=/dev/hda1 ro acpi=noirq
initrd          /boot/initrd.img-2.6.18-5-686
savedefault

title           Debian GNU/Linux, kernel 2.6.18-5-686 (single-user mode)
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.18-5-686 root=/dev/hda1 ro acpi=noirq single
initrd          /boot/initrd.img-2.6.18-5-686
savedefault

acpi オプションの微妙な違いはマヂで理解できない。noacpi と acpi=noirq とacpi=off でどう違うのかもちっと分かりやすく書いてくれい。

acpi=off    disables both ACPI table parsing and interpreter
acpi=force  to over-ride black-list
acpi=strict disables out-of-spec workarounds
pci=noacpi  disable ACPI IRQ routing and PCI scan
acpi=noirq  disables ACPI interrupt routing
noacpi      ACPI 無効

その後の変遷

多分 2.6.26-1-686 から 2.6.26-2-686 になったタイミングだと思うのだけれど、また kacpid がわらわら言うようになった。仕方ないので色々いじってみた。上から順に試していった組み合わせw

## kopt=root=/dev/hda1 ro acpi=noirq pci=noacpi console=ttyS0,115200
## kopt=root=/dev/hda1 ro acpi=noirq pci=noacpi acpi=force console=ttyS0,115200
## kopt=root=/dev/hda1 ro acpi=force pci=noacpi console=ttyS0,115200
## kopt=root=/dev/hda1 ro acpi=off pci=noacpi acpi=force console=ttyS0,115200
## kopt=root=/dev/hda1 ro acpi=off pci=noacpi console=ttyS0,115200
## kopt=root=/dev/hda1 ro acpi=noirq pci=noacpi console=ttyS0,115200
## kopt=root=/dev/hda1 ro apm=off acpi=off pci=noacpi console=ttyS0,115200
# kopt=root=/dev/hda1 ro acpi=noirq pci=noacpi acpi=force apm=off console=ttyS0,115200
なんか、amp というパラメータも電源制御とかに関係するようだった。ますますよう分からんw
最終的にはこれ。

/boot/grub/menu.lst
title           Debian GNU/Linux, kernel 2.6.26-2-686
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.26-2-686 root=/dev/hda1 ro acpi=noirq pci=noacpi acpi=fo
rce apm=off console=ttyS0,115200
initrd          /boot/initrd.img-2.6.26-2-686

title           Debian GNU/Linux, kernel 2.6.26-2-686 (single-user mode)
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.26-2-686 root=/dev/hda1 ro acpi=noirq pci=noacpi acpi=fo
rce apm=off console=ttyS0,115200 single
initrd          /boot/initrd.img-2.6.26-2-686

HDD の最適化をしてみた

科学と非科学の迷宮さんちの「[Linux]atime関連マウントオプション使用時のディスク性能比較」を読んで noatime は多少効果があるらしいことが分かったので、やってみることにした。ついでになんとなくやってなかった hdparm による hdd の高速化&静穏化をやってみた。

relatime で起動不可 orz

なになに?noatime より relatime のほうがいいのか、とおもむろに fstab を編集。

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hda1       /               ext3    defaults,<strong>relatime,</strong>errors=remount-ro 0       1
/dev/hda2       none            swap    sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

何も考えずにに reboot 。いつまで経ってもあがらない。コンソールをなんか嫌な赤字が... 強制終了。
single user 。駄目。あひゃー。
なみだ目で ubuntu desktop cd を挿入。ちゅーんちゅーん言ってる。30分待ち。64 MB のマシンじゃあがらないっぽい。
半泣きで debian の install cd を挿入。インストール開始されちゃうよ(泣
泣きながら install の起動メニューを熟読。とりあえず、F1。ほかにもメニューがあるらしい。F5,F6...
レスキューモードを発見。これでいけそう。rescue acpi=noirq で起動。色々聞かれて最後に hdd のどのパーティションマウントする?ときかれた。よし。

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hda1       /               ext3    defaults,<strong>noatime,</strong>errors=remount-ro 0       1
/dev/hda2       none            swap    sw              0       0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

それでも noatime にして reboot 。今回は問題なしと。性能は測ってないw

hdparm で HDD の高速化&静穏化

hdparm によるチューンもしてみることにした
いつものごとく aptitude install hdparm 。vi /etc/hdparm.conf。

(snip)
/dev/hda {
        mult_sect_io = 16
        write_cache = on
        dma = on
        spindown_time = 180
        io32_support = 1
}

#command_line {
#       hdparm -q -m16 -q -W0 -q -d1 /dev/hda
#}

適用する前に hdparm /dev/hda でオプションの状態と hdparm -t /dev/hda でベンチを取る。

$ hdparm /dev/hda

/dev/hda:
 multcount    =  0 (off)
 IO_support   =  0 (default 16-bit)
 unmaskirq    =  0 (off)
 using_dma    =  1 (on)
 keepsettings =  0 (off)
 readonly     =  0 (off)
 readahead    = 256 (on)
 geometry     = 65535/16/63, sectors = 195371568, start = 0
hdparm -t x 3
 Timing buffered disk reads:   62 MB in  3.05 seconds =  20.31 MB/sec
 Timing buffered disk reads:   68 MB in  3.04 seconds =  22.38 MB/sec
 Timing buffered disk reads:   74 MB in  3.08 seconds =  24.06 MB/sec
/etc/init.d/hdparm で設定を適用。
$ hdparm /dev/hda

/dev/hda:
 multcount    = 16 (on)
 IO_support   =  1 (32-bit)
 unmaskirq    =  0 (off)
 using_dma    =  1 (on)
 keepsettings =  0 (off)
 readonly     =  0 (off)
 readahead    = 256 (on)
 geometry     = 65535/16/63, sectors = 195371568, start = 0
hdparm -t x 3
 Timing buffered disk reads:   68 MB in  3.03 seconds =  22.41 MB/sec
 Timing buffered disk reads:   68 MB in  3.06 seconds =  22.22 MB/sec
 Timing buffered disk reads:   76 MB in  3.07 seconds =  24.75 MB/sec

なんかまったく早くなってない。3分待ってもスピンダウンしてないっぽいし。どこが悪いのかなぁ...

嫌なアクセスがあった IP を弾く

smtp 鯖を立てて、家鯖でメールを受信できるようにしてみた。ちなみに、exim4。すると、ポート空けて数時間で踏み台にしようとするアクセスが。cram md5 でログインしない限りリレーしないように設定してあるので(しかもパスワードは10桁以上あるし)まぁ、心配は無いのだけれど、こういうアクセスが多いと肝心なログが埋もれてしまってやばいことになるかもしれないので、不正なアクセスがあった IP をログから抽出して、iptables で拒否するスクリプトを作った。

make.deny
bash exim.filter
bash apache2.filter
exim.filter
(
cd /var/log/exim4
for f in rejectlog.*.gz
do
    gzip -dc ${f}
done
cat rejectlog rejectlog.1
) | egrep -v 'spamer' | sed 's/^.*\[\(.*\)\].*$/\1/g' | \
egrep -v '192\.168\.[1-8]|210\.2\.19' | \
cat - ~/deny.smtp | cut -d. -f1-3 | sort | uniq | sed 's/$/.0/g' | \
grep -v -f white.filter > ~/deny.smtp.tmp
mv ~/deny.smtp.tmp ~/deny.smtp
apache2.filter
(
cd /var/log/apache2
for f in access.log.*.gz
do
    gzip -dc ${f}
done
cat access.log.1 access.log
) | egrep -v '192\.168\.1\.[1-9]|210\.2\.19| 200 | 301 | 304 ' | \
egrep 'CONNECT|PUT|http://|file://|php|\\x99|cgi-bin|vhcs|servlet|\.dll|soapCaller.bs|Wind
ows 98
|MSFrontPage' | \
cut -d' ' -f1 | cat - ~/deny.http | cut -d'.' -f1-3 | sort | uniq | sed 's/$/.0/g' | \
grep -v -f white.filter > ~/deny.http.tmp
mv -f ~/deny.http.tmp ~/deny.http
iptables.sh
#!/bin/bash

# 全てのルールを削除
iptables -F

# ポリシー
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopbackアドレスにすべて許可
iptables -A INPUT -i lo -j ACCEPT

# 不正アクセスがあった IP を弾く
while read f
do
    iptables -A INPUT -p tcp -s ${f}/24 --dport 25 -j DROP
done < ~/deny.smtp

while read f
do
    iptables -A INPUT -p tcp -s ${f} --dport 25 -j DROP
done < ~/deny.hinet

while read f
do
    iptables -A INPUT -p tcp -s ${f}/24 --dport 80 -j DROP
done < ~/deny.http

iptables -A INPUT -p tcp -s 209.222.128.0/19 --dport 80 -j DROP
iptables -A INPUT -p tcp -s 85.17.216.0/24 --dport 80 -j DROP
iptables -A INPUT -p tcp -s 195.122.131.0/24 --dport 80 -j DROP

##### サーバ待ちうけ許可 #####
# NTP
iptables -A INPUT  -p udp -s 192.168.1.0/28 --dport 123 -d 192.168.1.2 -j ACCEPT

# HTTP
iptables -A INPUT -p tcp --dport 80 -d 192.168.1.2 -j ACCEPT

# TELNET
iptables -A INPUT -p tcp -s 192.168.1.4 --dport 23 -d 192.168.1.2 -j ACCEPT

# SSH
iptables -A INPUT -p tcp -s 192.168.1.3 --dport 22 -d 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.4 --dport 22 -d 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.8 --dport 22 -d 192.168.1.2 -j ACCEPT

# SVN
iptables -A INPUT -p tcp -s 192.168.1.4 --dport 3690 -d 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.8 --dport 3690 -d 192.168.1.2 -j ACCEPT

# POP
iptables -A INPUT -p tcp -s 192.168.1.4 --dport 110 -d 192.168.1.2 -j ACCEPT

# SMTP
#iptables -A INPUT -p tcp -s 192.168.1.4 --dport 25 -d 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -d 192.168.1.2 -j ACCEPT

# Auth(Ident)
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -p tcp --sport 113 --tcp-flags RST RST -j ACCEPT
iptables -A INPUT -p tcp --sport 113 --tcp-flags RST RST -j ACCEPT

##### クライアント許可 #####
# DNS応答
iptables -A INPUT -p udp --sport 53 --dport 1024: -j ACCEPT

# NTP応答
iptables -A INPUT -p udp -s ring.aist.go.jp      --sport 123 -j ACCEPT
iptables -A INPUT -p udp -s ntp2.jst.mfeed.ad.jp --sport 123 -j ACCEPT

# ICMP echo
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

# ICMP echo reply
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

# 確立済み
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

##### 明示的拒否(ログ出力抑止) #####
# NETBIOS
iptables -A INPUT -p tcp -s 192.168.1.0/28 --dport 137:139 -j DROP
iptables -A INPUT -p udp -s 192.168.1.0/28 --dport 137:139 -j DROP
iptables -A INPUT -p udp -s 192.168.1.0/28 --sport 137:139 -j DROP

##### 拒否アクセスのログ出力 #####
# 以上の条件に当てはまらなかったeth0からのパケットは,ログを吐いてDROPする
iptables -N block
iptables -A block -i eth0 -p tcp -j LOG --log-level info --log-prefix 'iptables:'
iptables -A block -i eth0 -p udp -j LOG --log-level info --log-prefix 'iptables:'
iptables -A block -i eth0 -p icmp -j LOG --log-level info --log-prefix 'iptables:'
iptables -A block -i eth0 -j DROP
iptables -A INPUT   -j block
iptables -A FORWARD -j block

iptables-save > /etc/iptables.rules

IP を調べてみると、台湾の HINET を筆頭に、中国、台湾からのアタックがあまりにも多く、DHCP なマシンから投げられてるっぽい。これだと 255.255.255.0 で弾いても効果が薄い感じが。これらの国からメールを受信することは無いので、嫌なアクセスがあったらドメイン登録情報に記載されているサブネット丸ごと拒否してしまうようにした。 結果、かなり変なアクセスが減った。今のところ拒否しているの IP のリストはこんな感じ。
※中国、台湾が嫌いなのじゃなくて、アタックがあった IP のサブネットを拒否しているので、嫌がらせをしてこないところは弾いてない。
※最近は中国、台湾以外でもブラジルとかからも結構来てるからそれも弾いている。

deny.hinet(→中国、台湾以外も入ってるけど、最新はこれ:2010/07/25 時点のファイル
58.60.0.0/14
59.10.45.0/24
59.56.0.0/11
59.112.0.0/12
58.114.0.0/15
61.31.160.0/19
61.216.0.0/13
61.224.0.0/13
66.139.160.64/29
77.37.168.0/21
77.37.176.0/20
77.37.192.0/19
77.37.240.0/21
77.232.1.0/24
83.94.112.56/29
112.104.0.0/16
112.105.0.0/16
114.32.0.0/12
115.80.0.0/14
116.52.0.0/14
118.160.0.0/13
118.168.0.0/16
118.169.0.0/16
120.92.0.0/16
121.32.0.0/14
122.116.0.0/16
123.204.64.0/18
123.204.128.0/17
123.205.224.0/20
123.252.126.0/24
124.8.0.0/14
124.12.0.0/16
124.217.214.0/24
125.224.0.0/13
125.232.0.0/15
201.1.0.0/16
201.26.0.0/16
202.102.224.0/19
208.127.19.206
218.19.0.0/16
218.20.0.0/16
218.160.0.0/12
219.84.0.0/15
219.86.32.0/20
219.128.0.0/13
219.137.0.0/15
220.129.0.0/12
220.160.0.0/15
220.162.0.0/16
220.171.0.0/20
221.216.0.0/13
222.216.0.0/15
222.218.0.0/16

ちょっとセキュリティに気を使ってみた

なんとなく気になるので、chkrootkit と integrit を使うことにしてみたメモ。
今回はめもす屋さんを参考にさせていただきました <(_`_)>
んで、chkrootkit は設定いらず。integrit も integrit.debian.conf を書き換えて終わり。

/etc/integrit/integrit.debian.conf
CONFIGS="/etc/integrit/bin.conf /etc/integrit/boot.conf /etc/integrit/dev.conf /etc/integrit/etc.conf /etc/integrit/lib.conf /etc/integrit/sbin.conf /etc/integrit/usr.conf" 
後は侵入されるのを待つだけ(違

シリアルコンソールにしてみた

ずーっと前からディスプレイを繋がずに使ってましたが、シングルユーザが必要な場合やネットワークに問題がある場合にはディスプレイを直接繋いでメンテしなければならず、なんだかなぁな状態だったので、シリアルケーブル買ってきた。 debian でシリアルコンソールにするのは結構簡単。
# うーん、簡単とか言うなら、Solaris ならデフォでシリアルコンソールになってるんだが...
書き換えが必要だったのは /etc/inittab および /boot/grub/menu.lst 。 今回はblog.shimazu.orgさんを参考にさせていただきました <(_`_)>
# ちなみに、この設定だと通信速度が 115200 byte/s なので端末エミュレータ側も通信速度をあわせておく必要がある。

/etc/inittab
T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100

/boot/grub/menu.lst
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console

## ## End Default Options ##

title           Debian GNU/Linux, kernel 2.6.26-2-686
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.26-2-686 root=/dev/hda1 ro acpi=noirq console=tty0 console=ttyS0,115200n8
initrd          /boot/initrd.img-2.6.26-2-686

title           Debian GNU/Linux, kernel 2.6.26-2-686 (single-user mode)
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.26-2-686 root=/dev/hda1 ro acpi=noirq console=tty0 console=ttyS0,115200n8 single
initrd          /boot/initrd.img-2.6.26-2-686
シリアルコンソールだと何故かコンソールのサイズを認識してくれず、stty size とすると 0 0 といわれてしまう。 これだとコンソールの真ん中ちょっと下くらいにカーソルが居続けることになって、なんかとても気持ちが悪い。
でも、ssh でログインしたときはちゃんと認識してくれてるっぽいから、サイズ 0 になっているときだけいつも使ってる ウィンドウのサイズを設定してることにした。常用してるサイズは横90文字(半角)、縦40行なので、この線で /etc/profile を修正。
/etc/profile
size=($(stty size))
if [ "${size[0]}" -eq "0" ] ; then stty rows 40 ; fi
if [ "${size[1]}" -eq "0" ] ; then stty cols 90 ; fi
関係ないけど、環境変数 HISTFILESIZE を 0 に設定しておくと .bash_history が記録されないので、記録したく無い人は .bashrc とか /etc/profile に書いておくと少し便利かもしれない。