一時リンクで非公開ファイルを共有する

AWSBeginner
オンラインで実践に進む

はじめに

同僚は、非公開レポートを一時的にダウンロードする必要があります。ファイルを公開状態にせず、署名付きリンクを生成してテストし、アクセスの制限を確認して、練習用リソースを削除します。

最初に キーとメタデータで文書を整理する を完了し、キー、ダウンロード、削除について学んでください。この新しい VM には、非公開バケットと制限されたアイデンティティが準備済みです。個人のログインや IAM ポリシーの記述は不要です。Terminal と隣の AWS View タブを使ってください。完全なダウンロードリンクは非公開に保ってください。

認定試験との関連

このラボでは、次の試験トピックに関連する実践的な演習を行います。

設定済みのアイデンティティでレポートを読む

このステップでは、許可されたレポートを取得し、別の非公開オブジェクトが自分のアイデンティティの権限の範囲外にあることを確認します。

権限は、アイデンティティがリソースに対して何を行えるかを定義します。準備済みの読み取り用アイデンティティは、このバケットの一覧表示と shared/report.txt の読み取りができますが、private/payroll.txt の読み取りやストレージの変更はできません。ここではポリシーを書かずに、この権限を使います。ポリシーは後で IAM コースで学びます。

cd(ディレクトリを変更する)で作業ディレクトリに移動します。

cd /home/labex/project

準備済みバケットの shared プレフィックスを一覧表示します。

aws s3 ls s3://labex-private-documents/shared/

一覧には、末尾が report.txt の行が含まれます。このプレフィックスでは、完全なキー shared/report.txt を指します。プレフィックスはキーを整理しますが、その名前によってオブジェクトが公開状態になるわけではありません。設定済みのアイデンティティにバケットの一覧表示が許可されているため、AWS CLI リクエストが成功します。

認証された AWS CLI リクエストでレポートをダウンロードします。

aws s3 cp s3://labex-private-documents/shared/report.txt authorized-report.txt

ローカルのテキストファイルを表示する cat で、この架空のレポートを確認します。

cat authorized-report.txt
Monthly report: 42000 revenue

AWS View で shared/report.txt を開きます。プレビューは、読み取り用アイデンティティに許可されたアクセスを使って、同じ保存内容を表示します。

例:読み取り用アイデンティティは共有用レポートをプレビューできる。

この例は、設定済みの読み取り用アイデンティティがレポートを利用できることを示します。次のステップのダウンロードコマンドは、一時リンク自体を確認します。

別の給与オブジェクトの読み取りを試します。

aws s3 cp s3://labex-private-documents/private/payroll.txt denied-payroll.txt

このコマンドは、403 または AccessDenied エラーで失敗する想定です。オブジェクトは存在しますが、この読み取り用アイデンティティには取得が許可されていません。一つのレポートへのアクセスがあるからといって、バケット内のすべてのオブジェクトにアクセスできるわけではありません。許可されたレポートだけを共有します。

一時ダウンロードリンクを生成して使う

このステップでは、署名付きリンクを生成し、受信側のリクエストでは AWS アイデンティティではなく HTTP クライアントを使ってレポートをダウンロードします。

一時リンクは、期限が終わるまで、許可されたダウンロードを可能にします。

一時ダウンロードリンク

署名付き URL(presigned URL)は、署名と有効期限を含むリンクです。受信者は署名する側の AWS 認証情報を受け取ることなく、許可されたダウンロードを行えます。リンクファイルには制限された権限が設定されています。完全な内容は非公開に保ってください。

aws s3 presign は、指定されたオブジェクトのダウンロードを許可する URL を生成します。--expires-in は要求する有効期間を秒で設定します。600 は生成から 10 分を意味します。オブジェクトのアクセス権限は変わりません。シェルの > は、完全なリンクを表示する代わりに、既に保護されたローカルファイルへ出力を書き込みます。

aws s3 presign s3://labex-private-documents/shared/report.txt --expires-in 600 > download-link.txt

出力はファイルに書き込まれるため、コマンドは何も表示しません。この URL を持つ人は、有効な間、委任されたアクセスを使えます。完全なリンクをスクリーンショットや公開メッセージに含めないでください。

リンクを表示せずに、シェル変数に読み込みます。$(...) はコマンドの出力を取り込みます。cat はファイルを読み、DOWNLOAD_URL=... は取り込んだテキストを代入します。代入の = の前後にスペースはありません。

DOWNLOAD_URL=$(cat download-link.txt)

curl は HTTP リクエストを送ります。-f は HTTP エラー応答を失敗として扱い、-sS はエラーメッセージを残しながら進捗表示を隠し、-o は応答本文をローカルファイルに書き込みます。二重引用符は、クエリパラメーターも含め、URL 全体を一つの引数として保持します。

curl -fsS "$DOWNLOAD_URL" -o shared-download.txt

curl は AWS 認証情報やプロファイルを受け取りません。URL 自体に、このダウンロードに必要な署名が含まれています。結果を読み取ります。

cat shared-download.txt
Monthly report: 42000 revenue

cmp は二つのファイルをバイト単位で比較します。&& は、比較が成功した場合だけメッセージを表示します。

cmp authorized-report.txt shared-download.txt && echo 'Temporary-link download matches'

このメッセージは、HTTP ダウンロードに同じレポートが含まれていることを確認します。リンクを生成するだけでは、それが動作することは証明できません。このリクエストで、実際の権限、署名、保存されたバイト列をテストします。ダウンロードまでに 10 分以上かかった場合は、新しいリンクを生成し、上の二つのコマンドで変数を再読み込みしてください。

リンクの有効期限を確認する

このステップでは、共有リンクの期限を観察します。10 分のリンクはダウンロード成功のテストに役立ちました。別の短時間だけ有効なリンクを使うと、期限切れをすぐに観察できます。

意図的に短い 15 秒の有効期間を持つ別のリンクを生成し、二つ目の保護されたファイルに保存します。

aws s3 presign s3://labex-private-documents/shared/report.txt --expires-in 15 > short-link.txt

表示せずに取り込みます。

SHORT_URL=$(cat short-link.txt)

sleep は指定された秒数だけ待ちます。この短いリンクに要求した有効期間を過ぎるよう、16 秒待ちます。

sleep 16

新しいリンクを生成せず、元の短いリンクを再び使います。ここでの -s は進捗表示を隠し、-o は応答本文を保存し、-w は HTTP ステータスだけを表示します。%{http_code} は curl のステータスフィールドで、\n は行を終えます。拒否を確認できるよう、-f は省略します。

curl -s -o expired-response.xml -w '%{http_code}\n' "$SHORT_URL"

予想されるステータスは 403 です。ファイルはまだ存在し、自分のアイデンティティは引き続き読み取れますが、委任された URL の有効期間は終了しました。XML 応答本文には、期限切れのリクエストの説明があります。リンクは含まれていないため、この応答は安全に確認できます。

cat expired-response.xml

Code は AccessDenied、Message は Request has expired. です。これによって拒否の理由を確認できます。接続失敗では期限切れを証明できません。

準備済みの保守用アイデンティティで削除する

このステップでは、準備済みの保守用アイデンティティで、実験用オブジェクトとバケットを削除します。

デフォルトの読み取り用アイデンティティには、意図的に削除権限がありません。AWS CLI のプロファイルは、アイデンティティとサービス設定を選ぶ名前付き設定です。準備済みの cleanup プロファイルには、この演習のリソースを削除する権限があります。次のコマンドでは、--profile cleanup でそれを選びます。認証情報を入力したり確認したりする必要はありません。

正確なキーで共有用レポートを削除します。

aws --profile cleanup s3 rm s3://labex-private-documents/shared/report.txt

別の使い捨ての準備用オブジェクトも、正確なキーで削除します。

aws --profile cleanup s3 rm s3://labex-private-documents/private/payroll.txt

両方の削除メッセージに、意図したオブジェクト名が表示されます。認証された一覧表示で、バケットが空であることを確認します。

aws --profile cleanup s3 ls s3://labex-private-documents/ --recursive

成功したコマンドは、オブジェクトの行を表示しません。空のバケットを削除します。

aws --profile cleanup s3 rb s3://labex-private-documents

出力は remove_bucket: labex-private-documents です。残っているバケットを確認します。

aws --profile cleanup s3 ls

バケットの行は残っておらず、AWS View は No buckets を表示します。ダウンロードリンクは、削除されたファイルを提供できません。保護されたローカル URL ファイルも不要になったため、ローカルの rm で削除できます。

rm download-link.txt short-link.txt

ダウンロード済みのレポートのコピーは、確認用に残っています。ストレージの削除、リンクの期限切れ、ローカルファイルの削除は異なる操作です。この演習で必要なそれぞれの部分を完了しました。

まとめ

許可された非公開レポートを取得し、拒否されたオブジェクトの読み取りを観察して、一時ダウンロード URL を生成しました。HTTP ダウンロードと認証されたコピーを比較し、その後、短時間だけ有効なリンクが期限切れの後に拒否されることを確認しました。

署名付き URL は、署名したアイデンティティに既に許可された操作を委任します。オブジェクトを公開状態にしたり、権限を回避したりするものではありません。完全なリンクは、一時的なアクセス用の秘密情報として扱ってください。最後に、別の保守用プロファイルで実験用オブジェクトとバケットを削除し、ローカルの URL ファイルも削除しました。