ある人がVPN事業者の出口アドレスを拒否リストに追加し、濫用は一日だけ止まる。やがて、たまたま同じ事業者を使っている顧客が問い合わせを出し、規則は誰も説明していなかったほど広いことが分かる。ブロックは常にアドレスについての判断だった。問題は、それが身元についての判断として売られたことにある。次の規則を書く前に、この二つを切り分けてほしい。

実行できる規則は送信元アドレスについてのもの

ファイアウォールの規則はパケットのフィールドに一致し、一致させているフィールドは送信元アドレスである。その規則は、そのアドレスからの通信を確実に拒否できる。これは現実的で有用な効果だ。しかし、パケットを送ったのが誰か、どのアカウントが使われたか、昨日の問題を起こしたのと同じ人物かどうかは分からない。規則を書くのは簡単で、それが何を証明するかを説明する段階でチームは誤る。

目的が特定の振る舞いを止めることなら、アドレスの規則はたまたま手元にある鈍い道具である。目的が利用者を特定することなら、アドレスは誤った根拠であり、正しい根拠はアプリケーションの認証だ。規則を本番に出す前に、どちらの目的なのかを決めてほしい。

登録情報の照会が実際に教えてくれること

レジストリの照会は、ネットワークに割り当てられた範囲と登録された連絡先を返す。各アドレスで動いているサービスは列挙せず、どのテナントが要求を送ったかも教えない。小さな登録ブロックでも、別々の顧客の無関係な処理が同居することがある。

dig +short exit.example.net
whois 203.0.113.0 | head -40

出口のホスト名を解決すると、その瞬間に返されたアドレスが得られる。これは目録ではなく、その瞬間の写しにすぎない。一つの応答をホスティングの前置き全体に広げるのは、同じ根拠の完全版ではなく、影響範囲の広い別の判断である。管理された分類フィードを使う場合、そのラベルは両方向に既知の誤りを含む推測だ。認証ではなく、人の一覧でもない。

提案された規則が照会だけで正当化されるなら、そこで止まってほしい。写しは範囲の判断ではない。

共有出口と巻き添え

共有出口は多くの利用者を運び、共有アドレス空間 とは、一つの公開アドレスが加入者の集団全体を表し得るということだ。それをブロックすれば全員に影響し、濫用と無関係な利用者も含まれる。周囲の前置きに広げれば、その効果は何倍にもなり、無関係なサービスが巻き込まれる可能性が高まる。巻き添えは後から書き添える副次効果ではなく、規則の定義の一部である。

パケットの根拠には独自の限界がある。単独の SYN にある送信元アドレスは偽装できるので、パケットは誰が何を始めたかを立証しない。半開の接続状態はハンドシェイクが始まったことを示すだけで、相手が反射攻撃の犯人だという意味ではない。完了した接続はアプリケーションのログとは別のことを語り、認証されたセッションはどちらも名指さないアカウントを名指す。

方針が許す最も狭い範囲を選び、誤って巻き込まれると予想される相手を書き留めてほしい。

記録すべき根拠と、利用者の戻り道

どのアドレスの規則にも、それを正当化した観察、日付、範囲、見直しの時点を添えるべきだ。その記録があってこそ、次の担当者は規則がなぜ存在するかを推測せずに狭められる。それがなければ、一時的なブロックが恒久的な設備になる。

nft list ruleset | grep -n 203.0.113
ss -tn state syn-recv '( dport = :443 )'

ブロックを配備する前に、正当な利用者がどうやってアクセスを取り戻すかを決めてほしい。サポートの待ち行列は復旧計画ではない。異議申し立ての経路、文書化された例外、別のアクセス手段はいずれも機能するが、VPN を使うのをやめろと言うのは機能しない。ネットワークの規則は、振る舞いに合った制御と組み合わせる。速度制限、より厳しいアカウント権限、サービス内部での執行などだ。VPN出口のブロックは、利用者名簿のふりをせずに不要な通信を減らせる。

見失わないでほしい兆候は、規則が実際にしていることと、人々がしていると思っていることの間のずれだ。ブロックはアドレスを拒否する。アカウントは利用者を特定する。その二文をチケットの中で分けておけば、次の規則は擁護しやすくなる。

関連記事