IAM은 어떻게 동작할까요?

IAM은 어떻게 동작할까요?

AWS Identity and Access Management(IAM)는 AWS 계정의 인증(authentication)과 승인(authorization)을 제어하는 데 필요한 인프라를 제공해요. 먼저 휴먼 사용자나 애플리케이션이 로그인 자격 증명으로 AWS에 인증하고, IAM이 그 자격 증명을 계정이 신뢰하는 프린시펄(principal: IAM 사용자, AWS STS 페더레이션 사용자 프린시펄, IAM 역할 또는 애플리케이션)과 대조해 인증한 뒤 리소스 접근을 승인해요. 이번 글에서는 요청의 구성 요소, 인증·승인 과정, 정책 평가 논리를 차근차근 살펴볼게요.

출처: 문서

본문

요청의 구성 요소 (Components of a request)

프린시펄이 AWS Management Console, AWS API, 또는 AWS CLI를 사용하려고 하면 AWS에 요청(request) 을 보내요. 요청에는 다음 정보가 포함돼요.

  • 액션 또는 작업 (Actions or operations) – 프린시펄이 수행하려는 작업으로, 예를 들어 AWS Management Console의 액션이나 AWS CLI·AWS API의 작업이에요.
  • 리소스 (Resources) – 프린시펄이 액션 또는 작업을 수행하려고 요청하는 AWS 리소스 객체예요.
  • 프린시펄 (Principal) – 엔터티(사용자 또는 역할)를 사용해 요청을 보낸 사람이나 애플리케이션이에요. 프린시펄에 대한 정보에는 권한 정책이 포함돼요.
  • 환경 데이터 (Environment data) – IP 주소, 사용자 에이전트, SSL 활성 상태, 타임스탬프에 대한 정보예요.
  • 리소스 데이터 (Resource data) – 요청된 리소스와 관련된 데이터로, 예를 들어 DynamoDB 테이블 이름이나 Amazon EC2 인스턴스의 태그예요.

AWS는 요청 정보를 요청 컨텍스트(request context) 로 모으고, IAM이 이 컨텍스트를 평가해 요청을 승인해요.

프린시펄이 인증되는 방식 (How principals are authenticated)

프린시펄은 자격 증명으로 AWS에 로그인하고, IAM이 이를 인증해 AWS에 요청을 보낼 수 있게 해 줘요. Amazon S3와 AWS STS 같은 일부 서비스는 익명 사용자의 특정 요청을 허용하기도 하지만, 그건 예외에요. 각 사용자 유형은 인증을 거쳐요.

  • 루트 사용자 (Root user) – 인증에 사용하는 로그인 자격 증명은 AWS 계정을 만들 때 사용한 이메일 주소와 그때 지정한 비밀번호예요.
  • 페더레이션 프린시펄 (Federated principal) – 자격 증명 공급자가 사용자를 인증하고 자격 증명을 AWS에 전달하므로 AWS에 직접 로그인할 필요가 없어요. IAM Identity Center와 IAM 모두 자격 증명 페더레이션을 지원해요.
  • AWS IAM Identity Center 디렉터리의 사용자(페더레이션이 아님) – IAM Identity Center 기본 디렉터리에 직접 만든 사용자는 AWS 액세스 포털로 로그인해 사용자 이름과 비밀번호를 제공해요.
  • IAM 사용자 (IAM user) – 계정 ID(또는 별칭), 사용자 이름, 비밀번호를 제공해 로그인해요. API나 AWS CLI에서 워크로드를 인증할 때는 역할 맡기를 통한 임시 자격 증명을 쓰거나, 액세스 키와 시크릿 키를 제공하는 장기 자격 증명을 쓸 수 있어요.

IAM 엔터티에 대해 더 알아보려면 IAM 사용자와 IAM 역할을 참고하세요.

AWS는 계정의 보안을 높이기 위해 모든 사용자와 다중 인증(MFA)을 사용할 것을 권장해요. MFA에 대한 자세한 내용은 IAM의 AWS 다중 인증을 참고하세요.

승인과 권한 정책 기본 (Authorization and permission policy basics)

승인(Authorization)은 프린시펄이 요청을 완료하는 데 필요한 권한을 갖고 있다는 뜻이에요. 승인 중에 IAM은 요청 컨텍스트의 값을 사용해 요청에 적용되는 정책을 식별하고, 그 정책으로 요청 허용 여부를 결정해요. IAM은 대부분의 권한 정책을 프린시펄 엔터티의 권한을 지정하는 JSON 문서로 저장해요.

승인 요청에 영향을 줄 수 있는 여러 유형의 정책이 있어요. 계정의 AWS 리소스에 접근할 권한을 사용자에게 주려면 자격 증명 기반 정책을 사용할 수 있고, 리소스 기반 정책은 계정 간 접근을 허용할 수 있어요. 다른 계정에서 요청하려면 그 계정의 정책이 리소스에 대한 접근을 허용해야 하며, 동시에 요청에 사용하는 IAM 엔터티가 요청을 허용하는 자격 증명 기반 정책을 가져야 해요.

IAM은 요청 컨텍스트에 적용되는 각 정책을 확인해요. IAM 정책 평가는 명시적 거부(explicit deny) 를 사용하는데, 단 하나의 권한 정책이라도 거부된 액션을 포함하면 IAM은 전체 요청을 거부하고 평가를 중단해요. 요청은 기본적으로 거부 되므로, IAM이 요청을 승인하려면 적용되는 권한 정책이 요청의 모든 부분을 허용해야 해요. 단일 계정 내 요청의 평가 논리는 다음 기본 규칙을 따라요.

  1. 기본적으로 모든 요청은 거부돼요. (일반적으로 AWS 계정 루트 사용자 자격 증명으로 계정 내 리소스에 만든 요청은 항상 허용돼요.)
  2. 어떤 권한 정책(자격 증명 기반 또는 리소스 기반)에서든 명시적 허용(explicit allow)은 이 기본값을 덮어써요.
  3. AWS Organizations의 서비스 제어 정책(SCP)이나 리소스 제어 정책(RCP), IAM 권한 경계, 또는 세션 정책이 존재하면 허용을 덮어써요. 이 정책 유형이 하나라도 있으면 모두 요청을 허용해야 해요. 그렇지 않으면 암시적으로 거부돼요. SCP·RCP에 대한 자세한 내용은 _AWS Organizations 사용자 가이드_의 AWS Organizations의 승인 정책을 참고하세요.
  4. 어떤 정책에서든 명시적 거부는 어떤 정책의 허용보다 우선해요.

자세한 내용은 정책 평가 논리를 참고하세요.

IAM이 프린시펄을 인증하고 승인한 뒤에는, 프린시펄에 적용되는 권한 정책을 평가해 요청의 액션·작업을 승인해요. 각 AWS 서비스는 지원하는 액션(작업)을 정의하며, 리소스 보기·생성·편집·삭제 같은 작업이 포함돼요. 프린시펄에 적용되는 권한 정책은 작업을 수행하는 데 필요한 액션을 포함해야 해요. 권한 정책 평가 방식에 대한 자세한 내용은 정책 평가 논리를 참고하세요.

서비스는 프린시펄이 각 리소스에서 수행할 수 있는 액션 집합을 정의해요. 권한 정책을 만들 때는 사용자가 수행할 수 있길 원하는 액션을 꼭 포함하세요. 예를 들어 IAM은 사용자 리소스에 대해 40개 이상의 액션을 지원하며, 다음 기본 액션을 포함해요.

CreateUser
DeleteUser
GetUser
UpdateUser

또한 권한 정책에 조건(condition)을 지정해 요청이 특정 조건을 충족할 때만 리소스에 접근할 수 있게 할 수 있어요. 예를 들어 정책 문이 특정 날짜 이후에 효력을 갖게 하거나, API에 특정 값이 나타날 때 접근을 제어할 수 있어요. 조건을 지정하려면 정책 문의 Condition 요소를 사용해요.

IAM이 요청의 작업을 승인하면 프린시펄은 계정의 관련 리소스를 다룰 수 있어요. 리소스는 서비스 안에 존재하는 객체로, 예를 들어 Amazon EC2 인스턴스, IAM 사용자, Amazon S3 버킷이 있어요. 프린시펄이 권한 정책에 포함되지 않은 리소스에 액션을 수행하도록 요청하면 서비스는 요청을 거부해요. 예를 들어 IAM 역할 삭제 권한이 있는데 IAM 그룹 삭제를 요청하면, IAM 그룹 삭제 권한이 없다면 요청은 실패해요. 각 AWS 서비스가 지원하는 액션·리소스·조건 키에 대한 자세한 내용은 AWS 서비스용 액션, 리소스, 조건 키를 참고하세요.

더 알아보기 (Learn more)