【入門編】SSRF(サーバーサイドリクエストフォージェリ)を防ぐためのURLバリデーションと許可リスト – アプリケーションセキュリティ & 安全な開発防御ガイド

こんにちは。セキュリティの最前線で、日々「見えない泥棒」とチェスをしている者です。

今日は、最近のアプリケーション開発で「一番やってはいけないミス」の一つ、SSRF(サーバーサイドリクエストフォージェリ)についてお話しします。

難しそうな名前ですよね。でも、実は身近な「防犯」の仕組みに例えると、驚くほどシンプルに理解できるんです。一緒に紐解いていきましょう。

1. SSRFって何?「泥棒に家の鍵を渡すようなもの」

想像してみてください。あなたは、外の景色を写真に撮ってきてくれる「便利な執事」を雇っています。
ある日、見知らぬ通行人がその執事に「あの家の金庫の写真を撮ってきて!」とメモを渡しました。執事は疑うこともなく、その家(あなたの内部ネットワーク)に侵入し、金庫の写真を撮って通行人に渡してしまいました……。

これがSSRFの正体です。
「外部からの指示を真に受けたサーバーが、本来アクセスしてはいけない内部ネットワークへ勝手にアクセスしてしまう」という攻撃です。

本来、あなたのサーバーは「外の世界」とだけやり取りすべきなのに、攻撃者の入力によって「内側の宝物(社内システムやクラウドの管理画面)」を勝手に開かせてしまうわけですね。

2. 泥棒を入れないための「二重の防犯対策」

では、どうすれば執事(サーバー)が悪い通行人の言いなりにならないようにできるのでしょうか。対策は大きく分けて二つ、「リストによる選別」と「IPの遮断」です。

対策①:ドメイン許可リスト(ホワイトリスト)を使う

「誰とでも話してはいけない」というルールを徹底します。
「このサイトのデータだけ取ってきていいよ」という許可リスト(ホワイトリスト)を作り、それ以外からのリクエストは門前払いにするのです。

安全なURLかどうかをチェックする関数の例
ALLOWED_DOMAINS = [“api.example.com”, “images.trusted-source.com”]

def is_safe_url(target_url):
from urllib.parse import urlparse
parsed = urlparse(target_url)

# 許可リストに含まれていないドメインならアクセス拒否!
if parsed.netloc not in ALLOWED_DOMAINS:
return False
return True

対策②:IPアドレスのフィルタリング(盲点に注意!)

ドメインを制限しても、攻撃者は「DNSリバインディング」といった手法で、許可リストをすり抜けようとします。そこで、「そもそも内部ネットワークのIPアドレスにはアクセスさせない」という物理的な壁を作ります。

import ipaddress
import socket

def is_internal_ip(target_url):
# ドメインからIPを解決する
hostname = urlparse(target_url).hostname
ip = socket.gethostbyname(hostname)

# プライベートIPアドレス範囲(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16など)
# これらに該当する場合は内部ネットワークとみなして遮断する
if ipaddress.ip_address(ip).is_private:
return True # 内部ネットワークなので危険!
return False

3. なぜ「許可リスト」が最強なのか?

よくある間違いが、「ブラックリスト(悪いものだけ禁止する)」を作ることです。
「192.168.x.x を禁止しよう」と決めても、攻撃者は次々と新しい抜け道を見つけてきます。後手に回るブラックリストは、セキュリティの世界では「穴の空いたバケツ」と同じです。

「信頼できるもの以外は、すべて拒否する」という許可リストの考え方は、家の玄関で「名簿に名前がある人しか入れない」と言い切るのと同じくらい、強力で揺るぎない防御になります。

4. 最後に:セキュリティは「疑う」ことから始まる

新人のエンジニアの方々によく伝えるのですが、セキュリティ対策において「ユーザーからの入力」は、常に「泥棒が書いたメモ」だと思ってください。

  • URLをそのまま使っていませんか?
  • 内部のAPIを無防備に公開していませんか?

これらを一つずつ確認し、厳しい門番を置いていくこと。それが、あなたの開発するアプリケーションを「堅牢な城」へと変えていく唯一の道です。

最初は難しく感じるかもしれませんが、まずは「外部からの入力を信用しない」という意識を持つだけで、あなたはすでに立派なセキュリティの第一歩を踏み出しています。

これからも一緒に、泥棒に負けない安全なデジタル社会を作っていきましょう。何か疑問があれば、いつでも相談してくださいね。

コメント

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