TCPラッパーでLinuxをセキュアにする:クイックハウツー
TCPラッパーを使用してLinuxシステムのセキュリティを強化することは、本質的に2つのファイルを編集することを含みます。最初のファイルはhosts.allowファイルで、これにより管理者はアクセスを許可するホストまたはネットワークを指定できます。もう一つのファイルはhosts.denyで、ここではアクセスを拒否されるホストまたはネットワークを明示的に列挙します。これらのファイルは、どのサービスがアクセス可能または保護されるべきかを指定することもできます。
これはネットワーク上のシステムを保護するための基本的で単純なアプローチですが、ホワイトリストに載っているホストを許可しつつ、明示的に指定されたホストやネットワークのアクセスを防ぐ効果があります。特定のシナリオにおいては、基本的なネットワークセキュリティを迅速かつ容易に実装する方法となり得ます。また、システムファイアウォールの他に冗長性の層を追加します。ただし、以下に説明するように、より高度で現代的な技術を検討することも価値があります。
このチュートリアルでは、TCPラッパーを使用してLinuxシステムを保護する方法を見ていきます。ホストやネットワーク全体があなたのシステムや特定のサービスにアクセスすることを許可または拒否するために実装できる設定の例を示します。さらに、システムセキュリティの防御ラインの一部としてTCPラッパーの使用に興味を持っているLinux管理者のための重要な考慮事項についても説明します。
このチュートリアルでは、あなたは学びます:
- TCPラッパーを使用する際の制限と考慮事項
- TCPラッパーの許可および拒否ルールを設定する方法
TCPラッパーは依然として関連性のあるセキュリティ対策ですか?
TCPラッパーを設定する前に、すべてのユーザーはその制限を知っておくべきです。
システムのハードニングにTCPラッパーを利用することは、Linux管理者によって主に廃止され、デフォルトのファイアウォールであるiptables/nftables、またはufwやfirewalldのような人気のあるフロントエンドが好まれるようになっています。
現代のディストリビューションに関するサポート
まず、最近のLinuxディストリビューションの中には、もうTCPラッパーをサポートしていないものもあります。したがって、TCPラッパーの使用に飛び込む前に、作業しているシステムを考慮し、ネイティブサポートを確認する必要があります。お使いのLinuxディストリビューションの公式ドキュメントを参照するのは良い出発点です。それ以外の場合、システム上にhosts.allowおよびhosts.denyファイルが存在するかどうかを確認することで、この設定がサポートされているかどうかを確認できます。
こちらが、TCPラッパーの使用がもはやサポートされていない私たちのArch Linuxテストシステムでの結果です:
ls -l /etc/hosts.allow
ls: cannot access '/etc/hosts.allow': No such file or directory
そして、こちらが私たちのUbuntuテストシステムでの結果です。そこでTCPラッパーの使用はまだサポートされています:
ls -l /etc/hosts.allow
-rw-r--r-- 1 root root 411 Feb 22 2023 /etc/hosts.allow
ファイアウォールの代替
TCPラッパーの実装は20年前の一般的なセキュリティ対策であり、それ以前はごく普通のことでした。最近では、ほとんどのLinux管理者が、組み込みのiptablesファイアウォールや前述のいくつかの簡単なフロントエンドを使用することを選んでいます。
ネットフィルター(iptablesやnftablesが依存するシステム)は2001年からLinuxカーネルに組み込まれており、その導入と広範な採用は、TCPラッパーのような古いネットワーク強化手法を多くのユーザーにとって無意味なものにしました。
TCPラッパーを利用したい理由は以下の通りです:
- 現在のファイアウォールルールを繰り返し確認するための第二の防御ライン - ファイアウォールがオフになったり、誤って設定されてしまった場合でも、TCPラッパーが依然として必要な接続のブロックまたは許可を積極的に行うことを意図しています。
- もしあなたが単純なネットワークルール(例えば、テストシステム上で)を実装したいだけで、ファイアウォールに手を加えたくないのであれば
- アプリケーションへのネットワークアクセスを制御する必要がある場合、TCPラッパーは特定のサービス(vsftpdやsshdを考えてみてください)への接続をブロックまたは許可できます。そのため、ネットワークプロトコルではなく、特定のサービスに焦点を当てます。
- ファイアウォールルールとそれをプログラムするための必要な構文は、特にTCPラッパーの単純さと明快さに比べるとかなり複雑であることがあります。
ファイアウォールを使用するべき理由に加えて TCPラッパー、または多くのシステム管理者が単にファイアウォールを選ぶ理由の代わりに TCPラッパーを使用する理由:
- ファイアウォールはステートフルパケットインスペクションを可能にし、管理者がさまざまな条件に基づいてパケットフローを制御するための複雑で詳細なルールを作成できるようにします。
- TCPラッパーはすべてのLinuxシステムでサポートされているわけではありません
- ファイアウォールはログ記録とリアルタイムトラフィック分析をサポートしているので、システムを通過する際に何が正確に拒否されたり許可されたりしているのかを確認できます。
- システムファイアウォールは、プロトコル(FTPやSSHなど)に基づいてトラフィックを許可または拒否することができるのに対し、TCPラッパーはホスト、ネットワーク、または特定のサービスからのトラフィックを許可または拒否することしかできません。
- ファイアウォールは、入力(受信トラフィック)、出力(送信トラフィック)、および転送(他の場所に再ルーティングされる受信トラフィック)のルールを作成するためのチェーンをサポートしています。
他にもたくさんの理由がありますが、これは最も説得力のある理由のいくつかです。ご覧のように、ファイアウォールを使用する理由は、TCPラッパーを使用する理由を上回っています。
これは、あなたがTCPラッパーを使用することを思いとどまらせるためのものではありません。この説明は、より広く受け入れられ、現代的な解決策の代わりにTCPラッパーを使用することの影響を理解するために必要な洞察を得るためのものです。
TCPラッパーの設定
では、TCPラッパーを使用していくつかのルールを設定する方法を見てみましょう。設定を適用するには、/etc/hosts.allow および/または /etc/hosts.deny ファイルを開く必要があります。これは、それぞれトラフィックを許可するか拒否するかに応じて行います。これを行うには、ルート権限が必要であり、お好きなテキストエディタ(nano、vimなど)を使用できます。
ルールを拒否する
まず、TCPラッパーで設定できるいくつかの拒否ルールを見てみましょう:
一般的な習慣として、
hosts.denyファイルに1つのルールだけを設定することがあります。それは、すべてのホストからすべてのサービスへの受信トラフィックを単純に拒否するというものです。ALL: ALLこのルール自体はあまり私たちには役立たないでしょう。なぜなら、私たちのサービスのいずれもネットワーク経由でアクセスできないことを意味するからです。しかし、このルールの背後にあるアイデアは、アクセスを許可したいホストをすべて
hosts.allowファイルに追加できることです。このような設定は、アクセスを許可したいホスト名、ネットワーク、またはIPアドレスの既知のリストがある場合にのみ機能します。もしアクセスを必要とするシステムのネットワークアドレスを予測できない場合、このルールは実行可能ではありません。次のルールは、すべてのSSHトラフィック、より具体的には
sshd(SSHサーバーデーモン)を拒否します:sshd: ALLこのルールを設定した後でも、
hosts.allowファイルに入って、SSHへのアクセスを許可すべきホストを指定することができることを覚えておいてください。特定のホストへのアクセスをどのように拒否できるか見てみましょう。この例では、ホスト
192.168.1.100へのアクセスを拒否します:ALL: 192.168.1.100特定のサービスに対して拒否すること:
sshd: 192.168.1.100ここでは、全ネットワークへのトラフィックを拒否する方法を示します。この例では、sshdサービスのために
192.168.1.0/24ネットワークへのトラフィックを拒否します:sshd: 192.168.1.0/255.255.255.0また、
ALL EXCEPT構文を使用して、指定したホストやネットワークを除くすべてのホストやネットワークからのトラフィックを拒否することもできます。ここでは、2つの異なるネットワーク(192.168.1.0/24とlinuxconfig.org)を許可し、それ以外のすべてのトラフィックを拒否する例を示します:ALL: 192.168.1.0/255.255.255.0, .linuxconfig.org
ルールを許可する
許可ルールの構文は拒否ルールと同じになります。一般的には、拒否ルールはほとんどの受信トラフィックをブロックするように設定されており、許可ルールは例外として設定されますが、必ずしもそうなるわけではありません。
すべての接続を
hosts.denyでブロックし、hosts.allowを使用して例外を設定するのではなく、hosts.allowで全てのトラフィックを許可し、その後hosts.denyで特定のホストを拒否する逆の設定を採用することもできます。以下は、sshdのような特定のサービスへの全トラフィックを許可する方法です:sshd: ALLホストまたは明示的に拒否したいネットワークを除くすべての人を許可するために、
ALL EXCEPT構文を使用できます:sshd: ALL .linuxconfig.org EXCEPT prod.linuxconfig.org
理想的な構成を得るためには、許可リストと拒否リストを構築するために両方のファイルを設定する必要があります。簡単な設定では、これは簡単に行えます。しかし、より高度な構成が必要になると、2つの別々のファイルでルールを維持するのは、組み込みのシステムファイアウォールを使用するよりもおそらく難しくなります。
締めくくりの考え
このチュートリアルでは、TCPラッパーを使用してLinuxシステムを保護する方法を見ました。これには、許可するホストやネットワークのリストを指定して、そのリストを許可または拒否するためにhosts.allowとhosts.denyファイルを編集することが含まれます。また、TCPラッパーを使用する際に、すべてのLinux管理者が考慮すべき制限や注意事項についても説明しました。アプリケーション層(OSIモデルのレイヤー7)でトラフィックを許可または拒否することに関しては、Linuxディストリビューションがそれをサポートしていると仮定した場合、TCPラッパーは迅速で簡単な方法です。
