IAM 핵심 개념
| 개념 | 설명 |
|---|---|
| 사용자(User) | 실제 사람 또는 서비스 계정 |
| 그룹(Group) | 사용자 모음 — 그룹에 정책 부여 |
| 역할(Role) | EC2·Lambda 등 AWS 서비스가 가정하는 임시 자격증명 |
| 정책(Policy) | 허용/거부 규칙 JSON 문서 |
| 권한 경계 | 역할이 가질 수 있는 최대 권한 범위 |
JSON 정책 구조
JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3ReadOnly",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "DenyDeleteEverything",
"Effect": "Deny",
"Action": "s3:DeleteObject",
"Resource": "*"
}
]
}Deny는 Allow보다 항상 우선합니다.
최소권한 정책 예시
EC2 읽기 전용
JSON
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:List*"
],
"Resource": "*"
}]
}특정 S3 버킷만 전체 접근
JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-specific-bucket",
"arn:aws:s3:::my-specific-bucket/*"
]
}
]
}EC2 인스턴스 역할 생성
Bash
# 역할 생성
aws iam create-role \
--role-name EC2-S3-ReadOnly \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}'
# 정책 연결
aws iam attach-role-policy \
--role-name EC2-S3-ReadOnly \
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
# 인스턴스 프로파일 생성 및 연결
aws iam create-instance-profile --instance-profile-name EC2-S3-ReadOnly
aws iam add-role-to-instance-profile \
--instance-profile-name EC2-S3-ReadOnly \
--role-name EC2-S3-ReadOnlyMFA 강제 정책
콘솔 접속 시 MFA 미설정 시 권한 차단:
JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyWithoutMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}IAM 모범사례 체크리스트
Bash
# root 계정 사용 현황 확인
aws iam get-account-summary | grep RootAccess
# MFA 미설정 사용자 확인
aws iam generate-credential-report
aws iam get-credential-report | python3 -c "
import sys, base64, csv, io
data = eval(sys.stdin.read())
report = base64.b64decode(data['Content']).decode()
reader = csv.DictReader(io.StringIO(report))
for row in reader:
if row['mfa_active'] == 'false' and row['password_enabled'] == 'true':
print(row['user'])
"
# 90일 이상 미사용 접근키
aws iam list-users --query 'Users[*].UserName' --output text | \
xargs -I{} aws iam list-access-keys --user-name {} --query \
'AccessKeyMetadata[?Status==`Active`].[UserName,AccessKeyId,CreateDate]' \
--output table- root 계정은 MFA 설정 후 사용 금지
- 개인 액세스키 대신 역할(Role) 사용
- 정기적으로 미사용 자격증명 삭제
- AWS Organizations SCP로 계정 수준 가드레일 적용
편집 안내 · Editorial Note
이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.