セキュアなサーバ御用達のdaemontoolsを/usr/local/配下にインストール
[root@portage root]# cd /usr/local/
[root@portage local]# tar xvpfz ~yano/daemontools-0.76.tar.gz
admin
admin/daemontools-0.76
admin/daemontools-0.76/package
admin/daemontools-0.76/package/README
:
[root@portage daemontools]# cd admin/daemontools-0.76/
[root@portage daemontools-0.76]# ./package/install
Linking ./src/* into ./compile...
Compiling everything in ./compile...
:
[root@portage daemontools-0.76]# ll /command/
合計 2
drwxr-xr-x 2 root root 1024 8月 31 15:02 ./
drwxr-xr-x 21 root root 1024 8月 30 16:39 ../
lrwxrwxrwx 1 root root 43 8月 31 15:02 envdir -> /usr/local/admin/daemontools/command/envdir*
lrwxrwxrwx 1 root root 46 8月 31 15:02 envuidgid -> /usr/local/admin/daemontools/command/envuidgid*
:
[root@portage daemontools-0.76]#
Fedora Coreなどでglibcのアップグレードに伴って「undefined reference to `errno'」というエラーが発生するようになっている。その場合はパッチ ftp://moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch を適用し、error.hのextern int errno;を#include <errno.h>に置き換えれば良い。
diff -ur daemontools-0.76.old/src/error.h daemontools-0.76/src/error.h
--- daemontools-0.76.old/src/error.h 2001-07-12 11:49:49.000000000 -0500
+++ daemontools-0.76/src/error.h 2003-01-09 21:52:01.000000000 -0600
@@ -3,7 +3,7 @@
#ifndef ERROR_H
#define ERROR_H
-extern int errno;
+#include <errno.h>
extern int error_intr;
extern int error_nomem;
システム起動時にsupervisorを起動させる為、/etc/rc.d/init.d/svscanを作成してサービスとして起動する。
もしくは/etc/inittabの最後に"SV:123456:respawn:env - PATH=/usr/local/bin:/usr/sbin:/usr/bin:/bin svscan /service </dev/null >/dev/console 2>&1"を追加するのもあり。
[yano@portage yano]$ cat /etc/rc.d/init.d/svscan
#!/bin/sh
#
# svscan Start svscan.
#
# Author: TAKIZAWA Takashi <taki@cyber.email.ne.jp>
#
# chkconfig: 345 99 50
# description: svscan starts and monitors a collection of services.
# see http://cr.yp.to/daemontools.html
# processname: svscan
# service directory: /service
# Source function library.
. /etc/rc.d/init.d/functions
PATH="/usr/local/bin:$PATH"
prog=svscan
SVDIR=/service
RETVAL=0
export PATH SVDIR
start() {
echo -n $"Starting $prog: "
daemon svscan $SVDIR &
RETVAL=$?
echo_success
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/svscan
}
stop() {
echo -n $"Stopping $prog: "
killproc svscan
RETVAL=$?
(cd $SVDIR && svc -dx $SVDIR/*)
(cd $SVDIR && svc -dx $SVDIR/*/log)
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/svscan
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status svscan
RETVAL=$?
;;
restart|reload)
stop
start
;;
*)
echo $"Usage: $prog {start|stop|status|restart|reload}"
exit 1
esac
exit $RETVAL
[yano@portage yano]$ sudo /sbin/chkconfig --add svscan
参照 | |
---|---|
daemontools | http://www.emaillab.org/djb/daemontools/ |
実用qmailサーバ運用・管理術 | http://www.atmarkit.co.jp/flinux/index/indexfiles/qmailindex.html |
私家版 daemontools FAQ | http://www.unixuser.org/~euske/doc/daemontools/ |
[yano@portage yano]$ tar zxvf ucspi_tcp-0.88.tar.gz
[yano@portage yano]$ cd ucspi-tcp0.88
[yano@portage ucspi-tcp0.88]$ make
[yano@portage ucspi-tcp0.88]$ sudo make setup check
テキストでアクセスルールを作って、cdb形式のデータベースに変換する。sshだけでなくftpの分も忘れずに。
[yano@portage ucspi-tcp0.88]$ cd ~/tcpserver
[yano@portage tcpserver]$ cat ssh.rules ← サンプル
127.0.0.1:allow # localhostは接続許可
192.168.199.:allow # LAN内マシン(192.168.199.*)は接続許可
=.ap.plala.or.jp:allow # 接続を許可するプロバイダだけ列挙
=.infoweb.ne.jp:allow # 接続を許可するプロバイダだけ列挙
:deny # デフォルト接続拒否
[yano@portage tcpserver]$ /usr/local/bin/tcprules ssh.cdb ssh.tmp <ssh.rules
[yano@portage tcpserver]$ ll
合計 48
drwxr-xr-x 2 yano member 4096 8月 29 22:00 ./
drwx-----x 53 yano member 4096 8月 28 21:48 ../
lrwxrwxrwx 1 yano member 14 8月 16 14:53 cdbs -> /etc/tcpserver/
-rw-r--r-- 1 yano member 2222 12月 30 2001 ftp.cdb
-rw-r--r-- 1 yano member 108 12月 30 2001 ftp.rules
-rw-r--r-- 1 yano member 37 5月 11 2001 pop3.rules
-rw-r--r-- 1 yano member 2140 5月 26 2001 smtp.cdb
-rw-r--r-- 1 yano member 61 5月 11 2001 smtp.rules
-rw-r--r-- 1 yano member 2222 8月 29 22:00 ssh.cdb
-rw-r--r-- 1 yano member 86 8月 29 21:57 ssh.rules
-rw-r--r-- 1 yano member 61 8月 16 16:28 tcp.smtp
-rw-r--r-- 1 yano member 2143 5月 26 2001 telnet.cdb
-rw-r--r-- 1 yano member 41 8月 24 11:01 telnet.rules
[yano@portage tcpserver]$ sudo cp ssh.cdb cdbs
下記shellスクリプトでサービス毎に起動環境を作成する
for daemon in ftpd sshd
do
mkdir /etc/$daemon
mkdir /etc/$daemon/log
chmod +t /etc/$daemon
mkdir /var/log/$daemon
chmod 755 /var/log/$daemon
touch /etc/$daemon/run
echo "#!/bin/sh" >/etc/$daemon/log/run
echo "exec /usr/local/bin/setuidgid root /usr/local/bin/multilog t /var/log/$daemon" >>/etc/$daemon/log/run
chmod 744 /etc/$daemon/run /etc/$daemon/log/run
done
で、runを以下の様に作成
#!/bin/sh
PATH=/usr/local/bin:/usr/sbin/
tcpserver -u 0 -g 0 -v \
-x /etc/tcpserver/ftp.cdb 0 ftp \
/usr/sbin/in.ftpd -l -a 2>&1
#!/bin/sh
PATH=/usr/local/bin:/usr/sbin/
tcpserver -u 0 -g 0 -v \
-x /etc/tcpserver/ssh.cdb 0 ssh \
/usr/local/sbin/sshd -i 2>&1
log/runは以下の様に出来ているハズ
#!/bin/sh
exec /usr/local/bin/setuidgid root /usr/local/bin/multilog t /var/log/ftpd
#!/bin/sh
exec /usr/local/bin/setuidgid root /usr/local/bin/multilog t /var/log/sshd
参照 | |
---|---|
tcpserver | http://www.emaillab.org/djb/tcpserver/ |
OCN Tech Web セキュリティ - TCPServer | http://www.ocn.ad.jp/security/linux/011.html |
ログ形式に合わせてmultilog用をチョイスする事。
[yano@portage yano]$ tar xvpfz tcpanalog-multilog-0.23.tar.gz
[yano@portage yano]$ cd tcpanalog-multilog-0.23
[yano@portage tcpanalog-multilog-0.23]$ make
[yano@portage tcpanalog-multilog-0.23]$ sudo make install
#!/bin/sh
MAILTO=logwatcher@bravotouring.com
MAILFROM=tcpanalog@bravotouring.com
export PATH="$PATH:/usr/local/bin:/usr/local/bin/tcpanalog"
tmpdir=/tmp/tcpana-cron.$$.$RANDOM
tmplog=$tmpdir/logfile
tmpfile=$tmpdir/repfile
mkdir $tmpdir
pushd $tmpdir >/dev/null
s_year=`date -d '1 week ago' +%Y`
s_month=`date -d '1 week ago' +%m`
s_day=`date -d '1 week ago' +%d`
e_year=`date +%Y`
e_month=`date +%m`
e_day=`date +%d`
x_year=`date -d '1 day' +%Y`
x_month=`date -d '1 day' +%m`
x_day=`date -d '1 day' +%d`
start="$s_year-$s_month-$s_day"
end="$e_year-$e_month-$e_day"
xday="$x_year-$x_month-$x_day"
LOGDIR=/var/log/
echo -e "\n$start 〜 $end" > $tmpfile
# 配下のdaemonを増やす時はここに並べる↓
for daemon in ftpd sshd; do
cat "$LOGDIR/$daemon"/{"@",cur}* 2>/dev/null \
| tai64n2tai \
| logselect.pl start $start end $xday \
| tcpmatchup >$tmplog 5>/dev/null
(echo -e "\n---------- report of $daemon ----------"
ztcpdomains < $tmplog
ztcphosts < $tmplog
ztcpdeny < $tmplog ) >>$tmpfile
done
(echo "To: $MAILTO"
echo "From: $MAILFROM"
echo "Subject: tcpanalog for $e_year-$e_month-$e_day"
echo ""
cat $tmpfile ) | /var/qmail/bin/qmail-inject -f $MAILTO
popd >/dev/null
rm -rf $tmpdir
#!/usr/bin/perl
#
# http://www.qcc.sk.ca/%7Echarlesc/software/misc/qlogselectを改造
#
use Time::Local;
$start_time = 0;
$end_time = 0;
$from_pattern = undef;
$add_status = 0;
$strip_status = 0;
sub conv_date {
local($_) = shift;
my $time;
if(/^(\d+)-(\d+)-(\d+)$/) {
$time = timelocal(0, 0, 0, $3, $2-1, $1);
} elsif(/^\d+$/) {
$time = $_;
} else {
print STDERR "Invalid time: '$_'\n";
exit 1;
}
$time;
}
while($arg = shift @ARGV) {
if($arg eq 'start') {
$start_time = &conv_date(shift @ARGV);
} elsif($arg eq 'end') {
$end_time = &conv_date(shift @ARGV);
} elsif($arg eq 'from') {
$from_pattern = shift @ARGV;
} elsif($arg eq 'stripstatus') {
$strip_status = 1;
} elsif($arg eq 'addstatus') {
$add_status = 1;
} else {
print STDERR "Invalid argument '$arg'\n";
exit 1;
}
}
if($start_time) {
while(<>) {
next unless /^(\d+\.\d+) /o;
last if $1 >= $start_time;
}
}
$_ = <> unless $_;
while(1) {
$line = $_;
chomp;
unless(s/^(\d+\.\d+) +//o) {
print STDERR "Bad line: '$_'\n";
next;
}
last if $end_time && $1 > $end_time;
print $line;
} continue {
$_ = <>;
last unless $_;
}
参照 | |
---|---|
tcpanalog | http://www.emaillab.org/djb/tcpserver/tcpanalog.html |
tinydns-conf系では動作するローカルアドレス、dataでは応答するグローバルアドレスを記述する。
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# ## 起動アカウントの作成
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# /usr/sbin/groupadd djbdns
[root@nx9030 djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin tinydns
[root@nx9030 djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin dnslog
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# ## 基本設定(ここで指定するのはローカルIPアドレス)
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# tinydns-conf tinydns dnslog /etc/tinydns 192.168.199.2
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# cd /etc/tinydns/root/
[root@nx9030 root]#
[root@nx9030 root]# ## レコード(いわゆるnamed.conf)の登録(ここはグローバルIPアドレス)
[root@nx9030 root]#
[root@nx9030 root]# cat data 実際はviで作成、211.127.***.***は全て同じアドレス
# SOA/NS/A
.bravotouring.com:210.175.***.***:ns1.bravotouring.com:86400
# SOA/NS
#.bravotouring.com::ns.spanavi.net:86400
.bravotouring.com:210.175.***.***:ns2.bravotouring.com:86400
# MX/A
@bravotouring.com::bunny.e-globaledge.com:10:86400
@bravotouring.com:210.175.***.***:mail.bravotouring.com:20:86400
# A
+bravotouring.com:210.175.***.***:86400
+www.bravotouring.com:210.175.***.***:86400
# TXT
'bravotouring.com:v=spf1 a -all:3600
'bravotouring.com:Powered by djbdns - http\072//cr.yp.to/djbdns.html
[root@nx9030 root]# make
/usr/local/bin/tinydns-data
[root@nx9030 root]#
[root@nx9030 root]# ## シンボリックリンクを張ると svscan によって起動する
[root@nx9030 root]#
[root@nx9030 root]# ln -s /etc/tinydns /service
リゾルバにdnscacheを使用する。ローカルアドレスの逆引きならばloopback1で動かしているwalldnsに処理させる形。ローカルアドレスの逆引きをしなければバッサリ不要。
[root@nx9030 djbdns-1.05]# ## dnscache/walldns用のアカウントを作成最後にリゾルバをdnscacheのアドレスに変更すれば万事OK。
[root@nx9030 djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin dnscache
[root@nx9030 djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin walldns
[root@nx9030 djbdns-1.05]# ## walldns用のループバックインタフェースを作成
[root@nx9030 djbdns-1.05]# cat /etc/sysconfig/network-scripts/ifcfg-lo1
DEVICE=lo:1
IPADDR=127.0.0.2
NETMASK=255.0.0.0
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback1
[root@nx9030 djbdns-1.05]# /etc/sysconfig/network-scripts/ifup \
> /etc/sysconfig/network-scripts/ifcfg-lo1
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# ## reboot時にも生成されるように/etc/rc.d/init.d/networkのifcfg-lo制御部にもlo1処理を追加
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# ## dnscache,walldnsをインストール
[root@nx9030 djbdns-1.05]# dnscache-conf dnscache dnslog /etc/dnscache 127.0.0.1
[root@nx9030 djbdns-1.05]# walldns-conf walldns dnslog /etc/walldns 127.0.0.2
[root@nx9030 djbdns-1.05]#
[root@nx9030 djbdns-1.05]# cd /etc/dnscache
[root@nx9030 dnscache]#
[root@nx9030 dnscache]# ## DNSクエリーを受け入れるノード設定
[root@nx9030 dnscache]# touch root/ip/127.0.0.1
[root@nx9030 dnscache]# touch root/ip/192.168.199
[root@nx9030 dnscache]#
[root@nx9030 dnscache]# ## ローカルアドレスの逆引きクエリーはwalldnsに問合せる設定
[root@nx9030 dnscache]# WALLIP=`cat /etc/walldns/env/IP`
[root@nx9030 dnscache]# echo $WALLIP > root/servers/168.192.in-addr.arpa
[root@nx9030 dnscache]# echo $WALLIP > root/servers/127.in-addr.arpa
[root@nx9030 dnscache]# echo $WALLIP > root/servers/10.in-addr.arpa
[root@nx9030 dnscache]#
[root@nx9030 dnscache]# ## DNS fowarder の設定
[root@nx9030 dnscache]# echo 192.168.199.254 > root/servers/\@
[root@nx9030 dnscache]# echo true > env/FORWARDONLY
[root@nx9030 dnscache]#
[root@nx9030 dnscache]# ## dnscache,walldnsを起動
[root@nx9030 dnscache]# ln -s /etc/dnscache /service
[root@nx9030 dnscache]# ln -s /etc/walldns /service
[root@nx9030 dnscache]# echo "nameserver" `cat /etc/dnscache/env/IP` > /etc/resolv.conf
参照 | |
---|---|
djbdns | http://djbdns.qmail.jp/ |
daemontools | http://www.emaillab.org/djb/daemontools/ |
EZ-NET特集 djbdns | http://network.station.ez-net.jp/special/djbdns/ |
dnscacheとtinydnsが同じポートUDP/53で競合する為、192.168.199.1[eth0] にalias機能で192.168.199.99[eth0:1]をオーバーラップさせる。
【2002.12.5】
NetGenesis SuperOPT70搭載のDNS forwarderを利用してdnscacheを停止する。tinydnsとaxfrdnsを192.168.199.1に移行し、192.168.199.99[eth0:1]は削除する。つまりこの細工は不要となった。
[root@portage root]#
[root@portage root]### aliasインタフェースを作成(eth0:0でも良かった?)
[root@portage root]#
[root@portage root]# /sbin/ifconfig eth0:1 inet 192.168.199.99
[root@portage root]#
[root@portage root]### aliasインタフェース作成の起動スクリプト
[root@portage root]#
[root@portage root]# cat /etc/sysconfig/network-scripts/ifcfg-eth0:1 実際はviで作成
DEVICE=eth0:1
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.199.99
NETMASK=255.255.255.0
GATEWAY=192.168.199.254
[root@portage root]#
U氏のご厚意によりセカンダリDNSを設置できた為、10月25日にaxfrdnsを導入しゾーン転送の設定を行う。インストール自体は難しくないが確認に時間がかかる。routerにUDPの53番も開ける必要があるらしい。(2002/10/27 OK)
レジストラのドメイン情報にもセカンダリDNSサーバ名を登録する必要があるので忘れずに。
[root@portage djbdns-1.05]# /usr/sbin/useradd -g djbdns -d /dev/null -s /bin/nologin axfrdns
[root@portage djbdns-1.05]# axfrdns-conf axfrdns dnslog /etc/tinydns 192.168.199.99
[root@portage djbdns-1.05]#
[root@portage djbdns-1.05]# cd /etc/tinydns/root/
[root@portage root]#
[root@portage root]#
[root@portage root]### レコード(いわゆるnamed.conf)の登録(ここはグローバルIPアドレス)
[root@portage root]#
[root@portage root]# cat data 実際はviで作成、211.127.***.***は全て同じアドレス
# SOA/NS/A
.bravotouring.com:211.127.*.*:ns1.bravotouring.com:259200
# SOA/NS
.bravotouring.com::ns.spanavi.net:259200
# MX/A
@bravotouring.com:211.127.*.*:mail.bravotouring.com:10:86400
# A
+www.bravotouring.com:211.127.*.*:86400
# TXT
'bravotouring.com:Powered by djbdns - http\072//cr.yp.to/djbdns.html
# SOA/NS
.yanoweb.com::ns1.bravotouring.com:259200
# MX
@yanoweb.com::mail.bravotouring.com:10:86400
# A
+www.yanoweb.com:211.127.*.*:86400
[root@portage root]#
[root@portage root]### シンボリックリンクを張ると svscan によって起動する
[root@portage root]#
[root@portage root]# ln -s /etc/axfrdns /service
[root@portage root]#
[root@portage root]### 念の為 tinydns を再起動
[root@portage root]#
[root@portage root]# svc -dx /service/tinydns
[root@portage root]#
[root@portage root]### セカンダリDNSに転送ゾーンデータへのアクセス許可を与える
[root@portage root]#
[root@portage root]# cd /etc/axfrdns
[yano@portage axfrdns]$ cat tcp 実際はviで作成、???.???は転送先DNSサーバ、***.***は転送するゾーンのアドレス
# sample line: 1.2.3.4:allow,AXFR="heaven.af.mil/3.2.1.in-addr.arpa"
219.117.???.???:allow,AXFR="bravotouring.com/***.***.127.211.in-addr.arpa"
:deny
[root@portage axfrdns]#
[root@portage axfrdns]# make
[root@portage axfrdns]#
[root@portage axfrdns]# cd ~yano/rpms/
[root@portage rpms]#
[root@portage rpms]# ## dataの更新後すぐにスレーブに反映させる為にtinydns-notify を使う
[root@portage rpms]# ## http://www.sericyb.com.au/tinydns-notify からダウンロード
[root@portage rpms]# snarf http://www.sericyb.com.au/tinydns-notify
[root@portage rpms]#
[root@portage rpms]# ## Perl の Net::DNS モジュールが必要なので
[root@portage rpms]# ## http://www.net-dns.org/ からRPMをインストール
[root@portage rpms]# snarf http://perldns.8k.com/5.6.1/perl-Net-DNS-0.32-1.i386.rpm \
> http://perldns.8k.com/5.6.1/perl-Digest-HMAC-1.01-1.i386.rpm \
> http://perldns.8k.com/5.6.1/perl-Digest-SHA1-2.02-1.i386.rpm
[root@portage rpms]# rpm -Uvh perl-*
Preparing...
1:perl-Digest-SHA1
2:perl-Digest-HMAC
3:perl-Net-DNS
[root@portage rpms]# cd /etc/tinydns/root/
[root@portage root]#
[root@portage root]# cat Makefile
data.cdb: data
/usr/local/bin/tinydns-data
./tinydns-notify data ← ★★ 追加 ★★
[root@portage root]#
[root@portage root]# echo ns.spanavi.net > notify-list
[root@portage root]#
[root@portage root]# make
/usr/local/bin/tinydns-data
./tinydns-notify data
Received NOTIFY answer for bravotouring.com from 219.117.???.??? ← ★★ answerがあれば多分OK ★★
[root@portage root]#
========================
[yano@portage yano]$ ## dnsq でプライマリDNSからSOAレコードを引く
[yano@portage yano]$ dnsq soa bravotouring.com 192.168.199.99
6 bravotouring.com:
143 bytes, 1+1+2+1 records, response, authoritative, noerror
query: 6 bravotouring.com
answer: bravotouring.com 2560 SOA ns1.bravotouring.com hostmaster.bravotouring.com 1036027635 16384 2048 1048576 2560
authority: bravotouring.com 259200 NS ns1.bravotouring.com
authority: bravotouring.com 259200 NS ns.spanavi.net
additional: ns1.bravotouring.com 259200 A 211.127.***.***
[yano@portage yano]$ ## セカンダリDNSからも同じレコードが引ければOK
[yano@portage yano]$ dnsq soa bravotouring.com ns.spanavi.net
6 bravotouring.com:
159 bytes, 1+1+2+2 records, response, authoritative, weird ra, noerror
query: 6 bravotouring.com
answer: bravotouring.com 2560 SOA ns1.bravotouring.com hostmaster.bravotouring.com 1036027635 16384 2048 1048576 2560
authority: bravotouring.com 259200 NS ns1.bravotouring.com
authority: bravotouring.com 259200 NS ns.spanavi.net
additional: ns1.bravotouring.com 259200 A 211.127.***.***
additional: ns.spanavi.net 86400 A 219.117.???.???
[yano@portage yano]$