IAM グループでチームを管理する

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

はじめに

二人の分析担当者に、同じレポートへのアクセスが必要です。一つの共有ポリシーを管理し、レポート作成の担当を Alice から Bob に移して、元のメンバーがそのアクセスを失うことを確認します。

最初に レポートの読み取り役に最小権限を与える を完了し、アイデンティティポリシーと許可・拒否されるリクエストについて学んでください。この新しい VM は、管理用の default と、テスト用の alice、bob、outsider を提供します。/home/labex/project と AWS View を使い、所属と実際の読み取りを比較します。

認定試験との関連

認定資格 試験タスク 演習内容
Cloud Practitioner (CLF-C02) タスク 2.3 IAM グループのメンバーシップと継承されるアクセス権限。
Solutions Architect – Associate (SAA-C03) タスク 1.1 IAM グループのメンバーシップと継承されるアクセス権限。
Developer – Associate (DVA-C02) タスク 2.1 IAM グループのメンバーシップと継承されるアクセス権限。
CloudOps Engineer – Associate (SOA-C03) タスク 4.1 IAM グループのメンバーシップと継承されるアクセス権限。
Security – Specialty (SCS-C03) タスク 4.2 基礎演習:IAM グループのメンバーシップと継承されるアクセス権限。
Data Engineer – Associate (DEA-C01) タスク 4.1 基礎演習:IAM グループのメンバーシップと継承されるアクセス権限。
DevOps Engineer – Professional (DOP-C02) タスク 6.1 基礎演習:IAM グループのメンバーシップと継承されるアクセス権限。
Solutions Architect – Professional (SAP-C02) タスク 2.3 基礎演習:IAM グループのメンバーシップと継承されるアクセス権限。

ラボの概要

概念図:ReportTeam は一つの S3 読み取りポリシーを共有します。メンバーを Alice から Bob に交代し、元メンバーはこの継承した権限を失います。

チームと一つの共有ポリシーを作成する

このステップでは、空のグループを作成し、インラインポリシーを関連付けます。グループは権限管理の対象であり、リクエスト用の新しいアイデンティティではありません。まず STS で操作担当者と Alice を確認します。ARN の末尾は、それぞれ user/iam02-operator と user/alice のはずです。

チームには、単一ユーザーに付与した読み取り権限が必要です。その権限をグループに一度付与し、分析担当者の引き継ぎに合わせてメンバーを変更します。引き継ぎ中もレポートとポリシーは変わらず、権限を継承するユーザーが変わります。

IAM グループは、ユーザーをまとめ、グループの権限を継承させます。認証情報はなく、自分でサインインしたりロールを引き受けたりできません。この演習では既存の IAM ユーザーによる構成を練習します。本番の人によるアクセスでは、一般にフェデレーションと一時的なロールを使います。

cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
aws sts get-caller-identity --profile alice --query Arn --output text

Alice には最初、既存レポートを読む権限がありません。操作担当者がその準備を行っています。アクセスを与える前にテストします。

aws s3api get-object --profile alice --bucket labex-iam02-reports --key reports/today.txt before.txt || true

AccessDenied を想定します。|| true は、貼り付けたコマンド列で意図的に失敗するコマンドを完了させます。接続失敗を権限の証拠に変えるものではありません。

ReportTeam を作成します。この時点ではメンバーは作成されず、権限も与えられません。

aws iam create-group --group-name ReportTeam

このバケットの reports プレフィックスに対して、GetObject だけを許可するポリシーを書きます。オブジェクト ARN はキーを含み、reports/ の後のワイルドカードは給与情報や他のバケットに一致しません。一致する Allow は、適用される明示的な Deny に上書きされない限り、リクエストを許可します。

cat > team-policy.json <<'JSON'
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"arn:aws:s3:::labex-iam02-reports/reports/*"}]}
JSON

put-group-policy は、このインラインポリシーをグループに直接保存します。グループメンバーに適用されます。ローカルファイルを編集するだけでは効果はありません。

aws iam put-group-policy \
  --group-name ReportTeam \
  --policy-name ReportRead \
  --policy-document file://team-policy.json
aws iam get-group --group-name ReportTeam --query 'Users[].UserName'
aws iam get-group-policy \
  --group-name ReportTeam \
  --policy-name ReportRead \
  --query PolicyDocument

メンバー一覧は空です。所属によってポリシーとつながっていないため、Alice はまだ拒否されます。

aws s3api get-object --profile alice --bucket labex-iam02-reports --key reports/today.txt still-denied.txt || true

Alice を追加し、権限の境界をテストする

このステップでは、Alice をグループの許可につなぎ、実際のリクエストを Bob と外部ユーザーと比較します。add-user-to-group は所属を変更します。認証情報の作成や表示は行いません。

Alice が ReportTeam に参加すると、読み取りポリシーがリクエストに適用されます。Bob と外部ユーザーはまだグループの外にいます。

aws iam add-user-to-group --group-name ReportTeam --user-name alice
aws iam get-group --group-name ReportTeam --query 'Users[].UserName'
aws iam list-groups-for-user --user-name alice --query 'Groups[].GroupName'

ReportTeam に Alice が、Alice のグループ一覧に ReportTeam があることを想定します。次に、Alice の認証情報でレポートのバイト列を要求します。

aws s3api get-object \
  --profile alice \
  --bucket labex-iam02-reports \
  --key reports/today.txt alice-report.txt
cat alice-report.txt

Daily orders: 145 を想定します。Bob と外部ユーザーによる同じレポートリクエストは、メンバーではないため失敗する必要があります。

aws s3api get-object --profile bob --bucket labex-iam02-reports --key reports/today.txt bob-denied.txt || true
aws s3api get-object --profile outsider --bucket labex-iam02-reports --key reports/today.txt outsider-denied.txt || true

Alice も、グループのリソース範囲外では引き続き拒否されます。これらの既存オブジェクトを使うことで、キーがない状態ではなく、認可を診断できます。

aws s3api get-object --profile alice --bucket labex-iam02-reports --key private/payroll.txt private-denied.txt || true
aws s3api get-object --profile alice --bucket labex-iam02-reference --key reference.txt reference-denied.txt || true

四つすべての否定テストで AccessDenied を想定します。AWS View は所属を表示し、各ユーザーとして実際の GetObject リクエストを送ります。今日のレポートを展開し、Alice が取得したバイト列を確認します。

所属を移し、元のアクセスを再確認する

このステップでは、レポート作成の担当を Bob に移し、Alice が継承した許可を失うことを確認します。グループ所属を取り消すと、そのグループから継承した権限がなくなります。ユーザーが持つ可能性のある他の許可は取り消されません。準備済みのこれらのユーザーには、他の許可はありません。

まず Bob を追加し、次に Alice を削除します。両方がメンバーである間、二人は同じグループポリシーを共有します。削除後は Bob だけが継承するはずです。

aws iam add-user-to-group --group-name ReportTeam --user-name bob
aws iam remove-user-from-group --group-name ReportTeam --user-name alice
aws iam get-group --group-name ReportTeam --query 'Users[].UserName'

Bob だけを想定します。Bob としてレポートを読み、次に Alice として同じリクエストを繰り返します。

aws s3api get-object \
  --profile bob \
  --bucket labex-iam02-reports \
  --key reports/today.txt bob-report.txt
cat bob-report.txt
aws s3api get-object --profile alice --bucket labex-iam02-reports --key reports/today.txt former-member.txt || true
aws s3api get-object --profile outsider --bucket labex-iam02-reports --key reports/today.txt outsider-denied.txt || true

Bob は 145 を受け取り、Alice と外部ユーザーは AccessDenied を受け取ります。認証情報が呼び出し元を選び、現在の有効な権限がリクエストの成功を決めます。

グループは読み取りを許可し、書き込みは許可しません。Bob として提供された置き換えファイルを試し、元のレポートがまだ存在することを確認します。

aws s3api put-object --profile bob --bucket labex-iam02-reports --key reports/today.txt --body upload.txt || true
aws s3api get-object \
  --profile bob \
  --bucket labex-iam02-reports \
  --key reports/today.txt bob-report.txt
cat bob-report.txt

PutObject の AccessDenied と、その後の変更されていない Daily orders: 145 を想定します。AWS View は Bob をメンバーとして表示し、Alice は拒否されます。グループポリシー自体は変わっていません。

レポート作成の担当が Bob に移った状態. 例:同じグループポリシーが Bob に読み取りアクセスを与え、元のメンバー Alice と外部ユーザーは引き続き拒否されます。展開されたレポートは、Bob として返された実際のバイト列を表示します。

チームとそのデータを削除する

このステップでは、グループと演習用のレポートデータを削除する前に、Bob が継承したアクセスを取り消します。IAM では、グループを削除する前にメンバーも関連付けられたポリシーもない状態にする必要があります。独立した ReferenceTeam と、その outsider の所属は変更しないでください。

aws iam remove-user-from-group --group-name ReportTeam --user-name bob
aws s3api get-object --profile bob --bucket labex-iam02-reports --key reports/today.txt revoked.txt || true

レポートがまだ存在する間に AccessDenied を想定します。インラインポリシーを削除し、次に空のグループを削除します。

aws iam delete-group-policy --group-name ReportTeam --policy-name ReportRead
aws iam delete-group --group-name ReportTeam
aws iam list-groups --query 'Groups[].GroupName'
aws iam get-group --group-name ReferenceTeam --query 'Users[].UserName'

ReferenceTeam だけが残り、outsider は引き続き所属しています。二つの正確な演習用オブジェクトキーを削除し、レポート用バケットを削除する前に空であることを確認します。

aws s3api delete-object --bucket labex-iam02-reports --key reports/today.txt
aws s3api delete-object --bucket labex-iam02-reports --key private/payroll.txt
aws s3api list-objects-v2 --bucket labex-iam02-reports

KeyCount が 0 で、Contents にオブジェクト項目が残っていないことを確認してください。

aws s3api delete-bucket --bucket labex-iam02-reports
aws s3api list-buckets --query 'Buckets[].Name'
aws s3api get-object --bucket labex-iam02-reference --key reference.txt reference.txt
cat reference.txt

Platform reference: keep を持つ参照用バケットだけが残ります。正常な API 問い合わせによって削除を確認できます。ネットワークエラーでは確認できません。AWS View は Group removed と Reports bucket removed を表示します。準備済みのユーザーとデータは、使い捨ての環境の終了時に回収されます。学習者が作成したグループと権限は削除されました。

まとめ

一つのポリシーをグループに設定し、所属によってレポートへのアクセスが与えられることを証明しました。アクセスを移し、元のメンバーと外部ユーザーが拒否されたままであることを確認しました。グループ所属は権限の一つの供給源です。アイデンティティが予想外に認可されたままの場合は、適用されるすべてのポリシーを確認してください。範囲を限定した削除の前にアクセスを取り消し、無関係なグループとデータを保持しました。

詳しくは、AWS 公式ドキュメントを参照してください:IAM ユーザーグループと継承される権限.