Solaris 付属 tcp wrapper 設定

概要

Solaris 9 以降には TCP Wrapper が付属する。TCP Wrapper は、inetd 経由で起動するサービスに対して、接続元のホスト名や IP アドレスに基づいてアクセスを許可・拒否するしくみである。接続の成功と失敗は syslog(Solaris では通常 /var/adm/messages)に記録される。

使うには、TCP Wrapper を有効にする設定と、アクセス制御を記述する /etc/hosts.allow・/etc/hosts.deny の作成が必要である。有効化の方法は OS のバージョンによって異なる。

目次

関連する外部ページ

Solaris 10 以降での有効化(inetadm)

Solaris 10 以降では inetd は SMF で管理されるため、/etc/default/inetd ではなく inetadm コマンドで TCP Wrapper を有効にする。まず、現在の状態を確認する。

inetadm -p

表示される tcp_wrappers の値が FALSE のときは、TCP Wrapper は機能していない。次のコマンドで有効にする。

inetadm -M tcp_wrappers=TRUE

設定後、次のコマンドで tcp_wrappers の値が TRUE になったことを確認する。

inetadm -p

Solaris 9 での有効化(/etc/default/inetd)

Solaris 9 では、/etc/default/inetd に次の 1 行を追加して TCP Wrapper を有効にする。

ENABLE_TCPWRAPPERS=YES

設定を反映させるため、inetd を再起動する。

pkill -HUP inetd

/etc/hosts.allow の設定

TCP Wrapper は、まず /etc/hosts.allow を調べ、一致する行があれば接続を許可する。一致しない場合は /etc/hosts.deny を調べ、一致する行があれば拒否する。どちらにも一致しない場合は許可する。したがって、許可するものを /etc/hosts.allow に書き、/etc/hosts.deny ですべてを拒否するという組み合わせで設定する。

/etc/hosts.allow を、次の内容のファイルに置き換える。書式は「サービス名 : 接続元」である。

ALL : localhost 127.0.0.1 [::1]
in.telnetd : 133.xx.yy.
in.ftpd : 133.xx.yy.
sendmail : localhost

「133.xx.yy.」のように末尾をドットで終える書き方は前方一致であり、133.xx.yy.0/24 と同じ範囲を意味する。「133.xx.yy.0/255.255.255.0」という書き方もできる。「133.xx.yy.」の部分は、実際に許可する LAN のアドレスに書き換える。

接続元は、ホスト名ではなく IP アドレスで記述する。ホスト名で記述した場合は DNS の逆引き結果に依存するため、逆引きの設定や応答内容によって判定が変わる。

/etc/hosts.deny の設定

/etc/hosts.deny を、次の内容のファイルに置き換える。これにより、/etc/hosts.allow で許可していないすべての接続が拒否される。

ALL : ALL

/etc/hosts.allow と /etc/hosts.deny は、接続の要求ごとに読み込まれる。編集した時点で設定が有効になるため、inetd を再起動する必要はない。

SSH は TCP Wrapper の対象外である

Solaris に付属する sshd は TCP Wrapper に対応していない。/etc/hosts.allow や /etc/hosts.deny に sshd の行を書いても、ssh のアクセス制御はできない。ssh の接続制限は、次のどちらかで行う。

使わないサービスの停止

アクセス制御と合わせて、使わないサービス自体を停止する。

Solaris 10 以降では、inetd 経由のサービスは SMF で管理される。有効になっているサービスの一覧を表示し、使わないものを無効にする。

inetadm
inetadm -d svc:/network/telnet:default
inetadm -d svc:/network/ftp:default

Solaris 9 では、/etc/inetd.conf を編集し、使わないサービスの行をすべてコメントアウトする。

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

Solaris 9 で特定のサービスを有効にするときは、次の例を参考に /etc/inetd.conf に記述する。ENABLE_TCPWRAPPERS=YES を設定していれば、inetd 自身がアクセス制御を行うため、tcpd を経由させる記述は不要である。

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

telnet、ftp、rsh、rlogin は通信を暗号化しない。これらの代わりに ssh と sftp を使う。

動作確認(tcpdmatch)

tcpdmatch は、実際に接続を発生させずに、/etc/hosts.allow と /etc/hosts.deny の内容から許可・拒否の判定結果を表示するコマンドである。書式は「tcpdmatch サービス名 接続元アドレス」である。Solaris 付属版では /usr/sfw/sbin に置かれている。

/usr/sfw/sbin/tcpdmatch in.telnetd xxx.yyy.zzz.ddd
/usr/sfw/sbin/tcpdmatch in.ftpd xxx.yyy.zzz.ddd

「xxx.yyy.zzz.ddd」の部分は、確認したい IP アドレスに書き換える。

設定ファイルの記述に誤りがないかを検査するには、tcpdchk を使う。

/usr/sfw/sbin/tcpdchk -av

関連するマニュアルページは /usr/sfw/man にある。hosts.allow と hosts.deny の書式は hosts_access(3) で確認する。