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'

outsider를 여전히 포함한 ReferenceTeam만 남습니다. 소유한 객체 키 두 개만 정확히 삭제하고 삭제 전에 보고서 버킷이 비어 있는지 확인하세요.

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 사용자 그룹과 상속된 권한.