まず考え方を理解し、次のアクティビティで確認しましょう。
ホストだけでなくサービス単位でフィルタリングする
ルールにプロトコルとポートを追加すること、そしてブロックされたポートが返しうる3種類の答えを学びます。
できるようになること
- 1つのホストではなく1つのサービスを許可するルールを書く
- ポート指定の許可がなぜ最小権限の形なのかを説明する
- レスポンスから、開いている、拒否された、フィルタされているポートを区別する
- 静かに動作させたいルールでは、なぜrejectよりdropが優れているのかを述べる
この前に: 「ACLでトラフィックをフィルタリングする」からのファーストマッチの順序と暗黙のdeny、そして「TCP、UDPとポート」からのポートの知識が必要です。
重要な理由: あるホストが別のホストに到達することを許可するルールは、そのホスト上のすべてのサービス - データベース、管理インターフェース、来年インストールされる何か - を許可してしまいます。サービスを名指しすることが、意図を表現するアクセスリストと、単に近似しているだけのアクセスリストとの違いです。
アドレスだけを指定したアクセスリストは、「この 2 台のマシンが話せますか」という質問に答えます。その質問が実際に聞かれることはめったにありません。実際のリクエストは、ほとんどの場合、サービスに関するものです。Web チームにはアプリケーションポートが必要で、監査担当者は 1 つのシステムを読む必要があり、ゲストネットワークにはインターネットが必要で、内部には何も必要ありません。
ルールへのサービスの追加
ルールは、アドレスだけでなく、トランスポートプロトコルと宛先ポートでも一致させることができます。最初の一致順序は同じで、最後は暗黙的に拒否されます。照合するフィールドが 1 つあります。
# Permits everything between these two hosts
permit src 10.30.10.25 dst 10.30.30.10
# Permits one service, and nothing else, between the same two
permit src 10.30.10.25 dst 10.30.30.10 tcp dport 443
宛先ポートは、サーバーがリッスンするポートであるため、サービスを識別するポートです。送信元ポートは、接続ごとにクライアントによってランダムに選択されるため、照合には役立ちません。最初に一致させるのはよくある間違いであり、一度動作したら停止するルールが生成されます。
戻りトラフィック
送信されるリクエストには返信が必要で、その応答はクライアントが選択したランダムな送信元ポートに到着します。ステートレスリストでは、応答を受け付けるために受信ポートを幅広く許可しなければならず、これではこれまで得た精度の大半が失われます。
接続状態でのマッチングはこれを適切に解決します。ファイアウォールは、どの接続をアウトバウンドで許可したかを追跡し、その接続に対する応答を許可します。インバウンドで新しい接続を開始することを誰でも許可するというルールはありません。
# Replies to connections we already allowed out
permit ct state established,related
# One service, inbound, from one source
permit src 10.30.10.25 dst 10.30.30.10 tcp dport 443
三つの答え
ポートへの接続が成功しない場合、その失敗の仕方から具体的なことがわかります。これは診断のためにも、拒否ルールをどのように記述すべきかを決定づけるものでもあるので、知っておく価値があります。
| 結果 | 何が起こったのか | その意味 |
|---|---|---|
| [開く] | 接続が完了しました | 何かが聞いていて、何もフィルタリングされていません |
| 拒否 | リセットがすぐに戻ってきました | パケットがホストに到達し、応答が得られた。何も受信していないか、ルールによって拒否されたかのどちらかである |
| フィルター処理済み | タイムアウトまで、まったく応答がない | 何かが静かにそれを捨てた |
特徴的なシグナルは時間です。何かが答えたからといって、拒絶は即座に返ってくる。何も起こらなかったため、ドロップすると完全にタイムアウトになります。違いを見ていなければ、どちらも「接続しなかった」ように見えます。
ドロップ対拒否
| アクション | レスポンスが送信されました | スキャナーへの影響 | 正規のクライアントへの影響 |
|---|---|---|---|
| ドロップ | [なし] | 低速-各ポートにフルタイムアウトが発生する | 障害が遅く、エラーが明確でない |
| 拒否 | 即時リセットまたは ICMP メッセージ | 高速-スキャンはすぐに完了します | 素早い失敗、より明確なエラー |
信頼できないものに面している境界では、ドロップが適切なデフォルトです。攻撃者には時間がかかり、そこに何があるのか何も明らかになりません。あなたが管理するネットワーク内では、拒否のほうが優しいです。障害をすばやくクリアできれば、午後に誰かが診断を受ける必要がなくなり、イライラするスキャナもありません。
監査の結果、ルールに書かれている以上のことが判明
ウェブ層がアプリケーション層に到達することを許可するルールは、その時点でアプリケーションサーバーが 1 つのサービスを実行していたため、アドレスに基づいて作成されました。また、データベースもデフォルトポートで実行されるようになりました。アクセスリストには何も変更されておらず、問題も何もありません。Web サーバーは、サービスが開始された日にデータベースに直接アクセスできるようになっただけで、それを許可するルールは何年も前に別の理由で作成されたものです。
行動による検証
正しく読めるルールでも効果はありません。同じ結果が異なる学習者でも、間違いのマークを付けてはいけません。フィルターをチェックするということは、問題のあるマシンで実際に何が起きているかをテストすることです。
# Should connect
nc -w 3 10.30.30.10 443
# Should time out with no response at all
nc -w 3 10.30.30.10 3306
用語
- 送信先ポート
- サーバーがリッスンするポート、およびルール内のサービスを識別するポート。
- ステートフルフィルタリング
- 許可された接続を追跡して、新しいインバウンド接続を許可するルールがなくても返信が許可されるようにします。
- フィルター処理済み
- トラフィックが通知なしで破棄され、応答がないポート。
- 拒否
- リセットされて応答したポート。何もリッスンしていないか、拒否ルールになっています。
重要なポイント
- 宛先ポートを一致させてサービスを許可します。送信元ポートはランダムであり、一致しても役に立ちません。
- アドレスのみの許可は、将来のサービスを含め、そのホスト上のすべてのサービスを許可します。
- 接続状態が一致すると、新しい受信接続は許可されずに応答が許可されます。
- オープン、拒否、フィルタリングの3つの異なる結果があり、回答があったかどうかで区別されます。
- TCP では、拒否とサービスの停止を区別することはできません。
- 信頼できない境界でドロップし、明確なエラーがコストよりも役立つネットワーク内では拒否してください。
続ける準備はできましたか?
無料アカウントを作成すると、進捗を保存して理解度チェックを受けられます。
