ACL(アクセス制御リスト)とは、送信元IPアドレスなどの定義された基準に基づき、DNSクエリ、ゾーン転送、動的更新といったリソースへのアクセスを許可または拒否するセキュリティ制御であり、ルールは出現順に1つずつ評価されます。 DNS環境において、ACLは、ネットワークトポロジを露呈させる不正なゾーン転送を制限し、増幅攻撃における再帰的リゾルバの悪用を防止し、動的更新を送信できるユーザーを制御するために不可欠ですが、送信元アドレスのなりすましに対抗するためには、TSIGなどの認証方式と組み合わせる必要があります。 ACLの管理が不十分だと、例外が蓄積して大規模な運用で機能しなくなったり、古いエントリによって廃止されたアドレスが関係のないホストに再利用されたり、ルールの順序付けミスや暗黙的な拒否の認識不足により、サービス停止を引き起こしたり、サービスがインターネットに対して過度に露出されたりすることがあります。
ACLの仕組み
ACLとは、各エントリが一致条件と「許可」または「拒否」のアクションを組み合わせたリストのことです。このリストを適用するシステムは、リクエストをエントリと比較し、最初に一致したエントリの結果を適用します。
- リクエストの到着:クライアントやデバイスが、DNSクエリの送信、ゾーン転送の要求、ルーターを経由したパケットの転送などのアクションを試みます。
- 抽出された基準:適用システムは、リストが照合に使用する属性(通常は送信元IPアドレス、ネットワーク機器の場合は宛先、プロトコル、またはポートも)を読み取ります。DNSサーバーは、暗号鍵に基づいて照合を行うこともあります。
- エントリの評価順序:システムはエントリを上から下へと順にチェックします。ほとんどの実装では、最初に一致したエントリで処理を停止し、そのアクションを適用します。
- 適用されるアクション:「許可(permit)」エントリはリクエストを許可します。「拒否(deny)」エントリはリクエストを拒否または破棄します。多くのシステムでは、リストの最後に暗黙の拒否(implicit deny)が設定されているため、どのエントリにも一致しないリクエストは拒否されます。
順序が重要であるため、広範囲な許可ルールを狭範囲な拒否ルールの前に配置すると、その拒否ルールが機能しなくなる可能性があります。 DNSサーバーでは、クエリ、再帰、転送、更新といった異なる機能を管理するために、通常、個別のリストが使用されるため、各機能ごとに独自の対象範囲を設定できます。アドレスに基づく照合は偽装される可能性があるため、動的更新のような機密性の高い操作については、TSIGなどの認証も併せて要求することで、より強固に保護することが推奨されます。
ACLに関するよくある問題
特定の「拒否」ルールの上に広範な「許可」ルールを配置すると、「拒否」ルールが一致しなくなるため、ブロックされるべきトラフィックが通過してしまいます。エンジニアは通常、拒否エントリのヒットカウンターがゼロのまま変わらないことで、この問題に気づきます。
多くの実装では、リストの末尾に暗黙の「拒否」が設定されているため、それまで空だったリストに最初のエントリを追加すると、突然それ以外のすべての通信がブロックされてしまうことがあります。これにより、わずかな変更を行った直後にサービス停止が発生することがよくあります。
廃止されたホスト名を指定するエントリは、アドレスが再割り当てされた後もそのまま残ります。その結果、新しいホストは、誰も与えるつもりのなかったゾーン転送の許可などのアクセス権を継承することになります。
送信元IPアドレスのみに依存するACLは、特にUDPでは、偽造パケットによって迂回される可能性があります。キーベースの認証やネットワークエッジでのフィルタリングと組み合わせることで、このリスクを軽減できます。
再帰サーバーで任意のアドレスからのクエリを許可すると、増幅攻撃に悪用される可能性があります。任意のアドレスへの転送を許可すると、ゾーンの内容がすべて公開されてしまいます。