はじめに
小規模なサポートチームが、公開ヘルプと顧客の明細書を同じバケットに保存しています。通常、ポータルは明細書の読み取りリクエストに署名し、訪問者はヘルプだけを読めるはずです。しかし、誤ったポリシーによって内部文書が匿名で公開されています。業務データを削除せずにアクセス範囲を狭めます。
この実験では Storage Admin タブを使います。Document Portal は準備済みアプリケーション、Portal App はその独立したローカルアカウントです。すべての文書と認証情報は合成のものです。VersityGW 1.10.0 は、組み込みユーザー名をプリンシパルに使うローカルの S3 互換ゲートウェイです。AWS IAM やアカウント単位の Public Access Block は再現しません。基本的な端末操作ができれば十分で、クラウドアカウントは不要です。
通常公開される文書をダウンロードする
このステップでは、訪問者に公開する予定のヘルプ文書を取得します。
このステップを始めるには、ラボ画面の Storage Admin タブを選択してください。
バケットは名前の付いたオブジェクトの集合です。オブジェクトキーは保存された名前です。public/help.txt は通常のディレクトリ権限ではなく、プレフィックス public/ を使います。このバケットは documents です。エンドポイント http://127.0.0.1:7070 は、この VM 上のストレージサービスを示します。
curl は HTTP リクエストを送ります。認証情報がなければ匿名の訪問者として動作します。Storage Admin タブで実行します。
次のコマンドを実行する前に、Storage Admin タブに切り替えてください。
curl -sS http://127.0.0.1:7070/documents/public/help.txt
-sS は進捗表示を隠し、接続エラーは表示します。Synthetic help: contact support through the portal. が表示されるはずです。出力ファイルを指定する -o を使い、利用可能なローカルコピーを保存します。
curl -sS -o help.txt http://127.0.0.1:7070/documents/public/help.txt
cat でローカル文書を読みます。
cat help.txt
同じヘルプ文が表示されるはずです。これが正常な公開アクセスです。Document Portal タブに切り替え、Open assigned document をクリックします。署名付きリクエストを使うポータルアプリケーションも、合成の明細書を読めます。次のステップでは、この正規の利用と匿名での公開を分けます。

匿名アクセスのポリシーを狭める
このステップでは、公開ヘルプを維持しつつ、匿名による内部文書の読み取りをなくします。
このステップを始めるには、ラボ画面の Storage Admin タブを選択してください。
まず匿名で明細書をリクエストします。-w は HTTP 応答コードを追加し、\n は改行を挿入します。200 はリクエストの成功です。本当の権限拒否は 403 と AccessDenied です。404 や接続エラーだけでは保護を証明できません。
次のコマンドを実行する前に、Storage Admin タブに切り替えてください。
curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:7070/documents/portal/statement.txt
明細書と HTTP 200 が表示されれば漏えいを確認できます。削除しないでください。ポータルはまだこの文書を必要とします。
AWS CLI は S3 互換 API を呼び出せます。source は準備済みの管理者認証情報をこの端末に読み込みます。この訓練 VM だけの認証情報です。新しい Storage Admin セッションを開いたら、もう一度実行してください。
source admin.env
稼働中のサービスから実効ポリシーを読みます。s3api はオブジェクトストレージの操作を選び、--endpoint-url は AWS ではなくローカルゲートウェイを指定します。--query Policy --output text は JSON ポリシー文字列を表示します。
aws --endpoint-url http://127.0.0.1:7070 s3api get-bucket-policy --bucket documents --query Policy --output text
JSON ポリシーには Statement リストがあります。Effect: Allow は操作を許可し、Principal は許可を受ける主体、Action は操作、Resource はオブジェクトを指定します。s3:GetObject はオブジェクトの読み取りです。Principal: "*" は匿名訪問者も含みます。リソース arn:aws:s3:::documents/* は全キーを対象とし、末尾の * は任意の接尾辞に一致します。もう一つの文は、portal-reader に portal/* へのアクセスを別途許可します。
nano で準備済みコピーを編集します。
nano policy.json
匿名の文の Resource だけを arn:aws:s3:::documents/* から arn:aws:s3:::documents/public/* に変更します。名前付きポータルの文は残します。JSON の文字列は二重引用符で囲み、フィールド間にはカンマが必要です。Ctrl+O、Enter で保存し、Ctrl+X で終了します。
ローカルファイルの編集だけではアクセスは変わりません。適用しましょう。file:// は、そのファイルからポリシーを読むよう CLI に指定します。
aws --endpoint-url http://127.0.0.1:7070 s3api put-bucket-policy --bucket documents --policy file://policy.json
適用に成功すると何も出力されません。JSON が無効ならエディターを開き直し、引用符やカンマを直して再適用します。先ほどの匿名明細書リクエストを繰り返すと、AccessDenied と HTTP 403 が返るはずです。適用可能な許可がないリクエストは既定で拒否されます。全員を一律に拒否すると、正規のポータルも使えなくなります。
ポータルと公開ヘルプを維持する
このステップでは、修正後も必要な読み取りができ、文書が変わっていないことを示します。
このステップを始めるには、ラボ画面の Storage Admin タブを選択してください。
ステップ 1 の匿名コマンドで公開ヘルプを再テストします。元の文が返るはずです。Document Portal タブで再び Open assigned document を開き、明細書と Identity: portal-reader を確認します。
名前付き ID を直接テストするため、このコマンドだけに認証情報を指定します。先頭の変数代入はそのコマンドだけに作用するため、端末の管理者環境はその後も使えます。get-object はキーを末尾のローカルファイル名へダウンロードします。
次のコマンドを実行する前に、Storage Admin タブに切り替えてください。
AWS_ACCESS_KEY_ID=portal-reader AWS_SECRET_ACCESS_KEY=portal-reader-secret aws --endpoint-url http://127.0.0.1:7070 s3api get-object --bucket documents --key portal/statement.txt statement.txt
CLI はオブジェクトのメタデータを表示します。実際にダウンロードした文書を読みます。
cat statement.txt
Synthetic statement: account 1042, balance 75 credits. が表示されるはずです。同じ保存済み明細書が、名前付きリクエストでは読め、匿名では拒否されます。ポータルが失敗する場合は実効ポリシーを再確認します。名前付き許可を残し、匿名許可は public/* で終わる必要があります。ポリシーを戻して再適用してください。オブジェクトの削除やストレージ停止では両方の要件を満たせません。
まとめ
匿名リクエストと署名付きポータルリクエストを区別し、実際のバケットポリシーを狭め、公開ヘルプと顧客明細書を維持しました。修正の成功には、公開の阻止と動作する業務経路の両方が必要です。



