[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+]

TCP wrapper

TCP wrapper は、様々なネットワークサービスに対してアクセス制御を 行うためのものです。
以下に、inetd から起動されるサービスに対してアクセス制御を行う 設定方法について、簡単に書きます。
# これもいろんなところで書かれていると思いますが…。

目次


1. 環境

OS:FreeBSD-3.2R (ちと古い…)
package:tcp_wrappers-7.6.tgz

2. 前準備

Linux や FreeBSD の場合、TCP wrapper のパッケージが存在しますので、 それを入れるのが一番簡単です。
ソースから作成される場合も、わりと make 一発的だったように思います。 (すみません、もう覚えていません。)

3. 設定

3.1 簡単な場合

まず、inetd から起動されるサービスでアクセス制御をかけたいものに TCP wrapper をかませます。 例えば、telnet と pop3 にアクセス制御をかけたい場合は、/etc/inetd.conf の該当箇所を以下のようにします。

  telnet stream  tcp   nowait  root  /usr/local/libexec/tcpd  telnetd
  pop3   stream  tcp   nowait  root  /usr/local/libexec/tcpd  /usr/local/libexec/popper -s

server program の箇所に tcpd を指定します。パッケージによっては tcpd のパスが異なるかもしれません。
server arguments には、実際に起動させるサービスを指定します。 /usr/libexec にあるサービス(ftpd や telnetd など)は絶対パスで指定 する必要はなさそうです。ただし、パッケージによっては /usr/libexec ではないかもしれません。

次に、アクセス制御の内容を指定します。
アクセス制御に関する設定ファイルは /usr/local/etc/hosts.allow と /usr/local/etc/hosts.deny です。 パッケージ等によってパスが異なるかもしれません。
hosts.allow に該当するエントリがあればアクセスが許可されます。 hosts.allow に該当するエントリがなく、hosts.deny に該当するエントリ がある場合は、アクセスが拒否されます。 hosts.allow, hosts.deny いずれにも該当するエントリがない場合は、 アクセスが許可されます。
さて、それぞれの書式ですが、詳しくはオンラインマニュアルの hosts_access(5) や hosts_options(5) にあります(man 5 hosts_access などとしてみてください) が、以下のようになります。

  daemon_list : client_list [ : options ]

daemon_list は、inetd.conf の server arguments の最初の引数に指定 したデーモン名になります。複数指定することもできます。
client_list は、許可(もしくは拒否)したいホスト名やアドレスもしくは その一部になります。複数指定することもできます。
各要素は : で区切られます。 また、先頭が # で始まる行はコメントとみなされます。
一般的には、hosts.deny には ALL : ALL とだけ書いておき(これはすべてを 拒否するという意味です)、hosts.allow に許可したい設定を書きます。
では、hosts.allow の簡単な例を示します。

  telnetd:      192.168.1. .in.usupi.org
  popper:       192.168.0.144/255.255.255.248 EXCEPT 192.168.0.150

client_list 部について説明します。
. から始まる場合、ホスト名の最後がそのパターンと一致する場合に、該当 することになります。 例えば、.in.usupi.org は www.in.usupi.org や a.b.c.in.usupi.org など のホストが該当します。
. でおわる場合、IPアドレスの最初がそのパターンと一致する場合に、該当 することになります。 例えば、192.168.1. は 192.168.1.0 から 192.168.1.255 まで該当します。
IPアドレスの場合、マスクを指定する方法も使用できます。IPアドレスのパターン の後に / で続けてマスクを指定します。 例えば、192.168.0.144/255.255.255.248 は 192.168.0.144 から 192.168.0.151 までが該当します。
また、EXCEPT を用いて例外を指定することができます。 list1 EXCEPT list2 という書式を用い、list1 は該当しますが、list2 は 該当しません。 例えば、192.168.0.144/255.255.255.248 EXCEPT 192.168.0.150 は、 192.168.0.144 から 192.168.0.149 と、192.168.0.151 が該当します。 (192.168.0.150 は例外となり該当しません。)
上記の他に、ALL や LOCAL などのワイルドカードも使用できます。
ALL はすべてが該当します。ALL は daemon_list 部にも使用できます。
LOCAL は . を含まないホスト名が該当します。
その他のワイルドカードについてはオンラインマニュアルを参照ください。

3.2 ちょっと凝ってみる

option の部分は、そのエントリに該当した時に様々なことを 行わせることができます。複数の指定も可能です。 以下にいくつか示します。詳しくは hosts_options(5) をご覧ください。

option 名意 味
allow(hosts.deny でも)許可します。
deny(hosts.allow でも)拒否します。
severity ログの種類syslog に飛ばしてくれます。
spawn shellコマンド指定したコマンドを実行します。
twist shellコマンド(daemon の代わりに)指定したコマンドを実行します。

spawn の場合は、子プロセスに指定したコマンドを実行させます。 よって、アクセスがあった時に管理者にメールを投げたりできます。
twist の場合は、そのプロセスが(daemon の代わりに)それを実行させます。 よって、もとの daemon は実行されません。

4. 動作確認

4.1 inetd に知らせる前に

hosts.allow などの確認をしてくれるコマンドがあります。
tcpdchk は、構文的に間違いがないかどうかチェックしてくれます。
tcpdmatch は、引数に指定した daemon とホストが許可されるかどうか を確認してくれます。例えば以下のようにします。

  % /usr/local/sbin/tcpdmatch popper tamao
  client:   hostname tamao
  client:   address  192.168.0.149
  server:   process  popper
  matched:  /usr/local/etc/hosts.allow line 4
  option:   spawn (/usr/local/sbin/popcheck 192.168.0.149) &
  access:   granted

FreeBSD の場合、OS についてくる /usr/sbin/tcpdchk, /usr/sbin/tcpdmatch とごっちゃにならないようにしてください。
# わたしは時々間違えます。(^__^;;

4.2 inetd に知らせてから

inetd.conf を編集したなら、以下のようにして inetd に知らせます。

  % kill -HUP `cat /var/run/inetd.pid`

あとは、実際にアクセスして確認します。
とりあえず的に確認したい場合は、自ホストを許可、localhost を拒否 しておいて、以下のようにアクセスしてみます。

  % telnet tamao 110
  Trying 192.168.0.149...
  Connected to tamao.
  Escape character is '^]'.
  +OK QPOP (version 2.53) at tamao starting.  <785.969974177@tamao>
  ...

  % telnet localhost 110
  Trying 127.0.0.1...
  Connected to localhost.
  Escape character is '^]'.
  Connection closed by foreign host.

これは、popper にアクセスした場合の例です。
localhost の場合は、popper の返事がなく、一定時間後に向こうから 接続を切られています。

5. 備考

inetd から起動されなプログラムでも、libwrap.so (あるいは libwrap.a)を 自前で組み込めば、tcpd と同様のアクセス制御を受けられるようです。 hosts_access(3) あたりにその記述があります。(試したことがないので よくわかりませんが…。(すみません…。))
FreeBSD では、3.0 あたりから、sendmail や portmap などが libwrap.so を組み込んでおり、/etc/hosts.allow を解釈してアクセス制御を行う ようになっているようです。(OS についてくる /usr/lib/libwrap.so の方 を組み込んでいるので、hosts.allow や hosts.deny のディレクトリが /etc になっているようです。(strings で確認しただけですが。))
デフォルトでは /etc/hosts.allow の先頭付近に ALL : ALL : allow と 書かれているため、何も制限がかかっていませんが、不用意にこの行を 削除したりすると、各所に影響が出るかもしれません。
# わたしは某所のメールサーバでその行を消してしまったことがあり、 メールサーバなのにメールを全部拒否するようにしてしまったことが あります。(-__-;;;

Powered by Apache PostgreSQL Usupi Logo Kuri Logo
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-]
usu@usupi.org Last modified : Wed Jun 6 14:35:47 2001