ポータルに必要なアクセスだけを与える

サイバーセキュリティBeginner
オンラインで実践に進む

はじめに

この新しい環境では匿名での漏えいは修正済みですが、ポータルはまだストレージ管理者の認証情報を使っています。そのため、割り当てられた明細書の読み取り以上の操作ができます。専用 ID を作り、必要なオブジェクト読み取りだけを許可し、アプリケーションを切り替えます。

アカウントとポリシーの変更には Storage Admin、アプリケーションの非公開認証情報ファイルには Portal App、実際のアプリケーションリクエストには Document Portal タブを使います。合成の環境は組み込みユーザープリンシパルを使うローカル VersityGW 1.10.0 で動き、完全な AWS IAM ではありません。前の実験とは独立して開始します。

ポータル専用 ID を作成する

このステップでは、管理者への依存を独立したアプリケーション ID に置き換えます。

このステップを始めるには、ラボ画面の Document Portal タブを選択してください。

Document Portal タブに切り替え、Open assigned document をクリックして Identity: storage-admin を確認します。明細書は読めますが、管理者権限は不要です。ID は呼び出し元を識別し、その秘密キーでクライアントがリクエストに署名して ID を証明します。認証は誰が呼び出したかを証明し、認可は何を許すかを決めます。

Storage Admin タブで、この VM の管理者認証情報を読み込みます。

次のコマンドを実行する前に、Storage Admin タブに切り替えてください。

source admin.env

VersityGW には管理クライアントが付属します。-a はアクセスキー名、-s は秘密値、-er はエンドポイントです。create-user より前のオプションは管理者を識別し、後のオプションは新規アカウントを定義します。user ロールには管理者のような制限回避権限はありません。合成アカウントを作成します。

/opt/c14/versitygw admin -a storage-admin -s storage-admin-secret -er http://127.0.0.1:7070 create-user -a portal-reader -s portal-reader-secret -r user

成功するとエラーは表示されません。繰り返し実行してアカウントが既に存在する場合は、そのアカウントを引き続き使います。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 public/help.txt help.txt

オブジェクトのメタデータは認証済みリクエストを確認する材料です。公開ヘルプは全員に許可されています。内部明細書の読み取りはまだ許可されていません。InvalidAccessKeyId はユーザーがないこと、SignatureDoesNotMatch は秘密値の誤りを意味し、どちらも認可の結果ではありません。

必要なプレフィックスの読み取りだけを許可する

このステップでは、書き込みや無関係な読み取りを許さずに専用 ID を認可します。

このステップを始めるには、ラボ画面の Storage Admin タブを選択してください。

ポータルが必要とするのは portal/statement.txt で、許可範囲は portal/ です。プレフィックスはオブジェクトキーの先頭に一致します。portal/* は finance/budget.txt を含みません。読み取りは s3:GetObject、アップロードと削除はそれぞれ s3:PutObject、s3:DeleteObject を使います。すべての操作を含む s3:* は避けます。

Storage Admin タブで実効ポリシーを読みます。

次のコマンドを実行する前に、Storage Admin タブに切り替えてください。

aws --endpoint-url http://127.0.0.1:7070 s3api get-bucket-policy --bucket documents --query Policy --output text

公開ヘルプの許可しかありません。ローカルコピーを開きます。

nano policy.json

次の完全な JSON に置き換えます。公開用の文を残し、名前付き読み取り ID の許可を別の文として追加します。VersityGW の組み込みプリンシパルはユーザー名です。AWS の形式とは異なります。

{
  "Version": "2012-10-17",
  "Statement": [
    {"Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::documents/public/*"},
    {"Effect": "Allow", "Principal": "portal-reader", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::documents/portal/*"}
  ]
}

nano で Ctrl+O、Enter で保存し、Ctrl+X で終了します。file:// でファイルを適用します。

aws --endpoint-url http://127.0.0.1:7070 s3api put-bucket-policy --bucket documents --policy file://policy.json

出力がなければ成功です。構文エラーなら以前のポリシーが引き続き有効です。必要なら修正して再適用します。許可した読み取りをテストします。

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

次に無関係な読み取りをテストします。予想される AccessDenied は意図した結果なので、その後も続けてください。

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 finance/budget.txt budget.txt

チェックポイントは使い捨ての同等ストレージで実際の書き込みと削除もテストし、稼働中の文書を保ちます。無効な ID は正の対照である読み取りに失敗するため、壊れたログインを最小権限と誤認しません。

アプリケーションの認証情報を切り替える

このステップでは、実際のポータルを専用 ID に切り替えます。

このステップを始めるには、ラボ画面の Portal App タブを選択してください。

Portal App タブに切り替えます。この独立したローカルアカウントは非公開のアプリケーション設定を所有し、Storage Admin シェルの認証情報は持ちません。現在のファイルを読みます。

次のコマンドを実行する前に、Portal App タブに切り替えてください。

cat credentials.json

access_key と secret_key は現在 storage-admin を識別しています。ファイルを編集します。

nano credentials.json

専用の合成認証情報を使います。

{
  "access_key": "portal-reader",
  "secret_key": "portal-reader-secret"
}

Ctrl+O、Enter で保存し、Ctrl+X で終了します。ポータルはリクエストごとにファイルを読むため再起動は不要です。Document Portal タブに戻り、Open assigned document をクリックするか再読み込みします。Identity: portal-reader と元の明細書が表示されるはずです。読めないと表示されたら JSON や認証情報を直し、Storage Admin タブでポリシーを確認します。

専用の portal-reader ID を使う Document Portal

最後に Storage Admin タブで匿名の内部リクエストと公開ヘルプをテストします。-sS は進捗を隠してエラーを示し、-w は応答コードを追加します。

次のコマンドを実行する前に、Storage Admin タブに切り替えてください。

curl -sS -w '\nHTTP %{http_code}\n' http://127.0.0.1:7070/documents/portal/statement.txt

AccessDenied と HTTP 403 が返るはずです。

curl -sS http://127.0.0.1:7070/documents/public/help.txt

元のヘルプ文が返るはずです。アプリケーション ID と匿名アクセスは別々の境界で、一方を保護しても他方が自動で保護されるわけではありません。

まとめ

通常のアプリケーション ID を作成し、必要なプレフィックスの読み取りだけを許可して、動作するポータルを管理者認証情報から切り離しました。認証、認可、公開アクセス、アプリケーションの可用性を別々に検証しました。