TCP Wrapperを利用したアクセス制御

基本中の基本です

TCP Wrapperとは?

 TCP Wrapperとは、特定のプログラムを指している言葉ではありません。簡単に言えば、TCPを利用するプログラム(主にサーバー上で動作するデーモン)のセキュリティを向上するために利用されるプログラム群を総称してTCP Wrapperと呼びます。

 ここでは、/etc/inetd.confから呼び出されるプログラムに対し、自身を経由することによりアクセス制御機能を追加する/user/sbin/tcpdと、単独で動作するプログラムに対しアクセス制御機能を追加するlibwrapについて簡単に説明します。

 

/etc/inetd.confからtcpdを利用する

 Turbo Linuxでは、インストールされた時点でinetd.confにtcpdを利用する設定が既に記述されています。一例を示すと、

telnet  stream  tcp  nowait  root  /usr/sbin/tcpd  in.telnetd -h

 このような感じで記述されているはずです(Telnetの例)。

 代表的な外部向けサービスについてはインストールされた時点ですでに記述がありますが、全てコメントアウトされているので、TCP Wrapperを利用する際には作業が必要です。具体的には、

1. 利用したいサービスのコメント("#")を外す
2. /etc/hosts.allowと/etc/hosts.denyに、利用したいサービスのアクセス制御内容を記述する
3. inetdを再起動する(root権限でkillall -HUP inetd)

という作業が必要になります。

 

単独プログラムからlibwrapを利用する

 外部向けにサービスを提供するプログラムの中には、inetd経由で起動されない物もあります。代表的なものとしてはsendmailやhttpdがそうです。これらのプログラムは独自にアクセス制御の仕組みを持っていますが、libwrapはその機能をライブラリ化したもので、外部プログラムから呼び出して利用します。

 ただし、どのプログラムでも利用できるという物ではなく、プログラム側がlibwrapに対応する必要があります。実際に対応している物としては、sshd(SSHのサーバープログラム)が挙げられます。

 具体的なアクセス制御の内容は、/etc/inetd.confからtcpdを利用する場合と同じく、/etc/hosts.allowと/etc/hosts.denyに記述します。

 

/etc/hosts.allowと/etc/hosts.denyの記述

 hosts.allowとhosts.denyの記述は非常に簡単です。しかし、ここの記述内容を書き誤ると、いくらTCP Wrapperを利用していても全く無意味になりますので、細心の注意を払って記述する必要があります。

 内容が適用される順番ですが、まずhosts.allowが評価されます。ここで該当する記述があった場合は利用を許可し、そこで評価は終わります。hosts.allowに該当する記述がなかった場合のみ、hosts.denyが評価されます。ここで該当する記述があった場合は利用を拒絶し、そこで評価は終わります。そしてhosts.allowにもhosts.denyにも該当する記述がなかった場合は、利用を許可します。このため、hosts.denyの最後には"ALL: ALL"を必ず記述しておきましょう。

 基本的な書式は"(利用を許可するサービス名):(制限/許可の対象となるホスト)"となります。ホストの指定の方法は色々ありますが、多いのはIPアドレスだと思います。これを必要なだけ列挙する形を取ります。例えば、/etc/hosts.allowの

ALL : 127.0.0.1

 という記述は、"127.0.0.1というホストに対し、全てのサービスの利用を許可する"という意味になります。同じく/etc/hosts.allowの

# For Secure Shell
sshd : 192.168.0.2

 という記述は、"192.168.0.2というIPアドレスを持つホストに対してsshdの利用を許可する"という意味になります。このような記述を積み重ねることにより、制御内容を記述します。

 /etc/hosts.denyの記述方式も全く同じです。ただし、先にも書いたとおりhosts.denyには必ず"ALL:ALL"を入れておくべきです。というか、"ALL:ALL"の一文だけあればいいと思います。自分が利用を許可したいホストやサービスの記述を全てhosts.allowにすれば、hosts.denyはALL:ALLだけ書けば事足りるはずです。

 これらの内容を記述した後にkillall -HUP inetdとし、inetdを再起動すれば、記述内容が有効になります。