AWS IAM 보안의 정석

안녕하세요! 오늘은 AWS 계정 보안을 한 단계 업그레이드하는 방법을 공유하려 합니다.

혹시 IAM 사용자를 만들 때 습관적으로 AdministratorAccess를 주고 계시지는 않나요? 이렇게 되면 액세스 키가 유출되었을 때 돌이킬 수 없는 피해를 입게 됩니다.

AWS 보안의 모범 사례(Best Practice)는 **"IAM 사용자는 깡통(권한 0)으로 만들고, 필요한 작업을 할 때만 '역할(Role)'을 빌려 쓰는(Assume) 방식"**입니다. 이렇게 하면 과도한 권한 부여를 막고, 누가 언제 어떤 권한을 썼는지 투명하게 관리할 수 있습니다.

‍

1. 큰 그림: 우리가 만들 구조

우리는 3가지 등급의 역할을 만들고, 사용자는 상황에 맞춰 이 역할들로 '변신(Switch Role)'해서 일하게 할 겁니다.

‍

Role-Viewer: 읽기 전용 (모니터링용)

Role-Operator: 서버 재부팅 등 일상 운영 작업용

Role-Admin-Emergency: 비상시에만 사용하는 최고 관리자용 (MFA 필수)

‍

2. 단계별 구축 가이드

Step 1. 안전장치 만들기: 권한 경계(Permissions Boundary)

가장 먼저, 역할이 가질 수 있는 권한의 상한선을 만듭니다. 이걸 설정해두면 관리자 권한을 가진 역할이라도 특정 리전 밖에서는 아무것도 못 하게 막을 수 있습니다.

‍

[IAM 콘솔] > [정책(Policies)] > [정책 생성] 클릭.

[JSON] 탭을 클릭하고 아래 내용을 붙여넣습니다. (서울 리전 외 차단 및 로그 삭제 금지 예시)

‍

JSON

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "iam:*", "kms:ScheduleKeyDeletion", "kms:DisableKey", "cloudtrail:StopLogging", "cloudtrail:DeleteTrail" ], "Resource": "*" }, { "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "StringNotEquals": { "aws:RequestedRegion": "ap-northeast-2" } } } ] }

‍

정책 이름:PB-Guardrail-Base로 저장합니다.

‍

Step 2. 역할(Role) 3종 세트 만들기

이제 실제로 작업할 때 쓸 '모자(역할)'를 3개 만듭니다. 예시로 Viewer 역할 하나만 만드는 법을 설명할게요. 나머지도 방식은 같습니다.

‍

[IAM 콘솔] > [역할(Roles)] > [역할 생성] 클릭.

신뢰할 수 있는 엔터티 유형: 'AWS 계정' 선택 > '이 계정(This account)' 선택.

‍

권한 추가:‍

검색창에 ReadOnlyAccess 입력 후 체크.‍

중요! 목록 하단(또는 상단)에 **[권한 경계 설정(Set permissions boundary)]**를 찾아 클릭합니다.

방금 만든 PB-Guardrail-Base를 검색해서 선택합니다. (이게 안전벨트 역할을 합니다)

‍

이름 지정: Role-Viewer라고 입력하고 생성 완료.

‍

나머지 역할 권장 설정: * Role-Operator: 운영에 필요한 커스텀 정책 + Boundary 적용 * Role-Admin-Emergency: AdministratorAccess + Boundary 적용

‍

Step 3. 역할의 신뢰 정책(Trust Policy) 수정

"이 역할은 아무나 쓸 수 없어!"라고 선언해야 합니다. 특히 MFA(멀티팩터 인증)를 한 사람만 역할을 쓸 수 있게 잠그는 것이 핵심입니다 .

‍

방금 만든 Role-Viewer를 클릭해 들어갑니다.

[신뢰 관계(Trust relationships)] 탭 > [신뢰 정책 편집] 클릭.

‍

아래 JSON으로 교체합니다. (MFA가 true일 때만 Assume 허용)

‍

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<내_계정_ID>:root" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } } } ] }

Step 4. 사용자(User) 만들기 & 연결

이제 사람(User)을 만듭니다. 이 사람은 권한이 0개여야 합니다. 오직 "역할을 쓰는 권한" 하나만 줍니다.

[IAM 콘솔] > [사용자(Users)] > [사용자 생성] 클릭.

이름 입력 후, 어떤 권한 정책도 연결하지 않고 생성을 완료합니다.

‍

[정책(Policies)] 메뉴로 가서 **[정책 생성]**을 누르고, 아래 내용을 Allow-AssumeRole이라는 이름으로 만듭니다.

‍

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::<내_계정_ID>:role/Role-Viewer", "arn:aws:iam::<내_계정_ID>:role/Role-Operator", "arn:aws:iam::<내_계정_ID>:role/Role-Admin-Emergency" ] } ] }

‍

다시 사용자로 돌아와서, 방금 만든 Allow-AssumeRole 정책만 딱 하나 연결해 줍니다.

(강력 추천) Force-MFA 정책도 만들어서 붙여주세요. "MFA 안 하면 모든 행동 Deny" 정책을 추가하면 보안이 완벽해집니다.

‍

3. 실전 사용 방법 (역할 전환하기)

설정이 끝났으니 이제 역할을 써볼까요?

콘솔에서 사용하기 (Switch Role)

IAM 사용자로 로그인합니다. (권한이 없어서 아무것도 안 보일 겁니다.)

우측 상단 [계정 아이디/이름] 클릭 > [역할 전환(Switch Role)] 클릭.

‍

정보 입력:

   계정(Account): 내 AWS 계정 ID (12자리 숫자)

   역할(Role): Role-Viewer

   표시 이름(Display Name): 보기 편한 이름 (예: Viewer)

‍

[역할 전환] 버튼을 누르면, 상단 바 색상이 바뀌면서 이제부터 Viewer 권한으로 활동하게 됩니다.

CLI에서 사용하기

터미널에서는 다음 명령어로 임시 자격 증명을 받아 사용합니다.

‍

aws sts assume-role

--role-arn arn:aws:iam::<내_계정_ID>:role/Role-Viewer

--role-session-name my-session

‍

리턴되는 AccessKey, SecretKey, SessionToken을 환경변수에 넣고 사용하면 됩니다.

‍

4. 자주 묻는 질문 (Troubleshooting)

Q. 역할 전환을 했는데 'Access Denied'가 떠요!

‍

MFA 확인: 로그인할 때 MFA를 했나요? 신뢰 정책에 MFA 필수 조건이 있다면 MFA 없이는 전환이 안 됩니다.

권한 경계 확인: 혹시 서울 리전(ap-northeast-2)이 아닌 곳을 조회했나요? 권한 경계(PB)에서 막았을 수 있습니다.

‍

Q. 사용자가 역할을 전환조차 못 해요.

사용자에게 sts:AssumeRole 정책을 연결했는지 확인하세요.

역할의 신뢰 정책(Trust Policy)에 해당 계정(root)이 포함되어 있는지 확인하세요.

마치며

"사용자는 로그인만, 권한은 전부 역할에!" 처음엔 조금 번거로울 수 있지만, 이 AssumeRole 패턴은 계정이 늘어나거나 팀원이 많아질수록 빛을 발하는 가장 단단한 보안 체계입니다.

  • 큰 그림: 우리가 만들 구조

  • 단계별 구축 가이드

  • 실전 사용 방법 (역할 전환하기)

  • 자주 묻는 질문 (Troubleshooting)

관련 키워드
클라우드
관련 키워드
클라우드
관련 콘텐츠
Tech Guide
클라우드
운영 최적화
AWS
Tech Guide
Insight
운영 최적화
클라우드
SOC
Insight
Insight
운영 최적화
Datadog
Insight