/엔지니어/클라우드/AWS IAM 역할·정책 실전 — 최소권한 모범사례
클라우드중급awsiam최소권한

AWS IAM 역할·정책 실전 — 최소권한 모범사례

IAM 사용자·그룹·역할·정책의 개념 차이, JSON 정책 작성법, 최소권한 원칙 적용, MFA 강제, IAM 모범사례를 정리합니다.

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-ReadOnly

MFA 강제 정책

콘솔 접속 시 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로 계정 수준 가드레일 적용
#aws#iam#최소권한#정책#보안#role
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.