CentOS6のTCP Wrapperの概要と設定方法について下記資料を読んでまとめました。
Red Hat Enterprise Linux 6 セキュリティガイド”2.6. TCP Wrapper と xinetd”
※目次をクリックすると目次の下部にコンテンツが表示されます。
TCP Wrapperの概要
1)iptable、TCP Wrapper、xinetdの関係
・CentOS6では、iptable、TCP Wrapper、xinetdなどのツールを用いてネットワークサービスへのアクセス制御を階層化して行っている。
・iptableベースのファイアウォールは、カーネルのネットワークスタック内の不要なネットワークパケットを除去する。
・TCP Wrapperはどのホストが”Wrapされた”ネットワークサービスに対して接続許可、拒否を定義し、iptable上に新たな保護層を追加する。
上記”Wrapされた”ネットワークサービスの1つがxinetdスーパーサーバーで、ネットワークサービスのサブセット(telnetやftpなど)への接続を制御する。
2)TCP Wrapperの概要
・ネットワークサービスに対するホストベースのアクセス制御を提供。
・パッケージ内の最も重要なコンポーネントは/lib/libwrap.soまたは/lib64/libwrap.soライブラリ。
一般的に言うと、TCPで”Wrapされた”サービスとはlibwrap.soライブラリに対してコンパイルされたもの。
・TCPで”Wrapされた”サービスへの接続を試行する際には、クライアントが接続を許可されるかどうかを決定するために、アクセスファイル(/etc/hosts.allowおよび/etc/hosts.deny)を参照する。
・多くの場合、要求しているクライアントと要求されたサービスの名前を/var/log/secureまたは/var/log/messagesに書き込むために、syslogデーモン(syslogd)を使用する。
・クライアントが接続を許可されると、TCP Wrapperは要求されたサービスへの接続制御を解放し、それ以降はクライアントとサーバー間の通信に介入しない。
・アクセス制御とロギング以外にも、クライアントとやりとりするためのコマンドを実行できる。
利用例としては、/usr/sbin/sshd、/usr/sbin/sendmail、/usr/sbin/xinetdなどがあり、libwrap.soライブラリにリンクされている。
※ネットワークサービスのバイナリがlibwrap.soにリンクされていることを確認するには、rootユーザーで下記を実行する。
ldd バイナリ名 | grep libwrap
例)
・CentOS6では、iptable、TCP Wrapper、xinetdなどのツールを用いてネットワークサービスへのアクセス制御を階層化して行っている。
・iptableベースのファイアウォールは、カーネルのネットワークスタック内の不要なネットワークパケットを除去する。
・TCP Wrapperはどのホストが”Wrapされた”ネットワークサービスに対して接続許可、拒否を定義し、iptable上に新たな保護層を追加する。
上記”Wrapされた”ネットワークサービスの1つがxinetdスーパーサーバーで、ネットワークサービスのサブセット(telnetやftpなど)への接続を制御する。
2)TCP Wrapperの概要
・ネットワークサービスに対するホストベースのアクセス制御を提供。
・パッケージ内の最も重要なコンポーネントは/lib/libwrap.soまたは/lib64/libwrap.soライブラリ。
一般的に言うと、TCPで”Wrapされた”サービスとはlibwrap.soライブラリに対してコンパイルされたもの。
・TCPで”Wrapされた”サービスへの接続を試行する際には、クライアントが接続を許可されるかどうかを決定するために、アクセスファイル(/etc/hosts.allowおよび/etc/hosts.deny)を参照する。
・多くの場合、要求しているクライアントと要求されたサービスの名前を/var/log/secureまたは/var/log/messagesに書き込むために、syslogデーモン(syslogd)を使用する。
・クライアントが接続を許可されると、TCP Wrapperは要求されたサービスへの接続制御を解放し、それ以降はクライアントとサーバー間の通信に介入しない。
・アクセス制御とロギング以外にも、クライアントとやりとりするためのコマンドを実行できる。
利用例としては、/usr/sbin/sshd、/usr/sbin/sendmail、/usr/sbin/xinetdなどがあり、libwrap.soライブラリにリンクされている。
※ネットワークサービスのバイナリがlibwrap.soにリンクされていることを確認するには、rootユーザーで下記を実行する。
ldd バイナリ名 | grep libwrap
例)
# ldd /usr/sbin/sshd | grep libwrap libwrap.so.0 => /lib/libwrap.so.0 (0x0031b000)
3)TCP Wrapperの利点
・接続しているクライアントと”Wrapされた”ネットワークサービスは共にTCP Wrapperが使用されていることを認識させずに動作する。
・TCP Wrapperは、保護対象のネットワークサービスとは独立して動作し、数多くのサーバーアプリケーションがアクセス制御設定ファイルの共通セットを共有して、よりシンプルな管理を行えるようにする。
TCP Wrapperのパッケージ
①TCP Wrapperのライブラリのパッケージ
私のCentOS6の環境では、xinetdを利用していなかったのでTCP Wrapperも利用していないと思っていたのですが、下記のTCP Wrapperのライブラリのパッケージがインストールされていました。
私のCentOS6の環境では、xinetdを利用していなかったのでTCP Wrapperも利用していないと思っていたのですが、下記のTCP Wrapperのライブラリのパッケージがインストールされていました。
$ yum info tcp_wrappers-libs Installed Packages Name : tcp_wrappers-libs Arch : x86_64 Version : 7.6 Release : 57.el6 Size : 128 k Repo : installed From repo : anaconda-CentOS-201112091719.x86_64 Summary : Libraries for tcp_wrappers URL : ftp://ftp.porcupine.org/pub/security/index.html License : BSD Description : tcp_wrappers-libs contains the libraries of the tcp_wrappers : package.
②TCP Wrapperのデーモンプログラム
上記ライブラリとは別にデーモンプログラム用のパッケージもありましたが、こちらはインストールされていませんでした。
$ yum info tcp_wrappers Available Packages Name : tcp_wrappers Arch : x86_64 Version : 7.6 Release : 57.el6 Size : 61 k Repo : base Summary : A security tool which acts as a wrapper for TCP daemons URL : ftp://ftp.porcupine.org/pub/security/index.html License : BSD Description : The tcp_wrappers package provides small daemon programs which can : monitor and filter incoming requests for systat, finger, FTP, : telnet, rlogin, rsh, exec, tftp, talk and other network services. : : Install the tcp_wrappers program if you need a security tool for : filtering incoming network services requests. : : This version also supports IPv6.
TCP Wrapperの設定方法
1)TCP Wrapperの設定ファイル
・一般的にホストアクセスファイルと呼ばれる、/etc/hosts.allowと/etc/hosts.denyを使用する。
・hosts.allowにあるアクセスルールが最初に適用されるので、それらのルールがhosts.denyで指定されたルールよりも優先される。
そのため、サービスへのアクセスが hosts.allowで許可されると、hosts.denyにある同じサービスへのアクセス拒否ルールは無視される。
・各ファイルにあるルールは上から下に読み込まれ、指定されたサービスに最初にマッチするルールのみが適用される。
・サービスについてのルールがどのファイルにも見つからないか、またはいずれのファイルも存在しなければ、サービスへのアクセスは許可される。
・TCPでラップされたサービスは、ホストのアクセスファイルからのルールをキャッシュしないので、hosts.allowやhosts.denyのすべての変更は、ネットワークサービスを再起動しなくても直ちに有効になる。
・ホストのアクセスファイルの最後の行が改行文字(Enterキーを押して作成される)でなければ、ファイルにある最後のルールは失敗して、エラーが /var/log/messagesまたは/var/log/secureのどちらかにログ記録される。
①/etc/hosts.allow
TCPでラップされたサービスは/etc/hosts.allowファイルを順番に解析し、そのサービスに指定された最初のルールを適用する。
マッチするルールを見つけると、接続を許可し、見つからなければ、次のステップに進む。
②/etc/hosts/deny
TCPでラップされたサービスは/etc/hosts.denyファイルを順番に解析し、マッチするルールを見つけると、接続を拒否し、見つからなければ、サービスへのアクセスを許可する。
2)アクセスルールのフォーマット
〇構文
<daemon list> : <client list> [: <option> : <option> : …]
・空行またはハッシュ(#)で始まる行は無視される。
①daemon list
・コンマ区切りのプロセス名(サービス名ではない)の一覧。
・ALLですべてのデーモンにマッチ。
②client list
・ホスト名、IPアドレス、特別なパターン、またはワイルドカードのコンマ区切りのリスト。
・ALLですべてのホストにマッチ。
③option
・ルールが起動されたときに実行されるオプションのアクション、またはアクションのコロン区切りのリスト。
・オプションのフィールドは、拡張、シェルコマンドの起動、アクセスの許可または拒否、および他のロギング動作をサポートする。
例)オプションを指定した例
・一般的にホストアクセスファイルと呼ばれる、/etc/hosts.allowと/etc/hosts.denyを使用する。
・hosts.allowにあるアクセスルールが最初に適用されるので、それらのルールがhosts.denyで指定されたルールよりも優先される。
そのため、サービスへのアクセスが hosts.allowで許可されると、hosts.denyにある同じサービスへのアクセス拒否ルールは無視される。
・各ファイルにあるルールは上から下に読み込まれ、指定されたサービスに最初にマッチするルールのみが適用される。
・サービスについてのルールがどのファイルにも見つからないか、またはいずれのファイルも存在しなければ、サービスへのアクセスは許可される。
・TCPでラップされたサービスは、ホストのアクセスファイルからのルールをキャッシュしないので、hosts.allowやhosts.denyのすべての変更は、ネットワークサービスを再起動しなくても直ちに有効になる。
・ホストのアクセスファイルの最後の行が改行文字(Enterキーを押して作成される)でなければ、ファイルにある最後のルールは失敗して、エラーが /var/log/messagesまたは/var/log/secureのどちらかにログ記録される。
①/etc/hosts.allow
TCPでラップされたサービスは/etc/hosts.allowファイルを順番に解析し、そのサービスに指定された最初のルールを適用する。
マッチするルールを見つけると、接続を許可し、見つからなければ、次のステップに進む。
②/etc/hosts/deny
TCPでラップされたサービスは/etc/hosts.denyファイルを順番に解析し、マッチするルールを見つけると、接続を拒否し、見つからなければ、サービスへのアクセスを許可する。
2)アクセスルールのフォーマット
〇構文
<daemon list> : <client list> [: <option> : <option> : …]
・空行またはハッシュ(#)で始まる行は無視される。
①daemon list
・コンマ区切りのプロセス名(サービス名ではない)の一覧。
・ALLですべてのデーモンにマッチ。
②client list
・ホスト名、IPアドレス、特別なパターン、またはワイルドカードのコンマ区切りのリスト。
・ALLですべてのホストにマッチ。
③option
・ルールが起動されたときに実行されるオプションのアクション、またはアクションのコロン区切りのリスト。
・オプションのフィールドは、拡張、シェルコマンドの起動、アクセスの許可または拒否、および他のロギング動作をサポートする。
例)オプションを指定した例
sshd : .example.com \ : spawn /bin/echo `/bin/date` access denied>>/var/log/sshd.log \ : deny
※それぞれのオプションフィールドの前にはバックスラッシュ(\)が付けられることに注意。
TCP Wrapperの詳細設定
1)syslogでロギング
severity指示文を使用してログファシリティおよびルールの優先レベルを指定できる。
①emergの優先度でデフォルトのファシリティ(authpriv)を指定する例
sshd : .example.com : severity emerg
②alertの優先度でlocal0ファシリティを指定する例
sshd : .example.com : severity local0.alert
2)1つのファイル(hosts.allowまたはhosts.deny)にまとめてallowとdenyを指定
下記例のようにallowまたはdeny指示文を最終オプションとして追加してルールを設定し、一つのファイルで統合することもできる。
sshd : client-1.example.com : allow
sshd : client-2.example.com : deny
3)シェルコマンド
①spawn
・子プロセスとしてシェルコマンドを起動。
・要求しているクライアントについてのより詳しい情報を得るために/usr/sbin/safe_fingerの使用などのタスクを実行できる。
・echoコマンドを使用して特殊なログファイルを作成することもできる。
例)カスタムのログを作成する例
severity指示文を使用してログファシリティおよびルールの優先レベルを指定できる。
①emergの優先度でデフォルトのファシリティ(authpriv)を指定する例
sshd : .example.com : severity emerg
②alertの優先度でlocal0ファシリティを指定する例
sshd : .example.com : severity local0.alert
2)1つのファイル(hosts.allowまたはhosts.deny)にまとめてallowとdenyを指定
下記例のようにallowまたはdeny指示文を最終オプションとして追加してルールを設定し、一つのファイルで統合することもできる。
sshd : client-1.example.com : allow
sshd : client-2.example.com : deny
3)シェルコマンド
①spawn
・子プロセスとしてシェルコマンドを起動。
・要求しているクライアントについてのより詳しい情報を得るために/usr/sbin/safe_fingerの使用などのタスクを実行できる。
・echoコマンドを使用して特殊なログファイルを作成することもできる。
例)カスタムのログを作成する例
in.telnetd : .example.com \ : spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log \ : allow
②twist
・要求されたサービスを指定したコマンドに置き換える。
・この指示文は、侵入者に対するトラップをセットアップするために使用されることが多くある。
また、接続しているクライアントにメッセージを送るためにも使用できる。
・twist指示文は、ルール行の末尾に置く必要がある。
例)メッセージを通知する例
vsftpd : .example.com \ : twist /bin/echo "421 %h has been banned from this server!"