소개
보고서를 이용하는 사용자에게는 비공개 보고서 하나가 필요하며, 운영자의 전체 스토리지 접근 권한까지 필요한 것은 아닙니다. 독립적인 IAM 자격에 범위를 제한한 접근 권한을 부여하고 실제 요청을 테스트한 다음, 보고서 데이터를 보존하면서 권한을 철회합니다.
리소스 참조와 S3 객체 읽기에 대한 지식을 바탕으로 진행합니다. IAM Action과 Resource를 이해하고 있어야 합니다. 역할 신뢰, 인스턴스 프로파일, 개인 액세스 키는 필요하지 않습니다. 이 새로운 환경에는 두 CLI 자격이 모두 준비되어 있습니다.
관련 자격증 시험 항목
| 자격증 | 시험 과제 | 실습 내용 |
|---|---|---|
| Cloud Practitioner (CLF-C02) | Task 2.3 및 3.1 | 반복 가능한 인프라 구성으로 최소 권한 자격 증명 정책을 관리합니다. |
| Developer – Associate (DVA-C02) | Task 3.3, Skill 3.3.4 | 인프라 정의를 배포하는 기초 실습입니다. |
| DevOps Engineer – Professional (DOP-C02) | Task 2.1 | IaC 정의를 통해 리소스를 관리하는 기초 실습입니다. |
| Solutions Architect – Associate (SAA-C03) | Task 1.1 | IAM 읽기 사용자 정책의 범위를 제한하고 허용 및 거부되는 접근을 평가하는 기초 실습입니다. |

보고서 준비 및 읽기 사용자 살펴보기
이 단계에서는 보고서 저장소를 생성하고, 유효한 독립적인 읽기 사용자에게 처음에는 접근 권한이 없음을 확인합니다.
기본 CLI 자격은 인프라를 관리합니다. 제공된 reader 프로파일은 독립적인 IAM 사용자 report-reader의 것이며, 운영자의 접근 권한을 빌려 쓰지 않습니다. 스토리지를 생성해도 해당 사용자에게 자동으로 권한이 부여되지는 않습니다. 프로파일 선택은 AWS 요청에 서명하는 주체를 바꾸며 리소스 자체를 바꾸지 않습니다.
준비된 루트에 보고서 저장소를 생성합니다.
cd /home/labex/project/reader-access
cat > main.tf <<'EOF'
resource "aws_s3_bucket" "reports" {
bucket = "terraform-reader-reports"
}
resource "aws_s3_object" "report" {
bucket = aws_s3_bucket.reports.id
key = "reports/current.csv"
content = "orders,12\n"
content_type = "text/csv"
}
EOF
terraform init
terraform plan
두 리소스가 추가되어야 합니다. 적용하고 yes를 입력합니다.
terraform apply
독립적인 읽기 사용자로 보고서 읽기를 시도합니다. || true는 의도한 실패 후에도 이 명령 블록을 계속 실행할 수 있게 합니다. 요청을 성공적인 읽기로 바꾸지는 않습니다.
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
reader-report.csv || true
AccessDenied가 표시되어야 합니다. 자격은 유효하지만 일치하는 권한이 없습니다. 실습 내내 별도의 team-reference-reports/keep.txt 객체를 비공개로 유지하세요. AWS View는 운영자 자격으로 스토리지를 살펴봅니다. 거기서 객체를 미리 볼 수 있다고 읽기 사용자도 접근할 수 있는 것은 아닙니다.

의도한 보고서 읽기만 허용하기
이 단계에서는 리소스 참조로 IAM 자격 증명 정책을 만들고 허용되는 읽기와 금지되는 읽기를 모두 확인합니다.
인라인 자격 증명 정책은 한 사용자에게 직접 연결되어 해당 사용자에게 작업 권한을 부여합니다. s3:GetObject는 버킷 ARN이 아니라 객체 ARN에 적용됩니다. jsonencode는 Terraform 값을 유효한 JSON으로 변환하므로 이스케이프된 JSON 문자열을 직접 구성하는 대신 일반 HCL 리소스 참조를 사용할 수 있습니다.
policy.tf를 생성합니다. 읽기 사용자 이름은 미리 제공된 값입니다. 정책의 대상 ARN은 생성한 버킷 ARN과 실제 객체 키를 결합합니다.
cat > policy.tf <<'EOF'
resource "aws_iam_user_policy" "reader" {
name = "ReadReport"
user = "report-reader"
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = "s3:GetObject"
Resource = "${aws_s3_bucket.reports.arn}/${aws_s3_object.report.key}"
}]
})
}
EOF
terraform plan
계획은 버킷과 보고서를 유지하면서 정책 하나를 추가합니다. 적용하고 yes를 입력합니다.
terraform apply
같은 reader 프로파일로 대상을 읽습니다.
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
reader-report.csv
cat reader-report.csv
orders,12가 표시되어야 합니다. 이제 동일한 자격으로 관련 없는 비공개 객체를 읽어 봅니다.
aws s3api \
get-object \
--profile reader \
--bucket team-reference-reports \
--key keep.txt \
unrelated-report.txt || true
참조 데이터가 다운로드되는 대신 AccessDenied가 표시되어야 합니다. 이 정책은 보고서 읽기만 허용하며 보고서 쓰기나 삭제를 허용해서는 안 됩니다. 대상 읽기가 작동하더라도 광범위한 작업 또는 리소스 와일드카드는 의도하지 않은 접근을 만들 수 있습니다. 검사는 실제 정책의 의미를 읽고 실제 허용 및 금지된 읽기를 수행하며, 특정 JSON 배치를 요구하지 않습니다. 동등한 문자열 및 목록 표현식과 보고서에만 해당하는 접두사는 새 작업 권한을 부여하지 않으면서 이 과제를 충족할 수 있습니다.
데이터를 삭제하지 않고 권한 철회하기
이 단계에서는 Terraform으로 정책을 제거하고, 보고서는 남아 있는 채 접근 권한이 바뀌었음을 확인합니다.
리소스 블록을 제거하면 해당 관리 대상 리소스의 삭제가 제안됩니다. 스토리지 구성은 변경하지 않고 policy.tf만 삭제하세요.
rm policy.tf
terraform plan -out=revoke.tfplan
terraform show revoke.tfplan
정책 하나만 삭제되며 버킷이나 객체 삭제는 없어야 합니다. 저장된 아티팩트를 적용합니다.
terraform apply revoke.tfplan
동일한 읽기 사용자로 대상 읽기를 다시 시도합니다.
aws s3api \
get-object \
--profile reader \
--bucket terraform-reader-reports \
--key reports/current.csv \
after-revoke.csv || true
AccessDenied가 표시되어야 합니다. 권한을 철회해도 이미 다운로드한 로컬 파일은 삭제되지 않습니다. reader-report.csv가 존재한다고 새 요청이 허가되었다고 입증할 수는 없습니다. 기본 운영자 자격으로 저장된 보고서를 조회합니다.
aws s3api \
get-object \
--bucket terraform-reader-reports \
--key reports/current.csv \
retained-report.csv
cat retained-report.csv
보고서에는 여전히 orders,12가 있습니다. 데이터를 변경하지 않고 권한 부여 경계를 바꾼 것입니다. Action과 Resource의 차이는 IAM 정책 요소를 참고하세요.
직접 만든 보고서 저장소 삭제하기
이 단계에서는 접근 및 권한 철회 검사를 완료한 뒤 스토리지를 정리합니다.
이 루트에 남아 있는 리소스를 삭제하고 yes를 입력합니다.
terraform destroy
버킷과 보고서 객체가 삭제됩니다. 제공된 읽기 사용자와 팀 참조 리소스는 준비된 환경에 속하며 이 루트의 상태에 포함되지 않습니다. 최종 매핑과 보존된 참조 리소스를 확인합니다.
terraform state list
aws s3api \
list-buckets \
--query 'Buckets[].Name'
aws s3api \
head-object \
--bucket team-reference-reports \
--key keep.txt \
--query ContentLength
상태 목록은 비어 있고 참조 리소스는 남아 있습니다. 최종 검사가 끝날 때까지 준비된 두 CLI 자격의 설정을 모두 유지하세요.
요약
jsonencode와 리소스 참조로 IAM 자격 증명 정책을 정의하고, 독립적인 읽기 사용자로 허용 및 금지된 요청을 테스트하고, 보고서 데이터를 삭제하지 않고 권한을 철회한 뒤, 직접 만든 저장소만 삭제했습니다.



