コンピュータネットワークにおいて、ポートノッキングとは、あらかじめ指定された閉じられたポートに対して接続試行を生成することにより、ファイアウォール上のポートを外部から開く方法です。正しい接続試行のシーケンスが受信されると、ファイアウォールルールが動的に変更され、接続試行を送信したホストが特定のポート経由で接続できるようになります。シングルパケット認証(SPA)と呼ばれるバリアントも存在し、暗号化されたパケットからなる単一の「ノック」のみが必要です。[ 1 ] [ 2 ] [ 3 ] [ 4 ]
ポートノッキングの主な目的は、攻撃者がポートスキャンを実行して悪用可能なサービスをシステム内でスキャンするのを防ぐことです。攻撃者が正しいノックシーケンスを送信しない限り、保護されたポートは閉じているように見えるためです。
ポートノッキングは通常、デーモンを設定してファイアウォールのログファイルを監視し、特定のポイントへの接続試行を検出して、それに応じてファイアウォールの設定を変更することで実装されます。[ 5 ]また、カーネルレベル(iptables [ 6 ]などのカーネルレベルのパケットフィルタを使用)またはユーザー空間プロセスがより高いレベルでパケットを検査することによっても実行でき、ノックシーケンス内で既に「開いている」TCPポートを使用できます。
ポート「ノック」自体は秘密の握手に似ており、宛先マシンの番号付きポートに対して、任意の数のTCP、UDP、場合によってはICMPなどのプロトコルパケットを送信することで構成されます。ノックの複雑さは、単純な順序付きリスト(例:TCPポート1000、TCPポート2000、UDPポート3000)から、時間依存、送信元IPアドレスベース、その他の要素ベースの複雑な暗号化ハッシュまで様々です。
ファイアウォールマシン上のポートノックデーモンは、特定のポートでパケットをリッスンします(ファイアウォールログまたはパケットキャプチャを介して)。クライアントユーザーは、netcatや修正版pingプログラムのような単純なものから、完全なハッシュジェネレータのような複雑なものまで、追加のユーティリティを用意し、通常の方法でマシンに接続を試みる前にそれを使用します。
ほとんどのポートノックはステートフルなシステムであり、最初の「ノック」が正常に受信された場合、2番目の部分が誤っているとリモートユーザーは処理を続行できず、シーケンスのどの段階で失敗したのかさえ分からない。通常、失敗の唯一の兆候は、ノックシーケンスの最後に、開いているはずのポートが開いていないことである。リモートユーザーには、いかなるパケットも送信されない。
リモートネットワークデーモンへのアクセスを保護するためのこの手法は、セキュリティコミュニティでは広く採用されていませんが、2000年以前から多くのルートキットで積極的に利用されてきました。
ポートノッキング保護を突破するには、単純なシーケンスであっても、大規模な総当たり攻撃が必要となります。例えば、3つのポート番号からなるTCPシーケンス(ポート1000、2000、3000など)に対する匿名の総当たり攻撃では、攻撃者は1 ~ 65535の範囲で3つのポート番号の組み合わせをすべてテストし、攻撃の合間に各ポートをスキャンして、ターゲットシステムのポートアクセスにおける変更点を検出する必要があります。ポートノッキングは定義上ステートフルであるため、要求されたポートは、正しい3つのポート番号のシーケンスが正しい順序で受信され、かつ送信元から他のパケットが一切送信されてこない限り、開きません。平均的なケースでは、正しい3つのポート番号を特定するために、約141兆(65535³/2)個のパケットが必要となります。 この手法は、ノッキング試行回数の制限、より長く複雑なシーケンス、および暗号学的ハッシュと組み合わせることで、ポートアクセスを成功させることを極めて困難にします。
ポートを開くためのポートノックシーケンスが正常に送信されると、ファイアウォールルールは通常、正しいノックを送信したIPアドレスに対してのみポートを開くため、ファイアウォールの動作に動的な機能が加わります。ファイアウォールで事前に設定された静的IPホワイトリストを使用する代わりに、世界中のどこにいても、認証されたユーザーはサーバー管理者の支援なしに、必要なポートを開くことができます。システムは、認証されたユーザーがセッション終了後にポートを手動で閉じたり、タイムアウトメカニズムを使用して自動的に閉じたりできるように構成することもできます。新しいセッションを確立するには、リモートユーザーは正しいシーケンスを使用して再認証する必要があります。
ポートノッキングのステートフルな動作により、異なる送信元IPアドレスからの複数のユーザーが同時に異なるレベルのポートノック認証を行うことができます。これにより、ファイアウォール自体が複数のIPアドレスからのポート攻撃を受けている最中でも、正しいノックシーケンスを持つ正当なユーザーはファイアウォールを通過できます(ファイアウォールの帯域幅が完全に消費されていないことを前提とします)。その他の攻撃元IPアドレスからは、ファイアウォールのポートは閉じているように見えます。
ポートノックシーケンス内で暗号化ハッシュを使用することで、送信元マシンとターゲットマシン間のパケットスニッフィングを防ぎ、ポートノックシーケンスの発見や、その情報を使用してトラフィックリプレイ攻撃を行い、以前のポートノックシーケンスを繰り返すことを防ぎます。
ポートノッキングは、多層防御戦略の一環として用いられます。攻撃者がポートへのアクセスに成功したとしても、他のポートセキュリティメカニズムや、開放されたポートに割り当てられたサービス認証メカニズムが引き続き機能します。
この手法の実装は簡単で、最低限、サーバー側でシェルスクリプト、クライアント側でWindowsバッチファイルまたはコマンドラインユーティリティを使用するだけで済みます。サーバーとクライアントの両方におけるトラフィック、CPU、メモリ消費のオーバーヘッドは最小限です。ポートノックデーモンはコーディングが複雑ではなく、監査の負担も少ないです。
SSHなどのパスワード認証サービスにポートノックシステムを実装することで、ログイン時の総当たりパスワード攻撃の問題を回避できます。SSHの場合、正しいポートノックがない限りSSHデーモンは起動せず、攻撃はSSH認証リソースを使用するのではなく、 TCP/IPスタックによってフィルタリングされます。攻撃者にとって、正しいポートノックが提供されるまでデーモンにアクセスすることはできません。
ポートノッキングは、柔軟でカスタマイズ可能なシステムアドオンです。管理者がノッキングシーケンスをシェルスクリプトの実行などのアクティビティにリンクさせる場合、特定のIPアドレスに対してポートを開放するための追加のファイアウォールルールの実装など、その他の変更もスクリプトに簡単に組み込むことができます。同時セッションにも容易に対応できます。
動的長さや長さプールなどの戦略を用いることで、ノックシーケンスをハッキングする確率をほぼゼロにまで減らすことができる。[ 7 ]
ポートノッキングは、総当たりパスワード攻撃やプロセスデーモンに関連するログの増加といった問題を軽減するだけでなく、プロトコルの脆弱性を悪用した攻撃からも保護します。デフォルト設定のデーモンを侵害する可能性のある脆弱性が発見された場合、リスニングポートでポートノッキングを使用することで、ソフトウェアまたはプロセスが更新されるまで侵害される可能性を低減できます。認証されたユーザーは、正しいノックシーケンスを入力すれば引き続きサービスを受けられますが、ランダムなアクセス試行は無視されます。
ポートノッキングは、無差別攻撃や標的型攻撃からネットワークを保護するための総合的なネットワーク防御戦略の一部としてのみ捉えるべきであり、単独の完全な解決策として考えるべきではない。
ネットワークセキュリティの専門家は、初期の実装ではアクセスするために正しいポートの組み合わせを指定することだけに依存していたため、ポートノッキングを解決策としてほとんど無視してきました。最新のポートノッキングシステムは、安全な暗号化ハッシュ、ブラックリスト、ホワイトリスト、動的な攻撃対応などの機能を組み込むことで、システムの機能をさらに向上させています。ポートノッキングは、インターネットに接続されたネットワーク上のサーバーリソースを最大限に活用するための効果的な手段です。
適切に実装されたポートノッキングは、システム全体のセキュリティを低下させるものではありません。これは、サーバーリソースのオーバーヘッドを最小限に抑えつつ、セキュリティ層を追加する効果的な対策です。最悪の場合、ポートノッキングのようなシステムは、実装の不備によって新たなセキュリティ問題を引き起こしたり、リスク補償といった状況を通じて、管理者の曖昧な姿勢を露呈したりする程度です。
ポートノッキングは、ポートノッキングデーモンの堅牢性に完全に依存しています。デーモンが故障すると、すべてのユーザーがポートにアクセスできなくなり、ユーザビリティとセキュリティの観点から、これは望ましくない単一障害点となります。最新のポートノッキング実装では、プロセス監視デーモンを提供することでこの問題を軽減し、故障または停止したポートノッキングデーモンプロセスを再起動できるようにしています。
暗号化ハッシュを使用しないシステムは、 IPアドレスのなりすまし攻撃に対して脆弱です。この攻撃はサービス拒否攻撃の一種であり、ポートノッキング機能を利用して、なりすましたIPアドレスを含むパケットをランダムなポートに送信することで、既知のIPアドレス(管理者管理ステーションなど)をロックアウトします。静的アドレス指定を使用するサーバーは、アドレスが広く知られているため、特にこのようなサービス拒否攻撃に対して脆弱です。
ポートノッキングは、レイテンシの高いネットワークでは問題となる可能性があります。ポートノッキングは、設計された機能にアクセスするために、パケットが正しい順序で到着することを前提としています。一方、TCP/IPは、順不同のパケットを組み立てて一貫性のあるメッセージを作成するように設計されています。このような状況では、クライアントが正しいパケットの順序を定期的に再送信し続け、サーバーがその順序を認識するまで待つ以外に解決策はありません。
ポートノッキングは、サーバーの唯一の認証メカニズムとして使用することはできません。セキュリティの観点から見ると、単純なポートノッキングは秘匿性によるセキュリティに依存しており、ノックシーケンスが意図せず公開されると、そのシーケンスをサポートするすべてのデバイスが侵害されたことを意味します。さらに、暗号化されていないポートノッキングはパケットスニッフィングに対して脆弱です。適切な長さのネットワークトレースによって、単一のIPアドレスから正しいノックシーケンスを検出できるため、サーバー、ひいては接続されているネットワークへの不正アクセスが可能になります。一度侵害されると、デバイスのログファイルは他の有効なノックシーケンスのソースとなり、別の障害点が明らかになります。各ノックシーケンスをワンタイムパスワードとして扱うなどの解決策は、管理の簡素化という目的を損ないます。実際には、システム全体を効果的に機能させるには、ポートノッキングをリプレイ攻撃や中間者攻撃に対して脆弱でない他の認証方式と組み合わせる必要があります。