IAM 역할로 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한 부여
IAM 역할로 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한 부여 (Use an IAM role to grant permissions to applications running on Amazon EC2 instances)
Amazon EC2 인스턴스에서 실행되는 애플리케이션은 AWS API 요청에 AWS 자격 증명을 포함해야 해요. 개발자들이 AWS 자격 증명을 Amazon EC2 인스턴스 안에 직접 저장하고, 그 인스턴스의 애플리케이션이 그 자격 증명을 사용하도록 할 수도 있어요. 하지만 그러면 개발자들이 자격 증명을 관리하고, 각 인스턴스에 안전하게 전달하고, 자격 증명을 갱신할 때 각 Amazon EC2 인스턴스를 업데이트해야 해요. 이건 많은 추가 작업이에요.
출처: 문서
본문
대신 Amazon EC2 인스턴스에서 실행되는 애플리케이션용 임시 자격 증명을 관리하는 데 IAM 역할을 사용할 수 있고 사용해야 해요. 역할을 사용하면 장기 자격 증명(로그인 자격 증명이나 접근 키 같은)을 Amazon EC2 인스턴스에 배포할 필요가 없어요. 대신 역할이 애플리케이션이 다른 AWS 리소스에 호출할 때 사용할 수 있는 임시 권한을 제공해요. Amazon EC2 인스턴스를 시작할 때 인스턴스와 연결할 IAM 역할을 지정해요. 인스턴스에서 실행되는 애플리케이션은 역할이 제공한 임시 자격 증명으로 API 요청을 서명할 수 있어요.
역할로 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한을 부여하려면 약간의 추가 구성이 필요해요. Amazon EC2 인스턴스에서 실행되는 애플리케이션은 가상화된 운영 체제에 의해 AWS에서 추상화돼요. 이 추가 분리 때문에 AWS 역할과 그 연관 권한을 Amazon EC2 인스턴스에 할당하고 그 애플리케이션에 제공하려면 추가 단계가 필요해요. 이 추가 단계가 인스턴스에 연결된 인스턴스 프로필(instance profile) 생성이에요. 인스턴스 프로필은 역할을 포함하며, 인스턴스에서 실행되는 애플리케이션에 역할의 임시 자격 증명을 제공할 수 있어요. 그 임시 자격 증명은 애플리케이션의 API 호출에서 역할이 지정한 리소스에만 접근을 제한하는 데 사용될 수 있어요.
참고
한 번에 Amazon EC2 인스턴스에는 하나의 역할만 할당할 수 있고, 인스턴스의 모든 애플리케이션이 같은 역할과 권한을 공유해요. Amazon ECS로 Amazon EC2 인스턴스를 관리한다면, 실행 중인 Amazon EC2 인스턴스의 역할과 구분할 수 있는 Amazon ECS 태스크에 역할을 할당할 수 있어요. 각 태스크에 역할을 할당하면 최소 권한 접근 원칙에 부합하며 작업과 리소스에 대한 더 세분화된 제어가 가능해요.
자세한 내용은 Amazon Elastic Container Service 모범 사례 가이드의 Amazon ECS 태스크와 IAM 역할 사용을 참고하세요.
이런 식으로 역할을 사용하면 여러 이점이 있어요. 역할 자격 증명은 임시적이고 자동으로 갱신되므로 자격 증명을 관리할 필요가 없고 장기 보안 위험을 걱정하지 않아도 돼요. 또한 여러 인스턴스에 단일 역할을 사용한다면 그 역할 하나만 변경하면 그 변경이 모든 인스턴스에 자동으로 전파돼요.
참고
역할은 보통 Amazon EC2 인스턴스를 시작할 때 할당되지만, 현재 실행 중인 Amazon EC2 인스턴스에도 역할을 연결할 수 있어요. 실행 중인 인스턴스에 역할을 연결하는 방법은 Amazon EC2용 IAM 역할을 참고하세요.
다루는 주제
- Amazon EC2 인스턴스용 역할은 어떻게 동작하나요?
- Amazon EC2와 역할 사용에 필요한 권한
- 어떻게 시작하나요?
- 관련 정보
Amazon EC2 인스턴스용 역할은 어떻게 동작하나요?
다음 그림에서 개발자가 amzn-s3-demo-bucket-photos라는 S3 버킷에 접근해야 하는 애플리케이션을 Amazon EC2 인스턴스에서 실행해요. 관리자가 Get-pics 서비스 역할을 만들고 Amazon EC2 인스턴스에 연결해요. 역할은 지정된 S3 버킷에 읽기 전용 접근을 부여하는 권한 정책을 포함해요. 또한 Amazon EC2 인스턴스가 역할을 수임하고 임시 자격 증명을 검색하도록 허용하는 트러스트 정책도 포함해요. 애플리케이션이 인스턴스에서 실행되면 역할의 임시 자격 증명으로 photos 버킷에 접근할 수 있어요. 관리자는 개발자에게 photos 버킷 접근 권한을 부여할 필요가 없고, 개발자는 자격 증명을 공유하거나 관리할 필요가 없어요.
- 관리자는 IAM으로
Get-pics역할을 만들어요. 역할의 트러스트 정책에서 관리자는 Amazon EC2 인스턴스만 역할을 수임할 수 있다고 지정해요. 역할의 권한 정책에서 관리자는amzn-s3-demo-bucket-photos버킷에 대한 읽기 전용 권한을 지정해요. - 개발자가 Amazon EC2 인스턴스를 시작하고 그 인스턴스에
Get-pics역할을 할당해요.
참고
IAM 콘솔을 사용하면 인스턴스 프로필이 자동으로 관리되며 대부분 우리에게 투명해요. 하지만 AWS CLI나 API로 역할과 Amazon EC2 인스턴스를 만들고 관리한다면, 인스턴스 프로필을 만들고 그 프로필에 역할을 할당하는 것을 별도의 단계로 해야 해요. 그런 다음 인스턴스를 시작할 때 역할 이름 대신 인스턴스 프로필 이름을 지정해야 해요.
- 애플리케이션이 실행되면, 인스턴스 메타데이터에서 보안 자격 증명 검색에 설명된 대로 Amazon EC2 인스턴스 메타데이터에서 임시 보안 자격 증명을 얻어요. 이것들은 역할을 나타내는 임시 보안 자격 증명이며 제한된 시간 동안 유효해요.
- 일부 AWS SDK에서는 개발자가 임시 보안 자격 증명을 투명하게 관리하는 프로바이더를 사용할 수 있어요. (개별 AWS SDK의 문서는 그 SDK가 자격 증명 관리에 지원하는 기능을 설명해요.)
- 또는 애플리케이션이 Amazon EC2 인스턴스의 인스턴스 메타데이터에서 직접 임시 자격 증명을 얻을 수도 있어요. 자격 증명과 관련 값은 메타데이터의
iam/security-credentials/role-name카테고리(이 경우iam/security-credentials/Get-pics)에서 사용할 수 있어요. 애플리케이션이 인스턴스 메타데이터에서 자격 증명을 얻으면 그 자격 증명을 캐시할 수 있어요. - 검색한 임시 자격 증명으로 애플리케이션이 photo 버킷에 접근해요.
Get-pics역할에 연결된 정책 때문에 애플리케이션은 읽기 전용 권한을 가져요. - 인스턴스에서 사용할 수 있는 임시 보안 자격 증명은 만료 전에 자동으로 갱신되어 유효한 집합이 항상 사용 가능해요. 애플리케이션은 현재 자격 증명이 만료되기 전에 인스턴스 메타데이터에서 새 자격 증명 집합을 얻기만 하면 돼요. AWS SDK로 자격 증명을 관리하면 애플리케이션이 자격 증명을 새로 고치는 추가 로직을 포함하지 않아도 돼요. 예를 들어 Instance Profile Credential Providers로 클라이언트를 인스턴스화하는 경우요. 하지만 애플리케이션이 인스턴스 메타데이터에서 임시 보안 자격 증명을 얻어 캐시했다면, 매시간 또는 현재 집합이 만료되기 최소 15분 전에 갱신된 자격 증명 집합을 얻어야 해요. 만료 시간은
iam/security-credentials/role-name카테고리에서 반환된 정보에 포함돼요.
Amazon EC2와 역할 사용에 필요한 권한
역할로 인스턴스를 시작하려면 개발자에게 Amazon EC2 인스턴스를 시작할 권한과 **IAM 역할을 전달할 권한(PassRole)**이 있어야 해요.
다음 샘플 정책은 사용자가 AWS Management Console로 역할과 함께 인스턴스를 시작할 수 있게 허용해요. 정책은 와일드카드(*)를 포함해 사용자가 어떤 역할이든 전달할 수 있고 나열된 Amazon EC2 작업을 수행할 수 있게 해요. ListInstanceProfiles 작업은 사용자가 AWS 계정에서 사용할 수 있는 모든 역할을 보게 해줘요.
사용자가 Amazon EC2 콘솔로 어떤 역할과 함께 인스턴스를 시작할 권한을 부여하는 정책 예시
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "IamPassRole",
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "*",
"Condition": {
"StringEquals": {
"iam:PassedToService": "ec2.amazonaws.com"
}
}
},
{
"Sid": "ListEc2AndListInstanceProfiles",
"Effect": "Allow",
"Action": [
"iam:ListInstanceProfiles",
"ec2:Describe*",
"ec2:Search*",
"ec2:Get*"
],
"Resource": "*"
}
]
}
Amazon EC2 인스턴스에 전달할 수 있는 역할 제한 (PassRole 사용)
PassRole 권한으로 사용자가 인스턴스를 시작할 때 Amazon EC2 인스턴스에 전달할 수 있는 역할을 제한할 수 있어요. 이는 사용자가 자신에게 부여된 것보다 더 많은 권한을 가진 애플리케이션을 실행하는 것, 즉 상승된 권한(privilege escalation)을 얻는 것을 방지하는 데 도움이 돼요. 예를 들어 사용자 Alice에게 Amazon EC2 인스턴스 시작과 Amazon S3 버킷 작업 권한만 있다고 해 보죠. 하지만 Alice가 Amazon EC2 인스턴스에 전달하는 역할은 IAM과 Amazon DynamoDB 작업 권한이 있다고 해요. 그 경우 Alice는 인스턴스를 시작하고, 로그인하고, 임시 보안 자격 증명을 얻은 뒤, 인가되지 않은 IAM이나 DynamoDB 작업을 수행할 수 있을지도 몰라요.
사용자가 Amazon EC2 인스턴스에 전달할 수 있는 역할을 제한하려면 PassRole 작업을 허용하는 정책을 만든 뒤, 그 정책을 Amazon EC2 인스턴스를 시작할 사용자(또는 사용자가 속한 IAM 그룹)에 연결해요. 정책의 Resource 요소에 사용자가 Amazon EC2 인스턴스에 전달할 수 있는 역할을 나열해요. 사용자가 인스턴스를 시작하고 역할을 연결하면, Amazon EC2는 사용자가 그 역할을 전달할 수 있는지 확인해요. 물론 사용자가 전달할 수 있는 역할이 사용자가 가져야 할 권한보다 더 많은 권한을 포함하지 않는지도 보장해야 해요.
참고
PassRole은 RunInstances나 ListInstanceProfiles과 같은 방식의 API 작업이 아니에요. 대신 역할 ARN이 API(또는 콘솔이 사용자를 대신해)의 파라미터로 전달될 때마다 AWS가 확인하는 권한이에요. 관리자가 어떤 사용자가 어떤 역할을 전달할 수 있는지 제어하는 데 도움이 돼요. 이 경우 사용자가 특정 역할을 Amazon EC2 인스턴스에 연결할 수 있는지 확인해요.
사용자가 특정 역할과 함께 Amazon EC2 인스턴스를 시작할 권한을 부여하는 정책 예시
다음 샘플 정책은 사용자가 Amazon EC2 API로 역할과 함께 인스턴스를 시작할 수 있게 허용해요. Resource 요소는 역할의 ARN을 지정해요. ARN을 지정함으로써 정책은 사용자에게 Get-pics 역할만 전달할 권한을 부여해요. 사용자가 인스턴스를 시작할 때 다른 역할을 지정하려 하면 작업이 실패해요. 사용자는 역할을 전달하는지와 무관하게 어떤 인스턴스든 실행할 권한이 있어요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::111122223333:role/Get-pics"
}
]
}
인스턴스 프로필 역할이 다른 계정의 역할로 전환하도록 허용
Amazon EC2 인스턴스에서 실행되는 애플리케이션이 다른 계정에서 명령을 실행하도록 허용할 수 있어요. 이렇게 하려면 첫 번째 계정의 Amazon EC2 인스턴스 역할이 두 번째 계정의 역할로 전환하도록 허용해야 해요.
두 개의 AWS 계정을 사용 중이고, Amazon EC2 인스턴스에서 실행되는 애플리케이션이 두 계정에서 AWS CLI 명령을 실행하도록 허용한다고 상상해 보세요. Amazon EC2 인스턴스가 111111111111 계정에 있다고 가정해요. 그 인스턴스는 abcd 인스턴스 프로필 역할을 포함하며, 이 역할은 애플리케이션이 같은 111111111111 계정의 amzn-s3-demo-bucket1 버킷에서 읽기 전용 Amazon S3 작업을 수행하게 해줘요. 하지만 애플리케이션은 222222222222 계정의 amzn-s3-demo-bucket2 Amazon S3 버킷에 접근하기 위해 efgh 교차 계정 역할을 수임할 수도 있어야 해요.
abcd Amazon EC2 인스턴스 프로필 역할은 애플리케이션이 amzn-s3-demo-bucket1 Amazon S3 버킷에 접근하도록 다음 권한 정책이 있어야 해요.
계정 111111111111의 abcd 역할 권한 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAccountLevelS3Actions",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetAccountPublicAccessBlock",
"s3:ListAccessPoints",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Sid": "AllowListAndReadS3ActionOnMyBucket",
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket1/*",
"arn:aws:s3:::amzn-s3-demo-bucket1"
]
},
{
"Sid": "AllowIPToAssumeCrossAccountRole",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::222222222222:role/efgh"
}
]
}
abcd 역할은 Amazon EC2 서비스가 역할을 수임하도록 신뢰해야 해요. 이렇게 하려면 abcd 역할에 다음 트러스트 정책이 있어야 해요.
계정 111111111111의 abcd 역할 트러스트 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "abcdTrustPolicy",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"Service": "ec2.amazonaws.com"
}
}
]
}
efgh 교차 계정 역할이 같은 222222222222 계정의 amzn-s3-demo-bucket2 버킷에서 읽기 전용 Amazon S3 작업을 허용한다고 가정해요. 이렇게 하려면 efgh 교차 계정 역할에 다음 권한 정책이 있어야 해요.
계정 222222222222의 efgh 역할 권한 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAccountLevelS3Actions",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetAccountPublicAccessBlock",
"s3:ListAccessPoints",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Sid": "AllowListAndReadS3ActionOnMyBucket",
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::amzn-s3-demo-bucket2/*",
"arn:aws:s3:::amzn-s3-demo-bucket2"
]
}
]
}
efgh 역할은 abcd 인스턴스 프로필 역할이 수임하도록 신뢰해야 해요. 이렇게 하려면 efgh 역할에 다음 트러스트 정책이 있어야 해요.
계정 222222222222의 efgh 역할 트러스트 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "efghTrustPolicy",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/abcd"
}
}
]
}
어떻게 시작하나요?
역할이 Amazon EC2 인스턴스와 어떻게 동작하는지 이해하려면 IAM 콘솔로 역할을 만들고, 그 역할을 사용하는 Amazon EC2 인스턴스를 시작한 뒤, 실행 중인 인스턴스를 검사해야 해요. 인스턴스 메타데이터를 검사해 역할의 임시 자격 증명이 인스턴스에 어떻게 제공되는지 볼 수 있어요. 인스턴스에서 실행되는 애플리케이션이 역할을 어떻게 사용할 수 있는지도 볼 수 있어요. 더 알아보려면 다음 리소스를 사용하세요.
- Amazon EC2 인스턴스의 IAM 역할 튜토리얼 — 연결된 비디오는 인스턴스에서 실행될 때 애플리케이션이 무엇을 할 수 있는지 제어하기 위해 IAM 역할을 Amazon EC2 인스턴스와 함께 사용하는 방법을 보여줘요. 비디오는 애플리케이션이(AWS SDK로 작성됨) 역할을 통해 임시 보안 자격 증명을 얻는 방법을 보여줘요.
- SDK 연습 — AWS SDK 문서에는 Amazon EC2 인스턴스에서 실행되며 역할용 임시 자격 증명으로 Amazon S3 버킷을 읽는 애플리케이션을 보여주는 연습이 포함돼요. 다음 각 연습은 다른 프로그래밍 언어로 비슷한 단계를 보여줘요.
- AWS SDK for Java 개발자 가이드의 SDK for Java로 Amazon EC2용 IAM 역할 구성
- AWS SDK for .NET 개발자 가이드의 SDK for .NET으로 Amazon EC2 인스턴스 시작
- AWS SDK for Ruby 개발자 가이드의 SDK for Ruby로 Amazon EC2 인스턴스 생성
관련 정보
역할 만들기 또는 Amazon EC2 인스턴스용 역할에 대한 자세한 내용은 다음 정보를 참고하세요.
- Amazon EC2 인스턴스와 IAM 역할 사용에 대한 자세한 내용은 Amazon EC2 사용자 가이드를 참고하세요.
- 역할을 만들려면 IAM 역할 생성을 참고하세요.
- 임시 보안 자격 증명 사용에 대한 자세한 내용은 IAM의 임시 보안 자격 증명을 참고하세요.
- IAM API나 CLI로 작업한다면 IAM 인스턴스 프로필을 만들고 관리해야 해요. 인스턴스 프로필에 대한 자세한 내용은 인스턴스 프로필 사용을 참고하세요.
- 인스턴스 메타데이터의 역할용 임시 보안 자격 증명에 대한 자세한 내용은 Amazon EC2 사용자 가이드의 인스턴스 메타데이터에서 보안 자격 증명 검색을 참고하세요.
더 알아보기 (Learn more)
- 인스턴스 프로필 사용 — 인스턴스 프로필의 개념을 확인해 보세요.
- 역할 만들기 — IAM 역할 생성 방법을 살펴보세요.
- 임시 보안 자격 증명 — 임시 자격 증명의 개념을 참고하세요.