TCP Wrapperは、Unixのセキュリティを語る第一歩である。inetd(スーパーデーモン)から起動されるデーモンのアクセス制御ができちゃう優れもんである。tcpdでトータル的に管理ができ非常に優れたセキュリティツールである。俺なんはぞこの方に随分お世話になった。filterかけないでWrapperだけで鯖を守った経験もある。ここでは、そのインスコ及び設定方法について書く。 さらに、qmailのアクセス制御を行うには、TCP Wrapperをソースからコンパイルしなければならない。
インストール環境 )
OS : FreeBSD4.4
1.インストール準備(ラッパのゲット)
TCP Wrapperはバイナリは配布されていない。したがって、ソースコードを ここ でゲットする。
執筆当時(2003年6月)では、 tcp_wrappers_7.6.tar.gzが最新であった。
したがって、このバージョンで話を進めていく。
2.インストール
# cd /usr/local/src
# tar zxvf tcp_wrappers_7.6.tar.gz
# cd tcp_wrappers_7.6
# vi Makefile
省略
# Ultrix 4.x SunOS 4.x ConvexOS 10.x Dynix/ptx
# REAL_DAEMON_DIR=/usr/etc
#
# SysV.4 Solaris 2.x OSF AIX #REAL_DAEMON_DIR=/usr/sbin
#
#
BSD 4.4 REAL_DAEMON_DIR=/usr/libexec ← ここをコメントアウト
#
# HP-UX SCO Unicos
#REAL_DAEMON_DIR=/etc
# Easy installation: vendor-provided network daemons are moved to “some
# other” directory, and the tcpd wrapper fills in the “holes”. For this
# mode of operation, the REAL_DAEMON_DIR macro should be set to the “some
# other” directory. The “…” is here for historical reasons only; you
# should probably use some other name.
#
# Uncomment the appropriate line if you are going to move your daemons.
#
# Ultrix 4.x SunOS 4.x ConvexOS 10.x Dynix/ptx
#REAL_DAEMON_DIR=/usr/etc/…
省略
# make freebsd
# cp safe_finger tcpd tcpdchk tcpdmatch try-from /usr/sbin/
3.設定
1) デーモンディレクトリの内容
デーモンディレクトリは、コンパイル時に/usr/libexecに設定したので以下のような内容になる。
# ls -al /usr/libexec
drwxr-xr-x 8 root wheel 1536 Jun 21 14:39 .
drwxr-xr-x 19 root wheel 512 Sep 19 2001 ..
drwxr-xr-x 2 root wheel 512 Mar 21 2002 aout
-r-xr-xr-x 1 root wheel 11224 Sep 19 2001 atrun
-r-xr-xr-x 1 root wheel 37492 Sep 19 2001 bootpd
-r-xr-xr-x 1 root wheel 11920 Sep 19 2001 bootpgw
-r-xr-xr-x 2 root wheel 2330 Sep 19 2001 catman.local
-r-xr-xr-x 1 root wheel 1693960 Sep 19 2001 cc1
-r-xr-xr-x 1 root wheel 1771528 Sep 19 2001 cc1obj
-r-xr-xr-x 1 root wheel 2219448 Sep 19 2001 cc1plus
-r-xr-xr-x 1 root wheel 8088 Sep 19 2001 comsat
-r-xr-xr-x 2 root wheel 155068 Sep 19 2001 cpp
-r-xr-xr-x 2 root wheel 155068 Sep 19 2001 cpp0
drwxr-xr-x 2 root wheel 512 Mar 21 2002 elf
-r-xr-xr-x 1 root wheel 2072312 Sep 19 2001 f771
-r-xr-xr-x 1 root wheel 6532 Sep 19 2001 fingerd
-r-xr-xr-x 1 root wheel 68716 Sep 19 2001 ftpd
-r-xr-xr-x 1 root wheel 6336 Sep 19 2001 getNAME
-r-xr-xr-x 1 root wheel 21256 Sep 19 2001 getty
-r-xr-xr-x 1 root wheel 9432 Sep 19 2001 hpropd
-rwxr-xr-x 1 root wheel 313064 Jun 21 14:38 in.proftpd
-r-xr-xr-x 1 root wheel 11824 Sep 19 2001 ipropd-master
-r-xr-xr-x 1 root wheel 11004 Sep 19 2001 ipropd-slave
-r-xr-xr-x 1 root wheel 19804 Sep 19 2001 k5admind
-r-xr-xr-x 1 root wheel 12680 Sep 19 2001 k5passwdd
-r-xr-xr-x 1 root wheel 13728 Sep 19 2001 kauthd
-r-xr-xr-x 1 root wheel 42436 Sep 19 2001 kdc
-r-xr-xr-x 1 root wheel 20752 Sep 19 2001 kipd
-r-xr-xr-x 1 root wheel 9084 Sep 19 2001 kpropd
-r-xr-xr-x 1 root wheel 76264 Sep 19 2001 ld-elf.so.1
-r-xr-xr-x 1 root wheel 123652 Sep 19 2001 lint1
-r-xr-xr-x 1 root wheel 26696 Sep 19 2001 lint2
-r-xr-xr-x 1 root wheel 4504 Sep 19 2001 locate.bigram
-r-xr-xr-x 1 root wheel 6328 Sep 19 2001 locate.code
-r-xr-xr-x 1 root wheel 2350 Sep 19 2001 locate.concatdb
-r-xr-xr-x 1 root wheel 3128 Sep 19 2001 locate.mklocatedb
-r-xr-xr-x 1 root wheel 3115 Sep 19 2001 locate.updatedb
drwxr-xr-x 3 root wheel 512 Mar 21 2002 lpr
-r-xr-xr-x 1 root wheel 20456 Sep 19 2001 mail.local
-r-xr-xr-x 1 root wheel 3528 Sep 19 2001 makekey
-r-xr-xr-x 2 root wheel 2330 Sep 19 2001 makewhatis.local
-r-xr-xr-x 1 root wheel 8004 Sep 19 2001 mknetid
-r-xr-xr-x 1 root wheel 241304 Sep 19 2001 named-xfer
-r-xr-xr-x 1 root wheel 11668 Sep 19 2001 ntalkd
-r-xr-xr-x 1 root wheel 13060 Sep 19 2001 pppoed
-r-xr-xr-x 1 root wheel 19060 Sep 19 2001 rbootd
-r-xr-xr-x 1 root wheel 7620 Sep 19 2001 revnetgroup
-r-xr-xr-x 1 root wheel 10408 Sep 19 2001 rexecd
-r-xr-xr-x 1 root wheel 10200 Sep 19 2001 rlogind
-r-xr-xr-x 1 root wheel 7112 Sep 19 2001 rpc.rquotad
-r-xr-xr-x 1 root wheel 9308 Sep 19 2001 rpc.rstatd
-r-xr-xr-x 1 root wheel 6892 Sep 19 2001 rpc.rusersd
-r-xr-xr-x 1 root wheel 6216 Sep 19 2001 rpc.rwalld
-r-xr-xr-x 1 root wheel 4696 Sep 19 2001 rpc.sprayd
-r-xr-xr-x 1 root wheel 11480 Sep 19 2001 rshd
drwxr-xr-x 2 root wheel 512 Mar 21 2002 sendmail
-r-xr-xr-x 1 root wheel 18608 Sep 19 2001 sftp-server
drwxr-xr-x 2 root wheel 512 Sep 19 2001 sm.bin
-r-xr-xr-x 1 root wheel 6200 Sep 19 2001 smrsh
-r-xr-xr-x 1 root wheel 73080 Sep 19 2001 telnetd
-r-xr-xr-x 1 root wheel 11196 Sep 19 2001 tftpd
drwxr-xr-x 2 root wheel 512 Mar 21 2002 uucp
-r-xr-xr-x 1 root wheel 6584 Sep 19 2001 uucpd
-r-xr-xr-x 1 root wheel 12828 Sep 19 2001 vfontedpr
-r-xr-xr-x 1 root wheel 14504 Sep 19 2001 xtend
-r-xr-xr-x 1 root wheel 951 Sep 19 2001 yppwupdate
-r-xr-xr-x 1 root wheel 20744 Sep 19 2001 ypxfr
2) 元々デーモンディレクトリ(/usr/libexec)に無いモジュールについて
例えば、Proftpdのin.proftpdようにデーモンディレクトリに無いモジュールについては、tcpdで一括制御できない。したがって、/usr/libexecにin.proftpdを移動してデーモンディレクトリから起動してラッパーの制御を行う。
# mv /usr/local/sbin/in.proftpd /usr/libexec
3) inetd.confの設定
基本的に、/usr/sbin/tcpdで一括制御を行うが2)のようにデーモンディレクトリに無いモジュールの場合は、個別に/usr/libexecのモジュールで制御する。以下に設定内容を示す。
# cd /etc
# vi inetd.conf
# $FreeBSD: src/etc/inetd.conf,v 1.44.2.5 2001/08/04 16:06:44 rwatson Exp $
#
# Internet server configuration database
#
# Define *both* IPv4 and IPv6 entries for dual-stack support.
# To disable a service, comment it out by prefixing the line with ‘#’.
# To enable a service, remove the ‘#’ at the beginning of the line.
#
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd ← tcpdで一括制御
ftp stream tcp nowait root /usr/libexec/in.proftpd in.proftpd ← デーモンディレクトリを指定して制御
smtp stream tcp nowait qmaild /usr/sbin/tcpd /var/qmail/bin/tcp-env /var/qmail /bin/qmail-smtpd
4) hosts.allow及びhosts.denyの設定
ラッパーの制御は、まずhosts.denyですべてのサービスを禁止にする。そして、hosts.allowで個別に許可する設定を加える。
# cd /etc
# vi hosts.deny
# ALL Deny
ALL : ALL ← すべてのサービスを禁止とする。
# vi hosts.allow
# $FreeBSD: src/etc/inetd.conf,v 1.44.2.5 2001/08/04 16:06:44 rwatson Exp $
#
# Internet server configuration database
#
# Define *both* IPv4 and IPv6 entries for dual-stack support.
# To disable a service, comment it out by prefixing the line with ‘#’.
ALL : PARANOID : RFC931 20 : deny ← ホスト名・ドメイン名偽造による不正アクセスを排除。
#qmail RELAY
tcp-env: 192.168.255.6, 127.0.0.1 : setenv = RELAYCLIENT ← qmailアクセス制御。
tcp-env: 192.168.255. : setenv = RELAYCLIENT
tcp-env: ALL
# Local Network Allow
ALL : 192.168.255.0/255.255.255.0 ← 192.168.255.0のネットワークに対しすべてのサービスを許可する。
ALL : 127.0.0.1 ← 自分自身に対してすべてのサービスを許可する。
# host allow
in.proftpd : gw.hogehoge.net ← gw.hogehoge.netホストに対してin.proftpdを許可する。
in.proftpd : unko.moreta.com ← unko.moreta.comホストに対してin.proftpdを許可する。
in.proftpd : .yoiko.net ← yoiko.netドメインのすべてのホストに対してin.proftpdを許可する。
in.proftpd : 203.141.144.180 ← 203.141.144.180のホストに対してin.proftpdを許可する。
sshd : 203.141.144.180 ← 203.141.144.180のホストに対してsshdを許可する。sshは、inetdからの起動ではないが、ラッパが効く!このことは結構知らない人が多い。
# All allow
in.qpopper : ALL EXCEPT 221.148.188.194 : allow ← ALL+alloowですべてのホストに対してin.qpopperを許可するが。ただし、EXCEPT演算子を使った場合は、後に記述したIPアドレスもしくは、ホスト名の輩は拒否する。
4.起動
スーパーデーモン再起動。
# ps axw | grep inetd
15938 ?? Is 0:00.03 /usr/sbin/inetd -wW
# kill -9 15938
# /usr/sbin/inetd -wW
5.動作チェック
1) hosts.allow及びhosts.denyのチェック
# tcpdchk -v
2) 個別に許可・不許可をチェックする
# tcpdmatch in.proftpd gw.hogehoge.net
warning: in.proftpd: service possibly not wrapped
client: hostname gw.hogehoge.net
client: address ***.***.***.***
server: process in.proftpd
matched: /etc/hosts.allow line 29
access: granted
# tcpdmatch in.qpopper ns.hogehoge.net
client: hostname ns.hogehoge.net
client: address ***.***.***.***
server: process in.qpopper
matched: /etc/hosts.allow line 15
option: allow
access: granted
# tcpdmatch in.qpopper 221.148.188.194
client: address 221.148.188.194
server: process in.qpopper
access: denied
# tcpdmatch in.qpopper 192.168.255.6
client: address 192.168.255.6
server: process in.qpopper
access: granted
以上
コメント