2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

ラッパを吹く(TCP Wrapperを極める)!

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

以上

コメント