【入門編】Server-Side Request Forgery (SSRF) の攻撃シーケンスと防御 – アプリケーションセキュリティ & 安全な開発防御ガイド

こんにちは。現場で泥をすすりながらセキュリティの最前線に立っていると、「SSRF(サーバーサイド・リクエスト・フォージェリ)」という言葉を耳にすることが増えましたね。

専門用語は難しそうに見えますが、本質を掴めば意外とシンプルです。今日は、あなたの作ったアプリが「意図せぬ泥棒の片棒を担がされない」ための、防犯の知恵をお話しします。

—

SSRFとは?「身代わりを立てるずるい泥棒」の仕組み

まずは想像してみてください。あなたは自分の家の玄関(アプリケーション)に、宅配便の受け取りをお願いする「お使いロボット」を置いています。

本来、このロボットは「指定されたURLから画像を取ってくる」という単純な仕事しかしないはずでした。しかし、もし「どこにでも行ける」という無防備な設計だったらどうなるでしょう?

悪意のある人物が、そのロボットにこんな指示を出します。
「うちの玄関じゃなくて、家の中にある金庫の鍵(管理画面や秘密の設定ファイル)を見に行ってきて!」

ロボットは命令通り、本来は外部から絶対に見えないはずの「金庫の鍵」へアクセスし、その中身を悪意のある人物に届けてしまいます。これがSSRFです。攻撃者は直接あなたの家に入れないけれど、あなたのサーバーを「身代わり」にして、内部の機密情報を盗み出すわけですね。

クラウド環境の「メタデータサービス」という最大の標的

特にクラウド(AWSやGCPなど)を使っていると、この問題は深刻です。サーバーは「自分が今どんな権限を持っているか」を確認するために、決まったアドレス(例:169.254.169.254)にアクセスして情報を取得します。

もし攻撃者がこのアドレスにSSRFでアクセスできたらどうなるか。サーバーが持つ「管理者権限」を奪い取り、クラウド環境全体を乗っ取られる……なんて悪夢のような事態も実際に起こり得ます。

—

どうやって守ればいい?「許可リスト」という最強の防犯対策

「じゃあ、すべてのアクセスを禁止すればいいの?」というと、そうではありません。それではアプリが何もできなくなってしまいますよね。

ここで登場するのが「許可リスト(Allowlist)」です。
家の鍵に例えるなら、「このリストに載っている配達業者以外は、絶対に入れません」という厳格なガードマンを配置するようなものです。

具体的な実装例:URLを厳しくチェックする

開発者がよくやってしまうミスは、「URLの中に特定の文字列が含まれていないかチェックする」という方法ですが、これは抜け道が多すぎます(127.0.0.1を0177.0.0.1と書くだけで突破されることも……)。

もっとも確実なのは、「アクセス先を事前にリスト化し、それと完全一致するか」を確認することです。

セキュリティを意識したURL検証(Python例)

from urllib.parse import urlparse

許可されたアクセス先リスト
ALLOWED_DOMAINS = [“api.trusted-service.com”, “images.example.com”]

def is_safe_url(target_url):
try:
parsed_url = urlparse(target_url)
# ドメインが許可リストに含まれているか確認
if parsed_url.hostname in ALLOWED_DOMAINS:
return True
return False
except:
return False

悪意あるURLの例
target = “http://169.254.169.254/latest/meta-data/”

if is_safe_url(target):
# ここでリクエストを実行
pass
else:
# 不正なアクセスとして遮断
print(“危険なアクセスを検知しました!”)

—

実践的な防御のステップ

コード以外にも、現場では以下の「多層防御」を組み合わせるのが常識です。

1. ネットワークを分断する(セグメント分離)

  • アプリサーバーが、必要のない内部ネットワークへ物理的に繋がらないようにファイアウォール(セキュリティグループ)で制限しましょう。「Webサーバーからは外部のインターネットと、特定のDBしか見えない」状態を作るのが理想です。

2. リダイレクトを許可しない

  • 攻撃者は「許可されたサイト」にアクセスさせ、そこから「内側の危険なサイト」へリダイレクト(転送)させる手法を使います。HTTPクライアントの設定で、リダイレクトを無効にするか、転送先も厳格にチェックするようにしてください。

3. メタデータサービスを保護する(IMDSv2)

  • AWSなどを使っている場合、メタデータサービスへのアクセスに「トークン」を要求する設定(IMDSv2)に切り替えましょう。これだけで、単純なSSRF攻撃の多くは無効化できます。

—

最後に:完璧な防御なんて存在しないという心構え

「許可リストを作ったからもう安心!」……とは言えないのがセキュリティの恐ろしいところです。でも、安心してください。「どこを狙われやすいかを知っていること」こそが、最高峰の防衛線になります。

まずは、あなたのアプリが「誰の命令で、どこにアクセスしているか」をログに出して観察してみてください。身近なリスクに気づくこと。それが、今日からあなたにできる一番のセキュリティ対策です。

一歩ずつ、安全な開発の楽しさを積み上げていきましょう!応援しています。

コメント

タイトルとURLをコピーしました