Solaris 付属 tcp wrapper 設定

概要

Solaris 9 以降に付属する TCP Wrapper(tcpd)を使うための設定方法をまとめる。TCP Wrapper とは、inetd 経由で起動するサービスに対して、接続元のホスト名や IP アドレスに基づいてアクセスを許可・拒否するしくみである。設定には、/etc/default/inetd の編集、/etc/hosts.allow・/etc/hosts.deny の記述、(Solaris 9 以前では)/etc/inetd.conf の編集が必要である。

目次

/etc/default/inetd の設定

Solaris 9 (以降) には、TCP Wrapper が付属している。使うには設定が必要である。

/etc/default/inetd に、次の1行を追加する。

ENABLE_TCPWRAPPERS=YES

/etc/hosts.allow の設定

/etc/hosts.allow を、以下の内容のファイルに置き換える。

ALL : localhost 127.0.0.1 [::1] : allow
sshd : <適切なIPアドレス> : allow
ALL : PARANOID : RFC931 20 : deny
sendmail : localhost : allow
sendmail : ALL : deny
ALL : ALL : deny

PARANOID は、逆引きしたホスト名を再度順引きした結果が一致しないホストにマッチするキーワードである(DNS の設定が疑わしいホストや、名前を詐称している可能性のあるホストを検出するために使う)。RFC931 は、RFC 931(IDENT)プロトコルでクライアント側のユーザ名を問い合わせるオプションであり、末尾の数字はタイムアウト秒数(この例では20秒)である。クライアント側で IDENT サーバが動いていない場合は問い合わせに失敗し、その分だけ接続確立が遅くなることがある。

/etc/hosts.deny の設定

/etc/hosts.deny を、以下の内容のファイルに置き換える。

ALL : ALL EXCEPT LOCAL

上の /etc/hosts.allow の最後の行(ALL : ALL : deny)で、すでに許可されなかったすべての接続を拒否しているが、/etc/hosts.deny 側にも同様のルールを置き、二重に防御している。

/etc/inetd.conf の設定(Solaris 9 以前)

(Solaris 9 あるいは 9 以前での設定) ついでに、/etc/inetd.conf も見直す。使わないサービスはすべてコメントアウトする。次の例のコメント中にある tcpd は、自前で TCP Wrapper をインストールしていた時代の設定例である。Solaris 9 以降の付属版では、ENABLE_TCPWRAPPERS=YES により inetd 自身がラップ処理を行うため、inetd.conf 側で tcpd を明示的に呼び出す必要はない。

# ftp     stream  tcp     nowait  root    /usr/local/sbin/tcpd    in.ftpd
# telnet  stream  tcp     nowait  root    /usr/local/sbin/tcpd    in.telnetd
# shell   stream  tcp     nowait  root    /usr/local/sbin/tcpd    in.rshd
# login   stream  tcp     nowait  root    /usr/local/sbin/tcpd    in.rlogind
# exec    stream  tcp     nowait  root    /usr/local/sbin/tcpd    in.rexecd
# finger  stream  tcp     nowait  nobody  /usr/local/sbin/tcpd    in.fingerd

もし、特定のサービスを有効にしたいときは、/etc/inetd.conf は、次の例を参考に設定する(Solaris 9 での設定例)。ENABLE_TCPWRAPPERS=YES が設定済みであれば、tcpd を経由しなくても TCP Wrapper によるアクセス制御が働く。

ftp     stream tcp6 nowait root /usr/sbin/in.ftpd -a

動作確認(tcpdmatch)

設定したら、tcpdmatch process_name address(例:tcpdmatch in.tftpd 127.0.0.1)でテストする。tcpdmatch は、実際に接続を発生させずに、hosts.allow・hosts.deny の設定内容から許可・拒否の判定結果を確認できるコマンドである。

/usr/local/sbin/tcpdmatch in.telnetd xxx.yyy.zzz.ddd
/usr/local/sbin/tcpdmatch in.sshd xxx.yyy.zzz.ddd
「xxx.yyy.zzz.ddd」の部分は、確認したい適切な IP アドレスに置き換える。