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 9 での有効化(/etc/default/inetd)
- /etc/hosts.allow の設定
- /etc/hosts.deny の設定
- SSH は TCP Wrapper の対象外である
- 使わないサービスの停止
- 動作確認(tcpdmatch)
【関連する外部ページ】
- Oracle Solaris での TCP Wrapper の利用: https://docs.oracle.com/cd/E37838_01/html/E60991/gnknx.html
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 の接続制限は、次のどちらかで行う。
- /etc/ssh/sshd_config の AllowUsers、DenyUsers、AllowGroups などで、接続できるユーザを限定する。
- IPFilter(Solaris 11.4 以降は PF)で、22 番ポートへの接続元アドレスを限定する。
使わないサービスの停止
アクセス制御と合わせて、使わないサービス自体を停止する。
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) で確認する。