본문 바로가기
Cloud/AWS

AWS Identity and Access Management (IAM)

by wrynn 2022. 7. 25.

AWS IAM 이란?

 AWS Identity and Access Management (IAM)은 AWS 리소스에 대한 접근을 제어하는 웹 서비스입니다. 하나의 Linux 운영체제에 여러 사용자가 존재할 수 있는 것처럼, 하나의 AWS 계정 내에서도 용도에 따라 여러 사용자가 존재할 수 있습니다. IAM은 이런 사용자를 생성하고 적절한 권한을 갖도록 관리하는 도구입니다. 

 

용어

IAM Resources (리소스)
 AWS에서 리소스는 특정 서비스 내에 존재하는 객체를 말합니다.[1] IAM 리소스는 IAM 서비스 내에 존재하는 객체로 그 종류에는 사용자, 그룹, 역할, 정책 및 자격 증명 공급자가 있습니다. 

IAM Identities (자격 증명)
 IAM 자격 증명은 사용자를 식별하고 그룹화 하는데 사용되는 IAM 리소스를 부르는 말로, IAM 리소스 중 사용자, 그룹, 역할이 이에 해당합니다. 자격 증명에 정책(권한을 명시한 JSON 형태의 문서)을 연결하여 해당 자격 증명이 사용할 수 있는 AWS 서비스를 정의할 수 있습니다.

IAM Entities (엔터티)
 IAM 엔터티는 AWS가 인증에 사용하는 IAM 리소스입니다. IAM 사용자 및 역할을 포함합니다.

Principals (보안 주체)
 보안 주체는 AWS 루트 사용자 또는 IAM 엔터티(IAM 사용자 또는 IAM 역할)를 사용하여 AWS에 로그인하고 요청을 생성하는 사람 또는 애플리케이션입니다. 보안 주체에는 페더레이션 사용자(federated users) 및 수임된 역할(assumed roles)을 포함합니다. 

 

IAM의 동작 방식

 웹 콘솔을 통한 사용자의 요청이든 애플리케이션의 API 호출 요청이든 요청의 형태와는 상관 없이 AWS 서비스에 대한 접근 절차는 다음과 같은 절차로 이루어집니다.

요청 전송
 보안 주체가 AWS에 요청 전송을 시도합니다. 콘솔에서 EC2 인스턴스 목록을 조회하거나 AWS CLI에서 aws ec2 describe-instances 명령을 실행하는 경우가 이에 해당합니다. 요청 내용에는 누가 요청을 했고, 어떤 리소스에 대한 요청이며, 그 리소스에 무엇을 하려고 하는지와 같은 정보가 포함되어 있습니다. 

인증
 보안 주체가 AWS에 요청을 보내기 전에, 먼저 자격 증명을 사용하여 인증을 받아야 합니다. 콘솔이라면 ID와 비밀번호로 로그인하여 인증 절차를 통과할 수 있습니다. API 혹은 AWS CLI를 사용하는 경우 액세스 키와 시크릿 액세스 키 정보로 인증을 수행합니다. AWS의 일부 서비스는 이 인증 단계를 건너뛸 수 있습니다.

인가 
 정상적으로 인증을 수행했다면, 이번에는 인증된 자격 증명이 요청을 수행할 권한이 있는지를 확인합니다. AWS는 요청을 보고 어떤 정책이 필요한지를 먼저 확인합니다. 그 다음 정책 평가 로직을 수행하여 요청을 보낸 자격 증명에 적절한 권한이 부여(정책 연결)되어 있는지를 확인한 후 요청을 허용할지 거부할지를 판단합니다.[2

실행
 AWS는 각 리소스마다 수행할 수 있는 작업을 미리 정의해두고, 이를 서비스 형태로 제공합니다. 인증 및 인가 단계를 통과한 요청은 이러한 서비스를 호출하여 요청을 수행하게 됩니다.

 IAM의 동작 방식을 그림으로 나타내면 다음과 같습니다.[3]

 

사용자

루트 사용자
 AWS 계정을 처음 생성하면 AWS에 로그인할 수 있는 계정이 생성됩니다. 이 계정은 루트 사용자 자격 증명이라는 특별한 자격 증명을 가지는데, 이 자격 증명은 모든 AWS 리소스에 대해 제한 없이 완전한 접근이 가능합니다. 이러한 특성 때문에 AWS에서는 일상적인 업무에서는 루트 사용자 계정을 사용하지 않는 것을 권하고 있습니다.[4

IAM 사용자
 최소 권한의 원칙을 적용하여 보안을 강화하고 사용자의 작업 실수를 예방하기 위해 루트 사용자 계정 대신 IAM 사용자 계정을 사용할 수 있습니다. IAM 사용자는 하나의 AWS 계정 내에 포함되는 사용자로 각 IAM 사용자는 고유의 자격 증명을 가지며 서로 다른 권한을 가질 수 있습니다. IAM 사용자를 사용하는 주체는 사람 뿐만 아니라 AWS 리소스에 접근하는 애플리케이션일 수도 있습니다. 

페더레이션 사용자 
 이미 조직 내부에서 사용하고 있는 사용자 인증 시스템이 있다면 별도의 IAM 계정을 생성할 필요 없이 AWS IAM과 연동하여 사용할 수 있습니다. 기존 인증 시스템이에 로그인한 정보를 바탕으로 임시 Credential을 발급받아 사용하는 형태로 동작합니다.[5]

 

 

정책과 권한 부여

 정책은 접근 권한을 명시한 JSON 형태의 문서로, IAM 자격 증명이나 AWS 리소스와 연결지어 사용합니다. 다음은 사용자가 us-east-2 리전 내의 123456789012 계정에서 Books 테이블의 모든 Amazon DynamoDB 작업(dynamodb:*)을 수행할 수 있도록 허용하는 정책을 JSON 형태로 나타낸 것입니다.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "dynamodb:*",
    "Resource": "arn:aws:dynamodb:us-east-2:123456789012:table/Books"
  }
}

 이렇게 작성한 정책을 IAM 사용자, 그룹 혹은 역할과 연결하여 IAM 자격 증명이 수행할 수 있는 서비스를 제한하거나 허용할 수 있습니다. 

계정과 정책
 엔터프라이즈 환경에서는 1개 계정만 사용하기보다 여러 AWS 계정을 사용하는 경우가 많습니다. 정책은 각 계정마다 별도로 존재하기 때문에, 계정이 여러개로 나누어 진 경우에는 정책을 관리하기가 더욱 어려워집니다. 이런 경우 AWS Organizations 서비스를 사용하여 정책 뿐만 아니라 다양한 공통 리소스를 한 곳에서 관리할 수 있습니다. 

IAM 사용자와 정책 
 IAM 사용자는 생성 직후에는 어떠한 서비스에도 접근할 수 없으며, IAM 사용자 혹은 사용자가 속한 그룹에 정책을 연결하여 필요한 권한을 부여한 다음 사용합니다. 명시적으로 허용되지 않은 요청은 기본적으로 모두 거부됩니다.

그룹과 정책 
 IAM 사용자마다 개별로 정책을 연결하는 것보다 그룹을 만들고 그 그룹에 정책을 연결하여 그룹 내에 속한 모든 사용자에 대한 정책을 관리할 수 있습니다. 이 경우 각 사용자는 서로 다른 별도의 자격 증명을 갖고 있지만, 그룹과 연결된 정책에 명시된 권한이 그룹 내 모든 사용자에게 부여됩니다.

페더레이션 사용자와 역할
 
페더레이션 사용자는 IAM 사용자처럼 영구적으로 사용할 수 있는 자격 증명이 부여되지 않습니다. 대신 역할(Role)이라고 하는 임시 자격 증명을 사용합니다. 페더레이션 사용자가 AWS에 로그인하면 사용자에게 부여된 역할과 연결되고 역할에 정의된 권한이 부여됩니다. 역할의 권한은 IAM 사용자와 마찬가지로 정책을 연결하여 구성합니다.

자격 증명 기반 / 리소스 기반 정책
 
정책은 요청을 하는 IAM 자격 증명과 연결하는 자격 증명 기반 정책과 요청 대상이 되는 AWS 리소스와 연결되는 리소스 기반 정책 두가지로 나눌 수 있습니다. 위에서 살펴본 예제는 자격 증명 기반 정책입니다. 자격 증명 기반 정책은 다시 AWS 혹은 사용자에 의해 정의되어 다수의 IAM 자격 증명에 공통으로 부여할 수 있는 관리형 정책과 특정한 하나의 IAM 리소스에만 적용되는 일회성 정책인 인라인 정책으로 나뉘어집니다.

 리소스 기반 정책은 관리형 정책이 없고 인라인 정책만 존재합니다.[6] 리소스 기반 정책은 Amazon S3, SQS, SNS 등 일부 서비스에서만 적용 가능합니다.

 

역할

 역할은 특정 권한을 가진 IAM 자격 증명입니다. 역할과 IAM 사용자 모두 정책과 연결하여 사용하는 AWS 자격 증명이라는 점에서는 유사합니다. 하지만 역할은 한 사람과만 연관되지 않고 해당 역할이 필요한 사람이라면 누구든지 수임 받을 수 있습니다. 또한 역할에는 그와 연관된 암호 또는 액세스 키와 같은 표준 장기 자격 증명이 없습니다. 대신에 역할을 맡은 사람에게는 해당 역할 세션을 위한 임시 보안 자격 증명이 제공됩니다.

 역할은 한 AWS 계정에서 다른 AWS 계정의 역할을 수임하여 서비스에 접근하거나, 페더레이션 사용자가 기존 인증 시스템에서 인증받은 후 역할을 수임하여 AWS 리소스에 접근하는 방식으로 주로 사용합니다. 다른 계정의 역할을 수임받기 위해서는 접근하려는 계정의 AWS Security Token Service (STS) API에 접근이 가능하도록 sts:AssumeRole 에 대한 허용 정책이 필요합니다.

 


참고자료

[1] https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-resources

[2] https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html

[3] https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html

[4] https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_identity-management.html#intro-identity-first-time-access

[5] https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_identity-management.html#intro-identity-federation

[6] https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_access-management.html

댓글