coredot.today
AWS IAM 완전 정복: '누가, 무엇을, 어디서 할 수 있는가'를 결정하는 기술
블로그로 돌아가기
IAMAWS보안인증인가정책역할제로트러스트

AWS IAM 완전 정복: '누가, 무엇을, 어디서 할 수 있는가'를 결정하는 기술

AWS에서 발생하는 보안 사고의 대부분은 IAM 설정 실수다. '최소 권한 원칙'이 왜 중요하고, 사용자·역할·정책이 어떻게 작동하며, GitHub에 노출된 IAM 키가 어떤 참사를 불러오는지 — 클라우드 보안의 기반인 IAM을 실전 사례와 함께 풀어본다.

코어닷투데이2026-03-0527

들어가며: "모든 것에 Admin 권한을 주면 편하잖아?"

AWS를 처음 배우는 개발자에게 가장 흔한 유혹:

"IAM이 복잡하니까, 일단 모든 서비스에 AdministratorAccess를 주자. 나중에 줄이면 되잖아."

이것은 집의 모든 방에 같은 마스터키를 쓰고, 그 키를 현관 앞에 놓아두는 것과 같다. 편리하다. 누구나 어디든 갈 수 있다. 그리고 어느 날, 그 키가 유출되면 — 모든 것이 끝난다.

81% 클라우드 보안 사고의 원인 IAM 설정 오류 (Ermetic 2023)
99% 과도한 권한을 가진 클라우드 ID 실제 필요한 것의 수백 배 (Palo Alto 2024)
4분 노출된 AWS 키가 악용되기까지 자동화된 봇이 GitHub 스캔 (Truffle Security)

IAM은 AWS에서 가장 중요한 서비스다. EC2가 없으면 서버를 못 쓰고, S3가 없으면 파일을 못 저장하지만, IAM이 없으면 어떤 서비스도 안전하게 쓸 수 없다. 그리고 IAM을 잘못 설정하면, 다른 모든 보안이 무너진다.


1. IAM이란 무엇인가

정의

IAM(Identity and Access Management)은 AWS 리소스에 대한 접근을 안전하게 제어하는 서비스다. **"누가(Identity), 무엇을(Action), 어디에(Resource) 할 수 있는가(Allow/Deny)"**를 정의한다.

건물 보안 비유

IAM 개념건물 비유역할
AWS 계정건물 전체모든 리소스의 최상위 컨테이너
루트 사용자건물주 (마스터키 보유)모든 권한. 절대 일상 업무에 쓰지 말 것
IAM 사용자직원 (개인 출입증)개인별 자격증명 (ID/비밀번호, 액세스 키)
IAM 그룹부서같은 권한이 필요한 사용자 묶음
IAM 역할(Role)임시 출입증 (반납 필요)서비스나 사용자가 일시적으로 착용하는 권한
IAM 정책(Policy)출입 규칙서"이 출입증으로 어떤 방에 갈 수 있는가"
MFA지문 인식 (2차 인증)비밀번호 외에 추가 인증 수단

IAM의 세 가지 질문

모든 AWS API 호출에서 IAM은 세 가지를 확인한다:

1. 인증 (Authentication): "너 누구야?"
↓ 자격증명 확인 (액세스 키, 토큰, 비밀번호)
2. 인가 (Authorization): "너 이거 할 수 있어?"
↓ 정책 평가 (Allow? Deny?)
3. 허용 또는 거부

2. IAM의 역사: 왜 이렇게 복잡해졌나

초기 AWS: 단순했던 시절

2006년 AWS 출시 초기에는 AWS 계정 하나에 루트 자격증명 하나만 있었다. 팀원이 10명이면 모두 같은 루트 계정으로 로그인했다. 누가 뭘 했는지 추적 불가능.

2010년: IAM 출시

AWS가 IAM을 출시하며 개별 사용자, 그룹, 정책 개념을 도입했다. 팀원마다 별도 사용자를 만들고, 각자 필요한 권한만 부여할 수 있게 됐다.

2012~2015년: 역할(Role)의 시대

EC2 인스턴스가 S3에 접근해야 할 때, 과거에는 인스턴스 안에 액세스 키를 파일로 저장했다. 이것은 보안 재앙의 씨앗이었다 — 그 파일이 유출되면 끝이다.

IAM 역할(Role) 이 이 문제를 해결했다. EC2에 역할을 부여하면, 인스턴스가 자동으로 임시 자격증명을 받아 AWS 서비스에 접근한다. 키 파일이 필요 없다.

2006
AWS 출시: 루트 계정만 존재
한 계정 = 한 자격증명. 팀 전체가 공유
2010
IAM 출시: 사용자, 그룹, 정책
개인별 자격증명과 세밀한 권한 제어가 가능해짐
2012
IAM 역할(Role) 도입
서비스에 임시 자격증명을 자동 부여. 키 파일 불필요
2017
IAM 정책 조건(Condition) 강화
"MFA 인증 시에만", "특정 IP에서만", "특정 시간에만" 등 세밀한 조건 제어
2022
IAM Identity Center (구 AWS SSO)
멀티 계정 환경에서 중앙 집중 ID 관리. SAML/OIDC 연동
2024~
제로 트러스트 시대
IAM Access Analyzer, Verified Access, 최소 권한 자동 추천

3. IAM의 핵심 구성 요소

사용자(User) vs 역할(Role): 가장 중요한 차이

IAM 사용자 (User)
사람에게 부여
장기 자격증명 (비밀번호, 액세스 키)
키를 직접 관리·회전해야 함
유출 시 수동으로 무효화해야 함
AWS 콘솔 로그인 가능
비유: 직원 사원증 (항상 소지)
IAM 역할 (Role)
서비스, 앱, 외부 사용자에게 부여
임시 자격증명 (자동 만료, 자동 갱신)
키 관리 불필요
자격증명이 자동으로 만료됨
"역할을 맡는다(assume)" 방식
비유: 임시 출입증 (시간 지나면 만료)
황금 규칙: 코드에서 AWS에 접근할 때는 항상 IAM 역할을 사용하라. EC2 → 인스턴스 역할, Lambda → 실행 역할, ECS → 태스크 역할. 액세스 키를 코드에 하드코딩하거나 환경변수에 넣는 것은 보안 사고의 지름길이다.

정책(Policy): 권한의 설계도

IAM 정책은 JSON으로 작성되며, **"누가, 무엇을, 어디에, 어떤 조건에서 할 수 있는가"**를 정의한다.

hljs language-json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::my-bucket/uploads/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "203.0.113.0/24"
        }
      }
    }
  ]
}

이 정책의 의미: "my-bucket의 uploads/ 경로에 대해 읽기·쓰기를 허용하되, 203.0.113.0/24 IP 대역에서만 가능."

AWS 관리형 정책 vs 커스텀 정책

AWS 관리형 정책커스텀 정책
생성AWS가 미리 만들어 놓음직접 작성
업데이트AWS가 자동 업데이트직접 관리
예시AmazonS3ReadOnlyAccess, AmazonEC2FullAccess위의 JSON 같은 세밀한 정책
장점빠른 시작, 모범 사례 반영최소 권한에 정확히 맞출 수 있음
단점필요 이상의 권한이 포함될 수 있음작성·관리에 시간 소요
⚠️
"FullAccess" 정책의 함정: AmazonS3FullAccess는 계정 내 모든 S3 버킷의 모든 작업을 허용한다. 하나의 Lambda 함수가 하나의 버킷만 읽으면 되는데, 모든 버킷을 삭제할 수 있는 권한까지 주는 것이다. 가능하면 커스텀 정책으로 필요한 버킷, 필요한 작업만 허용하라.

4. IAM 보안 사고: 키 유출의 공포

GitHub에 AWS 키가 올라가면 벌어지는 일

가장 흔하고 가장 치명적인 IAM 보안 사고: AWS 액세스 키가 GitHub에 커밋되는 것.

개발자가 코드에 AWS_ACCESS_KEY를 하드코딩
git commit → git push (실수로 퍼블릭 레포)
↓ 4분 이내
자동화된 봇이 GitHub 전체를 스캔하여 AWS 키 발견
수 분 내에 EC2 인스턴스 수백 대 생성 (암호화폐 채굴)
다음 날 AWS 청구서: $10,000~$100,000+

이것은 가상 시나리오가 아니다. 매일 수천 건 발생하고 있다.

실제 사고 사례

2014
Code Spaces: 회사가 사라짐
소스코드 호스팅 서비스. AWS 콘솔 접근권을 탈취한 공격자가 모든 데이터, 백업, 리소스를 삭제. 회사가 폐업. MFA가 설정되어 있지 않았다
2019
Capital One: 과도한 IAM 역할 권한
WAF EC2의 IAM 역할에 S3 전체 접근 권한이 있었음. SSRF로 역할의 임시 자격증명 탈취 → 1.06억 명 데이터 유출
2022
Uber: MFA 피로 공격
공격자가 탈취한 비밀번호로 MFA 인증 요청을 수백 번 반복 전송. 직원이 실수로 승인하여 내부 시스템 전체 접근
2023~
GitHub/GitLab에서 키 유출 지속
GitGuardian 보고서: 2023년에 GitHub에서 1,200만 건의 시크릿(비밀번호, API 키, 토큰) 노출 발견. AWS 키가 가장 많은 비중
🔒
Code Spaces 사고의 교훈: 한 회사가 IAM 실수로 폐업했다. 이보다 강력한 경고는 없다. (1) 루트 계정에 MFA 필수, (2) 루트 계정은 일상 업무에 절대 사용 금지, (3) 모든 IAM 사용자에 MFA 강제, (4) 최소 권한 원칙 적용.

5. 최소 권한 원칙 (Principle of Least Privilege)

정의

"각 주체(사용자, 역할, 서비스)에게 업무 수행에 필요한 최소한의 권한만 부여한다."

NIST(미국 국립표준기술연구소)의 제로 트러스트 아키텍처(SP 800-207)에서 핵심 원칙으로 정의하고 있다.

현실에서 적용하기

나쁜 예:

hljs language-json
{
  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": "*"
}

→ 모든 S3 버킷의 모든 작업 허용. Capital One 사고의 원인.

좋은 예:

hljs language-json
{
  "Effect": "Allow",
  "Action": ["s3:GetObject"],
  "Resource": "arn:aws:s3:::my-app-uploads/*"
}

→ 특정 버킷의 읽기만 허용. 이 키가 유출되어도 피해가 제한적.

IAM Access Analyzer: 최소 권한을 자동으로

수동으로 최소 권한 정책을 작성하는 것은 어렵다. AWS는 이를 돕는 도구를 제공한다:

  • IAM Access Analyzer: 외부에서 접근 가능한 리소스를 자동 감지
  • 정책 생성 도우미: CloudTrail 로그를 분석하여 실제 사용된 권한만으로 정책 자동 생성
  • 미사용 권한 탐지: 90일 이상 사용하지 않은 권한을 식별하여 제거 추천
실전 워크플로우: (1) 처음에는 넓은 관리형 정책으로 시작, (2) 30~90일 동안 실제 사용 패턴을 CloudTrail로 수집, (3) IAM Access Analyzer의 정책 생성 도우미로 실제 사용된 권한만으로 커스텀 정책 자동 생성, (4) 넓은 정책을 커스텀 정책으로 교체. 이것이 "최소 권한을 점진적으로 적용"하는 가장 현실적인 방법이다.

6. IAM 실전 모범 사례

절대 하지 말아야 할 것 5가지

번호하지 마라왜?
1루트 계정으로 일상 업무루트 = 모든 권한. 탈취 시 회사가 사라질 수 있음
2코드에 액세스 키 하드코딩GitHub에 올라가면 4분 안에 악용됨
3IAM 사용자 간 키 공유누가 뭘 했는지 추적 불가능
4MFA 없이 콘솔 접근비밀번호만으로는 불충분
5* 리소스에 * 액션 허용최소 권한 원칙 완전 위반

반드시 해야 할 것 5가지

번호해야 한다방법
1루트 계정 MFA 활성화물리 보안 키(YubiKey) 권장
2IAM 역할 사용 (서비스)EC2, Lambda, ECS → 역할 부여
3정기적 자격증명 회전90일마다 액세스 키 교체
4CloudTrail 활성화모든 API 호출 로깅
5IAM Access Analyzer 활성화외부 접근 가능 리소스 자동 감지

7. IAM vs 다른 ID 관리 시스템

클라우드별 IAM 비교

AWS IAMAzure AD (Entra ID)Google Cloud IAM
인증IAM 사용자, 역할, FederationAzure AD (기업 디렉토리)Google 계정, 서비스 계정
세분화리소스 ARN 수준RBAC + ABAC리소스 수준
멀티 계정IAM Identity Center, OrganizationsAzure AD 테넌트프로젝트/폴더
MFATOTP, 보안 키, PassKeyMS Authenticator, FIDO2Google Authenticator, 보안 키
SSOSAML, OIDC 연동네이티브 SSOGoogle Workspace SSO
강점세밀한 정책 제어엔터프라이즈 ID 관리간결한 구조

Cognito vs IAM: 헷갈리기 쉬운 두 가지

IAMCognito
대상개발자, 서비스, 관리자앱의 최종 사용자 (고객)
용도AWS 리소스 접근 제어앱 로그인/회원가입
인증 방식액세스 키, 역할, 콘솔이메일/비밀번호, 소셜 로그인, MFA
비유회사 사원증앱의 로그인 화면
💡
간단한 구분: "AWS 리소스를 관리하는 사람/서비스"의 권한 → IAM. "내가 만든 앱에 로그인하는 고객"의 인증 → Cognito. 둘은 완전히 다른 서비스다.

8. IAM의 진화: 제로 트러스트로

전통적 보안 vs 제로 트러스트

전통적 보안 (경계 보안)
"내부 네트워크 안은 안전하다"
방화벽 안쪽은 신뢰
한번 인증하면 자유롭게 이동
비유: 성벽 안은 안전
제로 트러스트
"아무도 신뢰하지 않는다"
내부든 외부든 항상 검증
매 요청마다 인증+인가 확인
비유: 매 방문마다 신분증 확인

NIST SP 800-207 "Zero Trust Architecture"(2020)이 제로 트러스트를 공식 프레임워크로 정의한 이후, AWS도 IAM을 제로 트러스트 방향으로 강화하고 있다:

  • IAM Roles Anywhere: 온프레미스 서버에도 IAM 역할의 임시 자격증명 발급
  • Verified Access: VPN 없이 제로 트러스트 기반 앱 접근
  • IAM Identity Center: 중앙 집중 SSO + 세밀한 권한 관리

9. 실제 사례

Netflix: IAM 역할 기반 마이크로서비스

Netflix는 수천 개의 마이크로서비스에 각각 전용 IAM 역할을 부여한다. 추천 서비스는 추천 DB만 접근 가능, 결제 서비스는 결제 API만 호출 가능. 한 서비스가 침해되어도 다른 서비스의 데이터에는 접근 불가.

Airbnb: CloudTrail + 자동 감지

Airbnb는 CloudTrail 로그를 실시간 분석하여 비정상적 IAM 활동(새벽에 관리자 로그인, 알 수 없는 리전에서 API 호출, 대량의 리소스 생성)을 자동 감지하고 알림한다.

한국 기업 사례

  • 토스: 금융 서비스의 엄격한 IAM. 모든 IAM 변경에 승인 워크플로우 적용. CloudTrail로 전체 감사
  • 쿠팡: 마이크로서비스별 IAM 역할 격리. IRSA로 K8s Pod 수준의 AWS 접근 제어
  • 카카오뱅크: IAM Identity Center로 멀티 계정 중앙 관리. 금융 규제 준수를 위한 권한 분리

마치며: IAM은 클라우드의 "면역 체계"다

이 시리즈의 모든 서비스는 IAM 위에서 동작한다:

서비스IAM과의 관계
EC2인스턴스 역할로 AWS 서비스 접근
Lambda실행 역할(execution role)로 DynamoDB, S3 등 접근
ECS태스크 역할로 컨테이너에 권한 부여
S3버킷 정책 + IAM 정책으로 접근 제어
RDSIAM 인증으로 DB 접속
BedrockIAM으로 어떤 모델을 누가 호출할 수 있는지 제어
API GatewayLambda Authorizer 또는 IAM 인증
CloudWatchIAM으로 로그·메트릭 접근 제어

IAM이 무너지면 이 모든 것이 무너진다. VPC가 네트워크의 기반이라면, IAM은 접근 제어의 기반이다. 두 가지 모두 보이지 않지만, 없으면 모든 것이 위험하다.

Code Spaces는 IAM 실수로 회사가 사라졌다. Capital One은 IAM 과도 권한으로 1억 명의 데이터가 유출됐다. 이 교훈은 분명하다: IAM은 "나중에" 신경 쓸 것이 아니라, "가장 먼저" 제대로 설정해야 할 것이다.

코어닷투데이의 모든 AWS 서비스는 최소 권한 원칙 위에 구축되어 있다. AI 추론 서비스는 Bedrock 호출 권한만, 데이터 파이프라인은 지정된 S3 버킷 접근만, 모니터링은 CloudWatch 읽기 권한만 — 각 서비스가 자기 일에 필요한 최소한의 열쇠만 가지고 있다. 그것이 "잠이 올 수 있는" 보안의 시작이다.