목차
- 1. 클라우드 IAM 보안에서 최소 권한 원칙을 어떻게 해석할까
- 2. 클라우드 IAM 보안 체크리스트 전에 먼저 정리할 것
- 3. 실무용 클라우드 IAM 보안 체크리스트: 저는 이 순서로 봅니다
- 3-1. 아이덴티티 정리
- 3-2. 권한 범위 정리
- 3-3. 조건 기반 접근 제어
- 3-4. 감사와 탐지
- 3-5. 비밀정보와 자격 증명
- 4. 실전 구현: AWS 기준으로 클라우드 IAM 보안 최소 권한 줄여보기
- 4-1. 현재 권한 사용 흔적부터 봅니다
- 4-2. 정책은 작게 시작하되, 의존 권한을 같이 봅니다
- 4-3. 시뮬레이션으로 미리 검증합니다
- 4-4. 조건을 붙일 수 있으면 권한보다 먼저 붙입니다
- 4-5. 다른 클라우드도 같은 방식으로 봅니다
- 5. 제가 자주 겪었던 트러블슈팅 포인트
- 5-1. 서비스가 갑자기 AccessDenied를 뿜는 경우
- 5-2. 사람 계정은 되는데 배치만 실패하는 경우
- 5-3. 와일드카드를 못 줄이겠다고 느껴질 때
- 6. 클라우드 IAM 보안 적용 후 검증 기준
- 7. 체크리스트를 운영 프로세스에 붙이는 방법
- 8. 자주 묻는 질문과 바로 적용할 권고안
- Q1. 작은 팀도 최소 권한 원칙을 꼭 해야 하나요?
- Q2. 읽기 전용 권한이면 안전한가요?
- Q3. 완벽한 최소 권한을 한 번에 만들 수 있나요?
[보안] 클라우드 IAM 보안 최소 권한 원칙 적용 체크리스트
클라우드 IAM 보안은 다들 중요하다고 말하죠. 문제는 운영 환경에 들어가는 순간부터입니다. 장애를 급하게 막으려고 AdministratorAccess 같은 넓은 권한을 붙여두고, 그 임시 조치가 몇 달씩 굳어지는 장면을 저는 정말 많이 봤습니다. 인프라와 보안 경계에서 오래 일하다 보면 사고는 화려한 제로데이보다 “원래 잠깐 열어둔 권한”에서 시작되는 경우가 더 많더라고요.
그래서 이 글은 원칙 설명보다 실제 점검 순서에 집중했습니다. AWS, GCP, Azure는 문법이 달라도 판단 기준은 거의 같습니다. 누가, 어떤 자원에, 어떤 경로와 조건으로, 얼마 동안 접근하는지 분해해서 보면 됩니다. 반대로 이 네 가지 중 하나라도 불명확하면, 그 권한은 나중에 운영 리스크나 감사 이슈로 돌아올 가능성이 높습니다.
이번 체크리스트는 특히 이런 분들께 맞춰 썼습니다.
- 권한이 과도한 건 알지만 어디서부터 줄여야 할지 막막한 팀
- 멀티 클라우드라 정책 문법보다 운영 기준이 먼저 필요한 팀
- 감사 대응, 사고 조사, 온콜 안정성까지 같이 고려해야 하는 운영자

멀티 클라우드 환경에서 사용자, 역할, 정책, 리소스가 어떻게 연결되는지 보여주는 개요 이미지입니다.
1. 클라우드 IAM 보안에서 최소 권한 원칙을 어떻게 해석할까
문장으로는 간단합니다. 업무에 필요한 액션만, 필요한 자원에만, 필요한 조건에서만, 필요한 시간 동안만 허용하는 겁니다. 그런데 현장에서는 이 네 축이 자주 섞입니다. 정책을 줄인다고 해놓고 액션만 줄이고 리소스 범위는 그대로 두거나, 사람 계정엔 MFA를 걸면서 워크로드 자격 증명은 장기 키로 방치하는 식이죠. 이 부분, 실제 운영 들어가면 생각보다 자주 꼬입니다.
제가 현장에서 가장 자주 보는 오해는 두 가지입니다.
- 오해 1: 읽기 전용이면 안전하다. 실제로는 읽기 권한만으로 시크릿, 인프라 구조, 고객 데이터 위치, 백업 경로가 드러날 수 있습니다.
- 오해 2: 정책 문서만 예쁘게 만들면 끝난다. 실제론 AssumeRole 경로, 리소스 정책, 조직 단위 제한, 세션 조건까지 함께 봐야 결과가 맞습니다.
저는 IAM을 볼 때 항상 아래 순서로 쪼개서 봅니다.
- Identity: 사람, 서비스, 배치, 외부 계정 중 누가 호출하나
- Permission: 정확히 어떤 API 액션이 필요한가
- Resource Scope: 어떤 계정, 프로젝트, 구독, 버킷, 키, 시크릿까지로 한정할 수 있나
- Condition: IP, VPC 엔드포인트, 태그, 시간, 디바이스, 세션 속성으로 더 줄일 수 있나
이 네 축을 따로 안 보면 왜 힘드냐면, 나중에 문제가 생겼을 때 원인을 분리하기가 어렵기 때문입니다. 예를 들어 S3 읽기 실패 하나만 봐도 실제 원인은 s3:GetObject 누락일 수도 있고, KMS 복호화 권한 부족일 수도 있고, VPC Endpoint 조건 불일치일 수도 있습니다. 겉으로는 모두 AccessDenied인데 근본 원인은 다릅니다.
2. 클라우드 IAM 보안 체크리스트 전에 먼저 정리할 것
정책부터 열어보면 대부분 다시 돌아오게 됩니다. 먼저 호출 주체와 자격 증명 경로부터 정리해야 합니다. 제가 새 환경을 인수받으면 보통 아래 다섯 가지를 제일 먼저 적어둡니다.
- 사람 계정과 워크로드 계정 분리: 사람은 SSO와 MFA 중심, 애플리케이션은 Role 또는 Service Account 중심으로 갑니다.
- 공유 계정 금지: 누가 무엇을 했는지 로그에서 바로 식별되지 않으면, 사고 조사 시간이 길어집니다.
- 장기 액세스 키 최소화: 가능하면 임시 자격 증명으로 바꾸고, 불가피한 장기 키는 소유자와 만료 관리 기준을 붙입니다.
- 권한 관리 역할 분리: 운영, 배포, 보안 감사, 비상 대응 권한을 한 주체에 합치지 않습니다.
- 태그/네이밍 기준 통일: 리소스 범위를 줄일 때 사람 기억이 아니라 규칙으로 묶기 위함입니다.
여기서 선택 기준도 분명해야 합니다. 예를 들어 소규모 팀이라고 해서 사람 계정에 장기 키를 허용하면 안 됩니다. 작은 팀일수록 한 사람이 여러 시스템을 만지기 때문에, 키 하나 노출됐을 때 파급 범위가 더 큽니다. 반대로 자동화 워크로드가 짧은 주기로 반복 호출되는 환경이라면, 권한을 지나치게 세분화해 운영자가 계속 예외를 붙이는 구조도 썩 좋지 않습니다. 이럴 땐 액션 최소화와 세션 기반 임시 자격 증명을 먼저 잡고, 리소스 세분화는 로그를 보며 단계적으로 줄이는 편이 낫습니다.
3. 실무용 클라우드 IAM 보안 체크리스트: 저는 이 순서로 봅니다
3-1. 아이덴티티 정리
- 퇴사자, 장기 미사용 계정, 테스트용 임시 계정이 아직 활성 상태인지 확인합니다.
- 서비스별 공용 계정이나 여러 앱이 하나의 서비스 계정을 공유하는지 봅니다.
- 관리자급 계정에 MFA가 강제되는지, 예외 계정이 남아 있지 않은지 확인합니다.
- 루트 계정 또는 테넌트 최고 권한 계정이 일상 업무에 쓰이지 않는지 확인합니다.
- 외부 위탁사, 협력사, 다른 계정에서 들어오는 접근이 있다면 신뢰 경로와 만료 시점을 따로 관리합니다.
3-2. 권한 범위 정리
- Action: *, Resource: *, 광범위한 built-in 관리자 역할이 남아 있는지 확인합니다.
- 읽기, 쓰기, 삭제, 권한 변경 액션이 한데 묶여 있지 않은지 봅니다.
- 서비스 전역 권한이 정말 필요한지, 리소스 단위로 줄일 수 있는지 확인합니다.
- 운영자에게 데이터 평문 조회 권한과 인프라 운영 권한이 같이 들어가 있지 않은지 분리합니다.
- 권한 상승이 가능한 액션, 예를 들면 역할 전달(pass role), 정책 수정, 키 복호화, 시크릿 조회를 별도로 취급합니다.
3-3. 조건 기반 접근 제어
- Source IP, VPC/프라이빗 엔드포인트, 관리 디바이스, Session Tag, Time 조건을 적용할 수 있는지 검토합니다.
- 프로덕션과 개발 환경을 태그, 프로젝트, 구독, 계정 단위로 분리합니다.
- 운영 콘솔 접근은 사람 계정만, API 호출은 워크로드 계정만 허용하도록 경계를 나눕니다.
- 긴급 권한은 승인 후 일정 시간만 유지되게 설계합니다.
3-4. 감사와 탐지
- AWS는 조직 단위 CloudTrail 또는 추적 대상 트레일, GCP는 Cloud Audit Logs, Azure는 Activity Log와 필요한 리소스 로그가 실제로 수집·보관되는지 확인합니다.
- 권한 변경 이벤트, 역할 가정 실패, 비정상 지역 로그인, 장기 키 사용에 대한 경보가 있는지 봅니다.
- 정책 시뮬레이션, 액세스 리뷰, 사용 이력 점검이 정기 작업으로 돌아가는지 확인합니다.
- 로그가 중앙 저장되고 변경 불가능한 보존 정책으로 관리되는지 점검합니다.
3-5. 비밀정보와 자격 증명
- 액세스 키가 코드 저장소, CI 변수, 운영 문서에 흩어져 있지 않은지 확인합니다.
- 시크릿은 Secret Manager, Key Vault, Parameter Store 같은 전용 저장소에 넣습니다.
- 키 로테이션 기준, 소유자, 사용 중인 애플리케이션 매핑이 있는지 봅니다.
- 서비스 계정 토큰, OIDC 연동, 워크로드 아이덴티티를 사용할 수 있는데도 정적 자격 증명을 유지 중인지 확인합니다.
| 점검 항목 | 이럴 땐 A | 저럴 땐 B | 제가 권하는 기준 |
|---|---|---|---|
| 사람 계정 인증 | SSO + MFA | 로컬 IAM 사용자 + 장기 키 | 사람이 직접 쓰는 계정은 가능하면 SSO로 통일합니다. 키 발급이 필요하면 예외 사유를 남깁니다. |
| 워크로드 인증 | Role/Service Account/OIDC | 정적 액세스 키 | 클라우드 내부 워크로드는 임시 자격 증명이 기본입니다. 정적 키는 외부 시스템 연동처럼 대안이 없을 때만 씁니다. |
| 권한 설계 시작점 | 최근 사용 이력 기반 축소 | 처음부터 수작업으로 완전 최소화 | 운영 서비스는 관찰 후 축소가 덜 위험합니다. 신규 서비스는 작은 정책으로 시작하는 편이 낫습니다. |
| 긴급 운영 권한 | 승인 기반 일시 상승 | 상시 관리자 권한 부여 | 온콜 대응 때문에 넓은 권한이 필요해도 만료 시간 없는 상시 권한은 피합니다. |
| 감사 대응 | 로그 중앙화 + 변경 경보 | 필요할 때 콘솔에서 수동 조회 | 감사 대응이 잦은 팀일수록 증적 수집 자동화가 운영 비용을 줄입니다. |
4. 실전 구현: AWS 기준으로 클라우드 IAM 보안 최소 권한 줄여보기
AWS를 예시로 드는 이유는 CLI와 시뮬레이션 도구가 좋아서 점검 흐름을 설명하기 편하기 때문입니다. 다만 여기서 보여드릴 판단 방식은 GCP IAM과 Azure RBAC에도 그대로 옮길 수 있습니다. 핵심은 정책 문서를 보기 전에 실제 사용 흔적을 먼저 확인하는 겁니다. 이 순서, 해보면 꽤 편합니다.
4-1. 현재 권한 사용 흔적부터 봅니다
운영 중인 역할을 줄일 때 제가 제일 경계하는 실수는 문서상으로만 불필요해 보이는 권한을 바로 삭제하는 것입니다. 숨은 배치, 장애 복구 스크립트, 월말 작업, 사람이 잘 모르는 서브시스템이 뒤에서 쓰는 경우가 꽤 많습니다. 그래서 최근 접근 서비스부터 뽑아봅니다.
aws iam generate-service-last-accessed-details \
--arn arn:aws:iam::123456789012:role/app-role
aws iam get-service-last-accessed-details \
--job-id JOB_ID_FROM_PREVIOUS_COMMAND
이 결과는 이렇게 해석하시면 됩니다.
- 최근 사용 흔적이 전혀 없는 서비스 권한은 우선 제거 후보입니다.
- 업무상 필요한데 사용 흔적이 없다면 분석 기간, 호출 경로, 다른 역할을 통한 우회 접근 여부를 다시 확인합니다.
- 서비스 사용 흔적이 있다고 해서 그 서비스의 모든 액션이 필요한 건 아닙니다. 서비스 단위에서 액션 단위로 한 번 더 줄여야 합니다.
여기서 한 가지 실무 팁이 있습니다. 마지막 접근 서비스 목록은 시작점이지 증거의 끝이 아닙니다. 실제 호출이 드문 월간 배치나 재해복구 작업은 이 목록만으로 놓칠 수 있습니다. 그래서 저는 이 데이터를 보고 바로 삭제하지 않고, CloudTrail에서 해당 역할 이름이나 세션 발급자 정보를 함께 확인합니다.
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=Username,AttributeValue=app-role \
--max-results 50
CloudTrail 조회 결과를 볼 때는 단순 성공 이벤트만 보지 마시고, AccessDenied, AssumeRole, KMS, Secrets Manager, STS 관련 호출이 이어지는지도 같이 보세요. 필요하면 이벤트 JSON의 sessionIssuer 나 userIdentity 필드까지 내려가서 확인하는 편이 더 정확합니다. 애플리케이션 입장에선 “S3 읽기” 한 번인데, 실제 IAM 평가는 그 뒤에 여러 서비스 의존성을 타고 들어가거든요.
4-2. 정책은 작게 시작하되, 의존 권한을 같이 봅니다
예를 들어 애플리케이션이 특정 버킷 객체 읽기만 필요하다면 아래처럼 시작할 수 있습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadOnlySpecificBucketObjects",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::example-app-bucket/*"
},
{
"Sid": "ListSpecificBucket",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::example-app-bucket"
}
]
}
이 부분에서 많이 헷갈리는 게 s3:GetObject 와 s3:ListBucket 의 리소스 범위가 다르다는 점입니다. 전자는 객체 ARN, 후자는 버킷 ARN을 대상으로 평가됩니다. 여기서 잘못 묶으면 정책은 멀쩡해 보여도 런타임에서 바로 실패합니다.
그리고 실제 운영에선 이것만으로 끝나지 않는 경우가 많습니다. 버킷 객체가 KMS로 암호화돼 있다면 아래처럼 키 복호화 권한도 같이 필요할 수 있습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowDecryptForAppKey",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": "arn:aws:kms:ap-northeast-2:123456789012:key/11111111-2222-3333-4444-555555555555"
}
]
}
여기서 중요한 판단 포인트는 이겁니다. 문제가 발생했다고 필요한 액션만 하나씩 덧붙이면 정책은 금방 다시 비대해집니다. 호출 체인 전체를 보고, 어떤 서비스 의존 때문에 추가 권한이 필요한지 메모를 남겨야 나중에 리뷰가 가능합니다. 저는 정책 옆에 “왜 필요한가”를 코드 주석이나 변경 티켓에 꼭 남기는 편입니다. 이거 진짜 나중에 큰 차이를 만들더라고요.

광범위한 권한에서 특정 버킷과 특정 액션으로 줄여가는 정책 설계 흐름을 보여주는 이미지입니다.
4-3. 시뮬레이션으로 미리 검증합니다
aws iam simulate-principal-policy \
--policy-source-arn arn:aws:iam::123456789012:role/app-role \
--action-names s3:ListBucket s3:GetObject s3:DeleteObject kms:Decrypt \
--resource-arns arn:aws:s3:::example-app-bucket arn:aws:s3:::example-app-bucket/test.txt arn:aws:kms:ap-northeast-2:123456789012:key/11111111-2222-3333-4444-555555555555
이 명령은 반영 전에 실패 가능성을 줄이는 데 정말 유용합니다. 결과를 볼 때는 아래 기준으로 해석하시면 됩니다.
- 정상 업무에 필요한 액션은 allowed 여야 합니다.
- 삭제, 권한 수정, 리소스 파괴 같은 불필요 액션은 implicitDeny 또는 explicitDeny 상태가 나와야 합니다.
- 예상과 다를 경우, 주체 정책만 보지 말고 리소스 정책, SCP, Permission Boundary, Session Policy 를 같이 봐야 합니다.
시뮬레이션의 한계도 알아두셔야 합니다. 실제 서비스 호출은 컨텍스트 키, 세션 태그, 조직 정책, 리소스 상태에 영향을 받습니다. AWS 공식 문서도 시뮬레이터 결과와 실제 환경 결과가 다를 수 있다고 안내합니다. 그래서 저는 시뮬레이션을 배포 전 1차 필터로 쓰고, 최종 확인은 실제 스테이징 경로 테스트로 합니다.
4-4. 조건을 붙일 수 있으면 권한보다 먼저 붙입니다
경험상 운영 리스크를 빨리 낮추는 방법은 액션 수를 줄이는 것만이 아닙니다. 같은 권한이라도 어디서, 어떤 세션으로 쓰게 할지 제한하면 즉시 공격 면적이 줄어듭니다. 예를 들어 특정 네트워크 경로에서만 버킷 읽기를 허용하는 식입니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowReadFromSpecificVpce",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::example-app-bucket/*",
"Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-0123456789abcdef0"
}
}
}
]
}
다만 이런 조건 정책은 운영 편의성과 충돌할 수 있습니다. 새 네트워크 경로가 추가되거나 배포 아키텍처가 바뀌면 예전엔 되던 호출이 갑자기 막힐 수 있거든요. 그래서 제 기준은 이렇습니다.
- 호출 경로가 고정적인 내부 서비스라면 네트워크 또는 프라이빗 엔드포인트 조건을 적극 사용합니다.
- 사람이 여러 위치에서 접속하는 운영 계정이라면 IP 고정보다 SSO, MFA, 승인 기반 상승 권한이 더 현실적입니다.
- 빠르게 변하는 워크로드에는 지나치게 촘촘한 조건보다 임시 자격 증명과 짧은 세션 시간이 더 안정적일 수 있습니다.
4-5. 다른 클라우드도 같은 방식으로 봅니다
gcloud projects get-iam-policy PROJECT_ID --format=json
az role assignment list --all --assignee PRINCIPAL_ID
GCP에서는 프로젝트나 폴더 단위 정책을 먼저 보고, 어떤 서비스 계정이 어떤 역할을 받았는지 확인합니다. Azure에서는 주체 기준으로 Role Assignment를 먼저 뽑아보는 편이 파악이 빠릅니다. 다만 여기서도 핵심은 출력 자체가 아닙니다. 팀에서 허용하는 역할 목록과 예외 승인 기준이 있어야 비교가 됩니다. 기준표 없이 JSON과 목록만 쌓아두면, 결국 사람이 콘솔을 오래 들여다보는 방식으로 돌아갑니다.
5. 제가 자주 겪었던 트러블슈팅 포인트
문서만 보면 단순해 보이는데, 실제로 시간을 많이 잡아먹는 구간은 따로 있습니다. 아래는 제가 특히 자주 겪었던 실패 패턴입니다.
5-1. 서비스가 갑자기 AccessDenied를 뿜는 경우
가장 흔한 원인은 숨은 의존 권한입니다. 앱은 S3를 읽는다고 알고 있었는데 실제론 KMS 복호화가 필요하고, Lambda가 다른 서비스 호출을 이어가고, 대상 리소스 정책까지 통과해야 하는 경우가 많습니다. 이런 케이스, 한 번 걸리면 시간 꽤 씁니다.
- S3 객체가 KMS로 암호화돼 있으면 kms:Decrypt 필요 여부를 확인합니다.
- Lambda, ECS, GKE, AKS 같은 실행 환경은 실행 주체 역할과 대상 리소스 정책을 함께 봅니다.
- 교차 계정 접근이라면 Trust Policy 와 대상 리소스 정책 중 하나만 맞아도 안 됩니다. 둘 다 맞아야 합니다.
- 세션 태그나 조건 키를 썼다면, 런타임 세션에 실제로 그 값이 들어오는지도 확인해야 합니다.
이럴 때 제가 안 하는 방식이 하나 있습니다. 에러 메시지에 나온 액션을 바로 허용하는 식의 에러 따라 권한 추가입니다. 그 방식은 빠르지만 정책이 점점 누더기가 됩니다. 저는 호출 체인을 먼저 적고, 누구의 어떤 세션이 어느 리소스 정책과 충돌했는지부터 봅니다.
5-2. 사람 계정은 되는데 배치만 실패하는 경우
이건 대부분 AssumeRole 경로 또는 토큰 수명 문제입니다. 콘솔에서 사람이 직접 테스트하면 되는데, 배치에서는 실패하는 경우가 그렇습니다. 사람은 더 넓은 권한을 가진 상위 계정으로 들어왔고, 배치는 제한된 역할이나 짧은 세션 토큰으로 실행되는 경우가 많습니다.
특히 다음을 같이 보셔야 합니다.
- 배치가 실제로 어떤 역할을 가정하는지
- 세션 시간이 작업 길이보다 짧지 않은지
- OIDC 또는 외부 ID 연동 시 토큰 클레임 조건이 바뀌지 않았는지
- 리소스 정책이 사람 계정 ARN만 허용하고 워크로드 주체는 빠져 있지 않은지
한 번은 운영자가 콘솔에서 테스트할 땐 정상인데 새벽 배치만 계속 실패한 적이 있었습니다. 원인은 정책이 아니라, 배치가 가정한 역할 세션에 붙는 태그 값이 조건과 맞지 않았던 경우였습니다. 이게 왜 중요하냐면, 권한 문서만 보면 정상이기 때문에 담당자가 한참 헤매게 됩니다.
5-3. 와일드카드를 못 줄이겠다고 느껴질 때
처음부터 액션 단위 완전 최소화를 목표로 잡으면 오히려 운영이 꼬일 수 있습니다. 저는 아래 순서가 가장 덜 아팠습니다.
- 서비스 범위를 줄입니다.
- 리소스 범위를 특정합니다.
- 읽기, 쓰기, 삭제, 권한 변경을 분리합니다.
- 마지막에 조건을 붙입니다.
이 순서가 좋은 이유는 실패 원인을 추적하기 쉽기 때문입니다. 액션과 조건을 한 번에 너무 많이 손대면, 나중에 왜 막혔는지 되짚기가 어려워집니다. 운영 안정성이 중요한 서비스라면 더더욱 단계적으로 줄이시는 게 낫습니다.

정책, 리소스 정책, 권한 경계, 조직 정책을 순서대로 확인하는 문제 해결 흐름을 설명하는 이미지입니다.
6. 클라우드 IAM 보안 적용 후 검증 기준
최소 권한 적용은 정책 저장 버튼으로 끝나지 않습니다. 운영에서는 정상 경로가 유지되는지, 원치 않는 경로가 실제로 막히는지, 문제가 생겼을 때 원인을 빨리 찾을 수 있는지까지 확인해야 의미가 있습니다. 저는 보통 아래 네 가지를 필수로 봅니다.
- 정상 업무 경로 테스트: 로그인, 배포, 백업, 배치, 모니터링, 장애 대응 스크립트까지 포함합니다.
- 불필요 액션 차단 확인: 삭제, 권한 수정, 광범위 조회, 시크릿 읽기 같은 액션이 막히는지 봅니다.
- 감사 로그 확인: 누가 어떤 자격 증명으로 어떤 API를 호출했는지 로그에서 재구성 가능한지 확인합니다.
- 재현 문서화: 왜 이 권한이 필요한지 티켓, 저장소 문서, IaC 리뷰 기록에 남깁니다.
결과 해석 기준도 구체적이어야 합니다.
- 정상 시나리오에서 애플리케이션이 기대한 API 호출을 끝까지 수행하면 1차 통과입니다.
- 운영자가 실수로 삭제 API를 호출해도 거부된다면 잘 줄인 겁니다.
- 권한 오류가 났는데 어떤 정책에서 막혔는지 바로 추적되지 않으면 감사 설계가 부족한 겁니다.
- 새 리소스가 생길 때마다 관리자 권한을 임시 부여해야만 일이 굴러가면 역할 설계가 아직 거친 상태입니다.
여기서 선택이 갈립니다. 변경 속도가 아주 빠른 팀은 처음부터 완벽한 최소 권한보다 검증 자동화부터 붙이는 편이 낫습니다. 반대로 감사 대응이 잦고 권한 오남용 리스크가 큰 팀은 로그 중앙화와 권한 변경 경보를 먼저 강화해야 합니다. 둘 다 중요하지만, 팀 상황에 따라 선후가 달라져야 합니다.
7. 체크리스트를 운영 프로세스에 붙이는 방법
문서만 있어서는 잘 굴러가지 않습니다. 실제로 살아남는 체크리스트는 변경 프로세스에 붙어 있습니다. 제가 팀에 넣는 기본 규칙은 아래와 같습니다.
- 새 애플리케이션 온보딩 시 IAM 리뷰를 필수 단계로 넣습니다.
- 월 1회 또는 분기 1회 액세스 리뷰 일정을 고정합니다.
- Terraform, CloudFormation, Bicep 같은 IaC 변경에는 정책 diff 리뷰를 붙입니다.
- 긴급 권한은 승인 기반으로 올리고, 만료 시간 후 자동 회수되게 설계합니다.
- 콘솔 핫픽스가 발생하면 같은 변경을 코드에 반영하기 전까지 작업 완료로 보지 않습니다.
이 구간에서 흔한 실패 모드는 드리프트입니다. 급해서 콘솔에서 권한을 바로 붙이고, 나중에 IaC에 반영하지 않아 선언 상태와 실제 상태가 갈라지는 경우죠. 그러면 다음 배포 때 권한이 다시 사라지거나, 반대로 이유를 모르는 예외가 계속 남습니다. 운영자가 지치는 이유가 바로 이런 보이지 않는 차이입니다.
그래서 저는 권한 변경 요청이 들어오면 항상 둘 중 하나를 고르게 합니다.
- 지금 당장 서비스 복구가 우선: 승인된 임시 권한을 짧게 올리고, 사후에 반드시 코드 반영과 회고를 합니다.
- 긴급하지 않다: 먼저 사용 이력과 시뮬레이션으로 필요한 범위를 정리한 뒤 코드로 반영합니다.
속도와 통제를 둘 다 잡으려면, 예외를 없애는 게 아니라 예외가 오래 남지 않게 만드는 구조가 필요합니다.
권한 변경 프로세스를 더 다듬고 싶다면 클라우드 보안 체크리스트나 AWS CloudTrail 운영 가이드도 같이 보세요. 이런 문서를 내부 표준과 묶어두면 리뷰 속도가 훨씬 빨라집니다.
8. 자주 묻는 질문과 바로 적용할 권고안
Q1. 작은 팀도 최소 권한 원칙을 꼭 해야 하나요?
네. 오히려 작은 팀일수록 한 사람이 배포, 운영, 개발, 장애 대응을 다 맡으면서 권한이 빠르게 커집니다. 초반에 기준이 없으면 나중에 줄이는 비용이 훨씬 큽니다. 작은 팀이라면 완벽함보다 SSO + MFA, 공유 계정 금지, 워크로드 임시 자격 증명 이 세 가지부터 잡으시면 됩니다.
Q2. 읽기 전용 권한이면 안전한가요?
그렇지 않습니다. 읽기 권한만으로도 시크릿, 환경 변수, 저장소 위치, 네트워크 구성, 고객 데이터 메타데이터가 노출될 수 있습니다. 읽기 전용도 리소스 범위와 조건을 줄여야 합니다. 제가 운영자 권한을 나눌 때도 인프라 읽기 와 민감 데이터 읽기 는 같은 범주로 취급하지 않습니다.
Q3. 완벽한 최소 권한을 한 번에 만들 수 있나요?
현실적으로 어렵습니다. 대신 관찰 → 축소 → 시뮬레이션 → 배포 → 검증 루프를 돌리면 안정적으로 다듬어집니다. 신규 서비스는 작게 시작하고, 기존 서비스는 사용 흔적을 본 뒤 줄이는 쪽이 실패 확률이 낮습니다.
| 상황 | 추천 접근 | 이유 |
|---|---|---|
| 초기 구축 단계 | 사람 계정과 워크로드 계정 분리부터 시작 | 초기에 경계를 잘 그어두면 이후 권한 확장이 느려집니다. |
| 운영 중 권한이 과도함 | 최근 사용 이력 + 정책 시뮬레이션 우선 | 실제 영향 범위를 보면서 줄여야 장애 가능성을 낮출 수 있습니다. |
| 멀티 클라우드 환경 | 공통 체크리스트를 두고 클라우드별 예외만 문서화 | 개념은 통일하고 문법 차이만 분리해야 운영이 단순해집니다. |
| 감사 대응이 잦음 | 로그 중앙화와 권한 변경 알림 자동화 우선 | 증적 수집 시간을 줄이고, 사고 조사 속도를 높일 수 있습니다. |
| 온콜 부담이 큰 팀 | 상시 관리자 권한 대신 승인 기반 임시 상승 권한 | 평시 공격 면적을 줄이면서도 비상 대응은 유지할 수 있습니다. |

광범위 권한 구조와 최소 권한 구조를 비교해 핵심 차이를 한눈에 보여주는 요약 이미지입니다.
제가 현장에서 내리는 권고는 꽤 분명합니다. 사람이 쓰는 계정이면 SSO와 MFA부터, 애플리케이션이면 역할 분리와 임시 자격 증명부터 시작하시면 됩니다. 이미 권한이 엉켜 있다면 관리자 권한을 한 번에 다 뜯지 마시고, 최근 사용 이력과 시뮬레이션을 바탕으로 서비스 범위부터 줄이세요. 반대로 운영 속도가 아주 중요하다면 처음부터 모든 액션을 잘게 쪼개기보다 읽기/쓰기/삭제 분리 와 권한 변경 액션 격리 부터 해도 효과가 큽니다.
어떤 팀에는 A가 맞고, 어떤 팀에는 B가 맞습니다. 변경이 잦고 실험이 많은 팀이라면 검증 자동화와 짧은 세션 자격 증명이 먼저고, 감사 대응과 데이터 민감도가 높은 팀이라면 로그 중앙화, 시크릿 접근 통제, 권한 변경 경보가 먼저입니다. 다만 공통적으로 피해야 할 건 하나입니다. 상시 넓은 권한을 임시라는 이름으로 방치하는 것. 이건 거의 항상 나중에 더 큰 비용으로 돌아옵니다.
다음 단계로 바로 옮기신다면, 오늘은 한 계정이나 한 역할만 골라서 해보시면 됩니다. 최근 사용 이력을 보고, 불필요한 서비스 하나만 제거 후보로 올리고, 시뮬레이션까지 돌려보세요. 그 한 번의 루프를 돌려보면 팀 환경에서 어디가 가장 위험한지 생각보다 빨리 드러납니다.
![[Cloud] 클라우드 IAM 보안 체크리스트: 최소 권한 원칙 적용 가이드](https://blog.pswq.net/wp-content/uploads/2026/08/cloud-iam-least-privilege-security-checklist-thumbnail.jpg)