A2Aセキュリティ機構:エージェント間の相互信頼を守るゲートシステム
Hermesメッセージプラットフォーム導入第37回:A2Aの四層セキュリティ防御とコミュニティ実戦での修正。
2つのAIに互いに「電話」をかけさせるとき、一番怖いのは何か?それは、彼らが延々と話し続けることではなく、見知らぬ人が知り合いのふりをしてドアを叩くことだ。
セキュリティ設計原則:まず鍵をかけてからドアを開ける
新しい家に引っ越したら、最初にやることはカーテンを掛けることではなく、鍵を交換することだ。A2Aプロトコルの設計者も同じことを考えている——デフォルトで安全、各緩和措置は明示的な操作が必要。この仕組みは完全なゲートシステムのようなものだ:ドアロック(token)、ゲートカード(対等方向け鍵)、のぞき穴(身元確認)、監視カメラ(監査ログ)。Hermesメッセージプラットフォームでは、A2A機能はプラグインとして提供されるが、セキュリティのデフォルト値は決して妥協しない:tokenが設定されていない場合、ローカルの127.0.0.1のみをリッスンする——つまり、ドアはロックされていて、鍵は自分の手元にしかない状態だ。
4つの防御ラインの詳細
第一の防御:ローカルバインド + token(ドアロック)
デフォルトでは、A2Aはローカルのみをリッスンし、外部からはドアに触れることすらできない。外部にサービスを提供するには、次の2つの条件を同時に満たす必要がある:A2A_HOSTで公開アドレスを設定し、かつbearer tokenを設定する。これは、窓を開けるだけでなく、窓辺にトゲトゲのサボテンを置くようなものだ——両方とも欠かせない。
第二の防御:対等方向け独立鍵(ゲートカード)
各対等方は専用のtokenを持ち、A2A_PEER_TOKENS="alice:tok1,bob:tok2"で設定する。これは1つのマスターキーで全部のドアを開けるのではなく、訪問者ごとに独立したゲートカードを発行するイメージだ。認証された身元がレート制限、信頼リスト、監査を駆動する——誰がカードをかざしたか、何回かざしたか、いつかざしたか、すべて記録される。
第三の防御:インジェクションフィルタ + マスキング(セキュリティゲート)
インバウンドテキストはフィルタリングされ、「信頼できない対等方からの入力」とマークされ、リモートの対等方はオペレーターのスラッシュコマンドを呼び出せない。これは空港のセキュリティチェックのようなものだ。スーツケースの中の液体は別途取り出して検査される。アウトバウンドの返信では、認証情報の形をした文字列(APIキー、JWT、token)が自動的に消去される——まるで送る手紙に、受取人のマイナンバーが自動的に塗りつぶされるようなものだ。
第四の防御:監査ログ + ループ防止(監視カメラ)
各交換は~/.hermes/a2a_audit.jsonlに追記される。これは玄関に24時間監視カメラを設置するようなものだ。ループ防止のラウンド上限は、隣の家のインターホン付きドアホンのようなもの——2つのAIが延々と話し続けたら、システムが自動的に切断する。
実際の攻撃ストーリー:コミュニティが発見・修正した3つの問題
ストーリー1:SSRFバイパス(#78298)——「数字の暗号」でドアロックを騙す
攻撃者は、コールバックURLのセキュリティチェックが文字列プレフィックスでホスト名をマッチングしていることを発見した。たとえば、127.で始まるかどうかをチェックする。しかし、IPアドレスには「整数表記」という書き方がある——2130706433は127.0.0.1の別の書き方だ。これは、住所をモールス信号で書いたら、門番が気づかずに通してしまったようなものだ。修正方法:コールバックホストをまず標準IPに解決してから判定する。つまり、門番があらゆる形式の住所を受け取ったら、まず標準の住所表記に翻訳してから照合する。
ストーリー2:リバースプロキシによる身元の崩壊(#80534/#80779)——全員が同一人物になる
nginxやK8sの背後にデプロイすると、A2Aプラグインはソケットアドレスから呼び出し元の身元を推測する。しかし、プロキシサーバーが間に立つため、すべての対等方が同じIP——プロキシのアドレス——として表示される。これは、マンションの守衛所のようなもので、すべての訪問者が「守衛所が代筆」と登録されるイメージだ。レート制限は共有バケット(1人が忙しいと全員が影響を受ける)、信頼ホワイトリストにはプロキシアドレスしか登録できない、監査では実際の呼び出し元が見えない。修正:X-Forwarded-Forから実際の身元を推測するが、「信頼できるプロキシの背後」でのみ採用することを保証する。
ストーリー3:監査の盲点(#81003/#81042)——拒否されたノックの記録がない
監査ログは受け入れられたトラフィックのみを記録する。401(token無効)と403(信頼されていない)のリクエストは記録を生成しない。これは、監視カメラがスムーズに入場した人だけを撮影し、泥棒が鍵をこじ開ける映像は録画されていないようなものだ。クレデンシャルスタッフィング攻撃、失効したtokenの探索、横移動の試み——これらの攻撃行動こそ、監査が最も捉える必要があるものだ。修正:すべての認証拒否もappend-onlyの監査ログに追記され、decisionフィールド + HTTPステータスコード + 呼び出し元IPが記録される。
ユーザーにとっての意味
この仕組みの核心理念は、セキュリティは事後対応ではなく、デフォルト状態であるということだ。Hermesユーザーとして、セキュリティの専門家になる必要はなく、基本的な保護を自動的に得られる——4つの防御ラインが自動で機能する。さらに重要なのは、コミュニティが実際の攻撃を通じて継続的に強化していることだ:SSRFバイパスからリバースプロキシによる身元崩壊、監査の盲点まで、各問題は実際のシナリオに対応している。A2Aプロトコルは、絶えず強化される城のようなもので、すべてのレンガが実戦で検証されている。次にあなたの2つのエージェントが互いに「電話」するとき、彼らの間にはドアロック、ゲートカード、セキュリティゲート、監視カメラがあるだけでなく、ログを監視する守衛たちもいるのだ。
📖 公式ドキュメント
この記事は Hermes Agent の公式ドキュメントに基づいています:公式ドキュメント › user-guide/messaging/a2a