SPA (Single Packet Authorization)解説
2019年8月27日
CSAジャパン
諸角 昌宏
本ブログは、SDP(Software Defined Perimeter)の中核の技術であるSPA (Single Packet Authorization)が、どのようにゼロトラスト環境で有効であるかについて説明します。特に、インターネット上に安全なサービスを提供するため、認証が取れるまでは全てのアクセスを拒否する”Deny-ALL”が、どのように実現できているかについて説明します。
インターネットのアクセスにおける課題とSPA
リクエスト-レスポンス型であるインターネットのアクセス方法は、クライアントからのリクエストを受け取るために必ず口(ポート)を開けて待っています。これは、正しいユーザだけでなく、悪意のある人にも開いているということで、セキュリティ上の問題を引き超す可能性を高めています。悪意のある人は、ポートスキャン等を行って、インターネット上に開いているポートを探し、それに紐づくサービスを特定し、そのサービスの脆弱性を突いて攻撃を仕掛けることができます。また、開いているポートに対してSYNフラッド攻撃によりDoS/DDoS攻撃を行い、サーバを接続不能にすることができます。
このようにインターネットがもともと抱えている課題に対して、アクセスが許可されるまでは全てのポートを閉じておくという、いわゆる”Deny-All”を実現することで対処することが求められています。このための方法として、大きく以下の2つがあります:
- ポートノッキング
- SPA
これらについて、以下で説明していきます。
ポートノッキング
ポートノッキングは、決められたポートを決められた順番でアクセスすることでファイアーウォールに穴を空ける仕組みです。例えば、ポート1000、2000、3000に対して順番にTCP SYNパケットを送った場合のみ、ポート22 (SSH) へのアクセスが許可されるというような設定ができる機能になります。この場合、最初の状態ではポート22は閉じられており、ポートノッキングに定義されたTCP SYNのシーケンスが来た時のみ、一定時間ポート22を開放します。クライアントは、この開放している時間内にポート22に対してアクセスすることで接続できます。これにより、通常はDeny-Allの状態を維持しつつ、決められたポート番号に決められた順番でパケットが送られてきた時のみアクセスを許可するということが実現できます。
したがって、ポートノッキングには以下のようなメリットがあります。
- パケットはデフォルト・ドロップ
サーバに送られてくるパケットは、デフォルトでは全てドロップすることが可能になります。つまり、Deny-allを実現できます。これにより、サーバが提供しているサービスを非可視化することができ、サービス自体を悪意のあるアクセスから保護することができます。 - ポートスキャンしても空きポートを見つけることができない
悪意のある攻撃者がポートスキャンを行っても、開いているポートや稼働しているサービスを見つけることができません。したがって、悪意のある攻撃が非常に困難になります。 - DoS/DDoS攻撃を最小化できる
ポートノッキング用のシーケンスにならないパケットは全てドロップされますので、SYNフラッド攻撃のようにもともと開いているポートに対する攻撃を行うことができなくなります。
一方、ポートノッキングには以下のようなセキュリティ上の問題があります。
- リプレイ攻撃に弱い
ポートノッキングに利用するパケットは、暗号化されずにそのままネットワーク上を流れます。したがって、ネットワークを盗聴し、クライアントからのパケット・シーケンスをそのまま送ることで接続できてしまいます。 - 悪意のある第三者によるポートノック用のシーケンスの破壊
正しいクライアントに代わってポートノック用のシーケンスの一部を送ることで、シーケンスそのものを破壊することができます。 - IDSあるいはポートスキャンによるポートノック用のシーケンスの探索
ポートノック用のシーケンスは一連のパケットの流れになるので探索が可能です。
SPA
SPAは、ポートノッキングの利点を持ちながら、ポートノッキングの課題に対処したものになります。” Software-Defined Perimeter: Architecture Guide”では、SDPの最も重要な要素の1つである「接続前認証(authenticate-before connect)」を実現するために、SPAを通してこれを実現していると述べています。また、このガイドでは、SPAはデバイスまたはユーザの身元を検証し、それから追加のアクセス制御を実施するシステムコンポーネント(コントローラまたはゲートウェイ)へのネットワークアクセスを許可するだけの軽量プロトコルで、これは、TCP / IPの根本的にオープンな(そして安全でない)性質を補うものとしています。SPAにより、要求者のIPアドレスを含むリクエスト情報は、単一のネットワークメッセージの中で暗号化および認証が行われ、デフォルトドロップのファイアウォールを通してサービスを見えなくすることができます。
SPAはプロトコルとして、SDP 1.0の中に仕様として記述されていますが、従わなければならないというような厳格な仕様では無いようです。したがって、SPAは実装の仕方においていくつかの異なる方法が取られています。ただし、SPAを実装するにあたっては、以下の3つの共通の原則を備えることを要求しています。
- SPAパケットは、暗号化し、認証機能を持たなければならない。
- SPAパケットは、必要な情報をすべて1つのパケットの中に含めなければならない。
- SPAパケットを受け取ったサーバは、応答しないし、何も送信しない。
ここでは、SPAの実装方法を説明するにあたって、fwknopが提供するオープンソフトウエアを参照します。これは、LINUX JOURNAL Issue #156, April 2007 ” Single Packet Authorization fills the gaps in port knocking.”の内容を元にしてします。
- SPAパケットの構成
fwknopが用いるSPAのパケットは、以下の構成になります。- 16バイトのランダムデータ
- クライアント・ユーザ名
- クライアント・タイムスタンプ
- fwknop バージョン
- モード (アクセス、あるいは、コマンド)
- アクセス (あるいは、コマンドストリング)
- MD5 チェックサム
これらのフィールドの内容について以下に説明します:
- 16バイトのランダムデータ、および、MD5 チェックサム
16バイトのランダムデータを含み、パケット全体のMD5チェックサムを持つことで、1つ1つのSPAパケットが必ずユニークになることを保証します。これにより、サーバ側では、以前来たことのあるパケットと同じパケットが来た場合には、リプレイ攻撃であると判断し、接続を許可しないということができます。 - クライアント・ユーザ名、クライアント・タイムスタンプ
クライアント・ユーザ名、クライアント・タイムスタンプは、もう一段のレベルの認証・認可をサーバ側で行うのに用いられます。 - fwknop バージョン
fwknopとして、SPAのバージョン管理、特にバックワード互換性に用いられます。 - モードとアクセス
サーバ側に、クライアントからの要求が、サービスへのアクセスなのかコマンドの実行なのかを示します。たとえば、SPAでコネクションが許可された後、SSH(TCPポート22)のアクセスを許可するように設定できます。アクセスの場合には、アクセス・フィールドに直接ストリングを含めます。
この例を元に、SPAの特徴をまとめると以下になります:
- Deny-Allの実現
SPAパケットがクライアントからサーバに送られても、サーバがこれに応答することはありません。サーバは単にネットワーク上送られてくるパケットをスキャンする(たとえばlibpcapなど)だけで、SPAパケットでないものは全てドロップし、SPAパケットを受け取ると、その内容に基づいてクライアントとの接続を許可するかどうかを判断します。 - リプレイ攻撃への対処
上記の例では、1パケットの中に16バイトのランダムデータを含み、全体のパケットのハッシュ値を入れています。これにより、SPAパケットがユニークになることを保証します。サーバ側では、今まで来たパケットと同じパケットが来た場合には、リプレイ攻撃であると判断し、接続を許可しないということができます。 - DDoS攻撃への対処
Deny-Allであること、また、SPAパケットは1パケットであり、シーケンスではないことにより、DDoS攻撃の可能性を非常に下げることができます。 - パケット・シーケンスの探索や破壊への対応
SPAパケットは1パケットであることから、スプーフィングしたり解析したりすることが難しくなります。 - 様々な認証情報の送信が可能
SPAパケットの中には、様々な情報を含めることが可能なため、クライアントのユーザ名など、ユーザに対応した追加の認証等の処理が可能になります。
以上のように、SPAは、ポートノッキングのメリットを維持しつつ、課題を解決し、ゼロトラスト環境における最適なネットワーク環境を提供できるものと考えています。また、ここでは触れませんが、SDPが他に提供している機能(mTLS等)とSPAが組み合わされることにより、ゼロトラスト環境におけるさらに強固なネットワークセキュリティが提供できます。
なお、SPAは、fwknopからオープンソースとして提供されていますので、さらに理解を深めていただければと思います。
たいへん有用な技術と思います。実装例とかトライアルでの実証とか、CSAでプロモートしたらいかがでしょう。
SDPWGの方で色々と検討を行っています。
https://www.cloudsecurityalliance.jp/site/?page_id=1167
ぜひ、ご参加ください。