서론

얼마전 실무에서 CloudFront 에 Lambda@Edge, S3를 연동하여 S3 -> CloudFront 응답을 트리거로 설정한 람다가 실행되어 이미지 리사이징을 처리한 경험이 있었다.

당시 가장 어려웠던 점이 서비스 연동을 위한 권한 설정이었기에, 정리해보고자 한다.


IAM

IAM(Identity and Access Management): AWS 리소스에 대한 액세스를 제어할 수 있는 서비스

주요 개념

  • 유저: 개별 ID
  • 그룹: 유저 모음
  • 정책: 권한 설명서
  • 역할: 임시가면

정책 (Policy)

  • 무엇을 할 수 있는가가 적힌 JSON 문서 (예: S3 읽기 가능)
  • 종류: Managed vs Inline
    • AWS Managed Policy: AWS가 미리 만들어둔 정책 (예: AdministratorAccess). 여러 명에게 재사용 가능.
    • Inline Policy: 특정 사용자/역할에 붙여둔 정책. 삭제하면 같이 사라짐.
  • 정책을 붙일 수 있는곳 = 자격증명
    • IAM 유저, IAM 그룹, IAM 역할
    • IAM 유저에게 정책을 부여하는법
      • 유저에게 정책을 직접 붙인다 (=인라인)
      • 역할에 정책을 붙인 다음 유저가 정책을 assume(추측하다 보다는 책임을 맡다, 특정한 모습을 취하다의 뉘앙스)하도록 함: 권장!

역할 (Role)

  • 그런데 역할이라는 개념이 굳이 왜 필요할까?
    • AWS 서비스(EC2, Lambda 등)에도 정책을 붙이고 싶은데, 이들은 자격증명에 해당하지 않으므로 정책을 직접 붙일 수 없음
    • 계정 간 이동: 다리 역할 (Cross-Account)
    • 재사용성: 여러 정책을 묶어서 하나의 단위처럼 관리 가능
  •  구성 요소
    • Trust Policy(신뢰 정책)
      • 생성 시 설정 
      • 이 역할을 사용하는 것을 허용하는 주체(=principal)
        • IAM 유저, IAM 역할(역할 Chaining 가능), AWS 서비스
    • Permission Policy(권한 정책)
      • 역할(Role) 생성 후 붙임
      • 이 역할을 통해 할 수 있는 작업
        • 예: s3 객체 get/put 등
// 신뢰정책 예
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "edgelambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
// 권한 정책 예
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

예시

서비스 A가 B에 접근하기 위해 할 일

1. IAM 역할 생성 - 신뢰정책에 A 포함, 권한 정책에 B 포함 

2. A 에 IAM 역할 연결

3. (선택- 보안 강화) B 의 리소스기반 정책에 생성한 역할의 ARN을 추가함

 

 


참고

  • 최소권한정책
    • 서비스는 기본적으로 다른 서비스에 대해 아무 권한도 가지고 있지 않으며, 명시적으로 권한을 부여해야 함
기본적으로 모든 요청을 거부합니다. (일반적으로, AWS 계정 루트 사용자 증명을 사용하여 해당 계정의 리소스를 요청하는 경우는 항상 허용됩니다.)권한 정책(자격 증명 기반 또는 리소스 기반)에 포함된 명시적 허용은 이 기본 작동을 재정의합니다. 
  • ARN(Amazon Resource Name)
    • AWS 리소스를 식별
Amazon 리소스 이름(ARN)은 AWS 리소스를 고유하게 식별합니다. IAM 정책, Amazon Relational Database Service(RDS) 태그 및 API 호출과 같은 모든 AWS에서 리소스를 명료하게 지정해야 하는 경우 ARN이 필요합니다. [링크]

 

출처

https://docs.aws.amazon.com/

+ Recent posts