my-bucket 접근을 특정 사무실 IP에서만 허용한다. 회사 네트워크에서만 S3에 접근 가능하도록 제한하는 패턴이다.
IAM 사용자/그룹에 권한 부여 데모
데모 절차:
AWS 웹 관리 콘솔 접속
IAM 사용자와 IAM 그룹을 생성
IAM 사용자를 IAM 그룹에 연결
IAM 정책 (S3FullAccess 권한)을 생성한 그룹에 연결
생성한 사용자로 로그인하여 권한 적용 확인
📸 [스크린샷: 무 권한 IAM 유저 생성 및 S3 생성 불가]
📸 [스크린샷: 사용자 그룹 생성 및 AmazonS3FullAccess 정책 연결]
📸 [스크린샷: 해당 사용자로 로그인 후 S3 접근 성공 확인]
📸 [스크린샷: 해당 사용자로 EC2 접근 시 권한 거부 화면]
💡 실습 중 느낀 점
사용자에게 직접 정책을 붙이는 것보다 그룹에 정책을 붙이고 사용자를 그룹에 추가하는 방식이 관리가 훨씬 편하다. 사용자가 10명만 넘어도 개별 관리는 비현실적이다.
S3FullAccess를 그룹에 연결한 후 해당 사용자로 로그인하면, S3는 정상적으로 접근되지만 EC2 콘솔에 들어가면 권한 오류가 뜬다. Allow된 것만 되고, 나머지는 전부 Implicit Deny라는 걸 직접 확인할 수 있었다.
정책의 JSON을 직접 작성하지 않아도 AWS에서 기본 제공하는 Managed Policy가 수백 개 있다. AmazonS3FullAccess, AmazonEC2ReadOnlyAccess 같은 이름이 직관적이라 처음에는 이걸 활용하고, 세밀한 제어가 필요할 때 Custom Policy를 작성하면 된다.
ARN 형식에서 S3는 리전과 계정 ID가 비어 있다 (arn:aws:s3:::my-bucket). S3가 글로벌 서비스이기 때문이다. 반면 EC2는 리전과 계정 ID가 모두 포함된다. 서비스마다 ARN 패턴이 다르므로 공식 문서를 참고해야 한다.
5. IAM 역할(Role)과 임시 권한
IAM 역할이란?
IAM 역할(Role)은 AWS 리소스에 접근할 수 있는 임시 권한을 부여하는 신원(Identity)이다. IAM 사용자처럼 정책(Policy)을 통해 권한을 부여받지만, 고유한 로그인 자격 증명(비밀번호 등)은 없다. 대신 다른 주체가 수임(Assume)하여 사용한다.
IAM 역할을 왜 사용하는가?
임시 권한 제공: 보안성을 높이기 위해 액세스 키 없이 단기적으로 권한 부여
서비스 간 접근 허용: EC2 → S3, Lambda → DynamoDB처럼 AWS 서비스 간 안전한 연동
연동 사용자(외부 계정, SSO 등)에게 권한 위임 가능
IAM 역할 수임 가능 주체
IAM 사용자 (임시 권한 부여)
다른 AWS 계정의 사용자 (Cross-Account Access)
연동 사용자 (외부 계정, Facebook 로그인, Apple ID 로그인, SSO 등)
AWS 서비스 (EC2, Lambda 등)
IAM 역할 수임 예
IAM 사용자에 임시 권한 부여 (단기 작업자)
상황: A팀 개발자가 일주일 동안 B팀의 특정 S3 버킷만 접근해야 한다. 방법: 해당 개발자 User에 Role Assume 권한 부여 → 기간 만료 후 자동 차단. 최소 권한 + 만료 기한 설정으로 보안을 강화한다.
Cross-Account Access (계정 간 접근)
상황: 계정 A에 있는 사용자 → 계정 B의 S3 버킷에 접근해야 한다. 방법: 계정 B에서 Role 생성 + Trust Policy에 계정 A를 신뢰 주체로 설정 → 계정 A 사용자가 sts:AssumeRole API 호출 → 임시 자격증명으로 계정 B의 자원에 접근한다. 여러 계정을 운영하는 조직에서 자주 쓰이는 패턴이다.
Federated Access (기업 SSO 연동)
상황: 회사 직원이 회사의 SSO 계정으로 AWS에 접근한다. 방법: SAML/OIDC 기반으로 IAM Role을 Assume → 임시 AWS 콘솔 접근 권한 획득. 사내 계정과 연동해서 편리하게 AWS 리소스에 접근한다.
서비스의 역할 수임 — EC2에서 S3 접근
상황: 애플리케이션 서버(EC2)가 S3에 로그 파일을 저장해야 한다. 잘못된 방법: EC2에 Access Key/Secret Key를 하드코딩 → 보안사고 위험. 올바른 방법:
IAM Role을 만들고 AmazonS3FullAccess(또는 ReadOnly) 정책 연결
EC2 인스턴스 실행 시 해당 Role 부여
EC2 안에서 AWS CLI 실행 → aws s3 ls (정상 동작)
서비스의 역할 수임 — Lambda에서 DynamoDB 접근
상황: Lambda 함수에서 DynamoDB 테이블 조회/갱신이 필요하다. 방법: Lambda에 IAM Role 연결 → AmazonDynamoDBFullAccess 부여. 코드에 키를 넣지 않고도 DynamoDB 작업이 가능하다.
IAM 역할 수임 데모
데모 절차:
IAM 역할(Role) 생성
역할에 정책 부여
IAM 사용자에 역할 수임 권한 부여
사용자 로그인 및 역할 수임 (콘솔에서 수동 수임)
권한 적용 확인
수임된 역할에서 원래 사용자로 돌아가기
📸 [스크린샷: IAM Role 생성 — 신뢰할 수 있는 엔터티 유형 선택]
📸 [스크린샷: Role에 정책 연결]
📸 [스크린샷: 사용자 역할 전환]
📸 [스크린샷: 역할 수임 후 EC2 생성 및 S3 생성 불가 확인]
EC2 역할 모자가 씌워졌기 때문에 원래의 S3 접근 권한은 없어진다
📸 [스크린샷: 원래 사용자로 돌아가기]
💡 실습 중 느낀 점
콘솔에서 역할을 수임(Switch Role)하면 상단 배너 색상이 바뀌면서 현재 어떤 역할을 수임 중인지 표시된다. 누가 어떤 역할로 작업 중인지 시각적으로 바로 확인할 수 있어서 실수를 줄일 수 있다.
Role에는 Trust Policy(신뢰 정책)와 Permission Policy(권한 정책) 두 가지가 있다. Trust Policy는 "누가 이 역할을 수임할 수 있는가"를 정의하고, Permission Policy는 "이 역할이 무엇을 할 수 있는가"를 정의한다. 둘 다 설정해야 정상 동작한다.
EC2에 Role을 부여하면 인스턴스 메타데이터 서비스(IMDS)를 통해 임시 자격증명이 자동으로 갱신된다. 코드에 키를 하드코딩할 필요가 없으므로 서비스 간 접근은 무조건 Role을 사용하는 것이 best practice다.
IAM 사용자에게 직접 S3 권한을 주는 것과 Role을 통해 임시로 S3 권한을 받는 것의 차이: 전자는 영구적 권한, 후자는 임시 권한(만료 시간 존재)이다. 보안 관점에서는 후자가 훨씬 안전하다.
학습 정리
IAM은 AWS 보안 관리의 핵심으로, 사용자별로 세밀한 접근 제어가 가능하다
사용자와 그룹 구조를 통해 효율적으로 권한을 분리하고 관리할 수 있다
IAM 정책은 JSON 형식으로 구성되며, Effect + Action + Resource 조합으로 리소스 단위의 접근 제어를 설정한다
정책 평가 순서: 명시적 거부 > 명시적 허용 > 묵시적 거부
임시 권한은 IAM 역할을 활용하는 것을 권장한다
IAM 역할 수임은 IAM 사용자, AWS 서비스, 연동 사용자 등이 가능하다
서비스 간 접근(EC2→S3, Lambda→DynamoDB)은 액세스 키 대신 반드시 Role을 사용한다