Kozupon.com    
 
 ラッパを吹く(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

以上


 
 
 



Copyright 2012 Kozupon.com.