はじめに
新しい環境で同じ画像取り込み機能を管理します。現在の宛先ポリシーはすべての URL を受け入れ、HTTP クライアントはリダイレクトに従います。画像とアプリの正規の在庫利用機能を維持しながら、この業務機能を 1 つの固定カタログエンドポイントに制限します。
説明に沿って短い Python の編集を行います。Workstation はクライアントリクエストを送り、App Policy は App が実際に読み込むファイルを編集します。Python の経験は不要です。データは管理された名前と隔離ネットワークを使います。このポリシーはこれらの宛先専用で、普遍的な SSRF 防止を保証しません。
許可された宛先だけを認める
このステップでは、有効なポリシーを店舗の許可した宛先に制限します。許可リストは許容する入力を正確に定義し、不一致の入力を拒否します。業務ルールは次のとおりです。
このステップを始めるには、ラボ画面の Workstation タブを選択してください。
| スキーム | ホスト名 | ポート | 用途 |
|---|---|---|---|
http |
catalog.test |
8000 |
商品画像 |
Workstation タブで解析された URL を調べます。解析は URL のアドレスをフィールドに分割しますが、その安全性を判断しません。
次のコマンドを実行する前に、Workstation タブに切り替えてください。
python3 imagectl.py parse http://catalog.test:8000/leaf.png
scheme: http、hostname: catalog.test、port: 8000 が表示されます。HTTP ポートを省略すると 80 が使われ、許可ポートとは異なります。現在の危険な動作を試します。
python3 imagectl.py probe http://internal.test:8000/status
probe は取り込みと同じ実際の外向き取得を行いますが、取り込み記録を保存しません。修正前は HTTP 200 です。
policy.py のあるホスト作業フォルダーを開く App Policy タブに切り替えます。App はこのフォルダーをマウントし、毎回ファイルを再読み込みします。ターミナルエディターで開きます。
次のコマンドを実行する前に、App Policy タブに切り替えてください。
nano policy.py
ここでは FOLLOW_REDIRECTS = True を維持します。return True の行だけを次に置き換えます。
return (p.scheme, p.hostname, p.port or 80) == ("http", "catalog.test", 8000)
先頭の空白 4 つを維持してください。Python はインデントで文を関数内に置きます。p = urlsplit(url) は解析フィールドを生成します。丸括弧は 3 つの値をタプルにまとめ、== はタプル全体を比較します。式は真偽値 True または False を返します。p.port or 80 はポートが書かれていなければ通常の HTTP ポートを補います。引用符内は文字列で、8000 は数値です。
Ctrl+O、Enter で保存し、Ctrl+X で終了します。Workstation タブで実行します。
次のコマンドを実行する前に、Workstation タブに切り替えてください。
python3 imagectl.py probe http://catalog.test:8000/leaf.png
python3 imagectl.py probe http://internal.test:8000/status
画像は HTTP 200、Internal は HTTP 403 と destination denied を返す必要があります。502 は取得失敗で、編集ミスがよくある原因です。有効なポリシー拒否ではありません。App Policy タブに切り替え、nano policy.py を開き直し、綴りやインデントを直して保存します。再テストする前に Workstation タブに戻ります。各リクエストが保存ポリシーを読むため、再起動は不要です。
リダイレクトを止めて両面を確認する
このステップでは、残ったリダイレクト経路を閉じ、通常機能を維持できたか確認します。宛先修正後、Workstation タブで Catalog のリダイレクトを試します。
このステップを始めるには、ラボ画面の Workstation タブを選択してください。
次のコマンドを実行する前に、Workstation タブに切り替えてください。
python3 imagectl.py probe http://catalog.test:8000/redirect
まだ Internal の JSON が返ります。HTTP クライアントが最初のチェック後にリダイレクトをたどるためです。この店舗は直接画像 URL だけを受け入れるので、すべてのリダイレクトを拒否します。
App Policy タブで同じ有効なファイルを開きます。
次のコマンドを実行する前に、App Policy タブに切り替えてください。
nano policy.py
FOLLOW_REDIRECTS = True を FOLLOW_REDIRECTS = False に変更します。この変数はリダイレクト要求を拒否する準備済み HTTP ハンドラーを選択します。宛先チェックは維持します。Ctrl+O、Enter で保存し、Ctrl+X で終了します。
Workstation タブで禁止ケースを 1 つずつ試します。
次のコマンドを実行する前に、Workstation タブに切り替えてください。
python3 imagectl.py probe http://catalog.test:8000/redirect
python3 imagectl.py probe https://catalog.test:8000/leaf.png
python3 imagectl.py probe http://catalog.test:8001/leaf.png
リダイレクトは HTTP 422 と redirect denied、不正な 2 つのエンドポイントは HTTP 403 が期待値です。https は別のプロトコルです。ポートだけの変更もエンドポイントを変えます。接続エラーや 502 は目的の拒否ではありません。
最後に正規の画像を取り込み、独立した在庫利用側を確認します。
python3 imagectl.py fetch http://catalog.test:8000/leaf.png normal
python3 imagectl.py direct http://app.test:8000/health
両方が HTTP 200 を返し、正常性に inventory: synthetic-ready が必要です。Image Importer タブに切り替えて更新し、緑の画像を確認します。全遮断、Internal の停止、未使用コピーの編集では達成できません。画像が失敗したら App Policy タブに切り替えて許可タプルを戻し、Workstation タブに戻って許可された取り込みを繰り返します。正常性が失敗したら App の内部接続を維持してください。修正はこの機能の固定宛先とリダイレクトを制御し、正規の在庫利用側のネットワークアクセスを削除しません。

将来 2 つの宛先を認める場合は、in で集合とタプルを比較できます。例:(p.scheme, p.hostname, p.port or 80) in {("http", "one.test", 8000), ("http", "two.test", 8001)}。波括弧には完全な選択肢が 2 つ入ります。各組み合わせは許可し、ホスト名とポートを入れ替えた組み合わせは拒否します。次のチャレンジには専用の表があります。
まとめ
完全な宛先タプルを比較し、リダイレクトを無効にして、禁止リクエストと画像・在庫機能の維持をテストしました。この制御は固定された管理下のサービス識別子が対象です。



