IAM 역할을 사용하여 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한 부여 - AWS Identity and Access Management

IAM 역할을 사용하여 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한 부여

Amazon EC2 인스턴스에서 실행되는 애플리케이션에는 AWS API 요청에 AWS 보안 인증 정보가 포함되어 있어야 합니다. 개발자에게 Amazon EC2 인스턴스 내에서 직접 AWS 보안 인증 정보를 저장하고 해당 인스턴스의 애플리케이션에서 해당 보안 인증 정보를 사용하는 것을 허용하도록 했을 수 있습니다. 그러나 개발자는 그런 다음에 보안 인증을 관리해야 하며, 각 인스턴스에 보안 인증을 안전하게 전달하고 보안 인증을 업데이트해야 할 때 각 Amazon EC2 인스턴스를 업데이트해야 합니다. 이처럼 여기에는 많은 작업이 요구됩니다.

이렇게 하는 대신 IAM 역할을 사용하여 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 대한 임시 보안 인증 정보를 관리할 수 있고 또 그렇게 해야 합니다. 역할을 사용할 때 Amazon EC2 인스턴스에 장기 보안 인증 정보(예: 로그인 보안 인증 정보 또는 액세스 키)를 배포하지 않아도 됩니다. 그 대신 역할은 애플리케이션에서 다른 AWS 리소스에 호출할 때 사용할 수 있는 임시 권한을 제공합니다. Amazon EC2 인스턴스를 시작할 때 인스턴스와 연결할 IAM 역할을 지정합니다. 그러면 이 인스턴스에서 실행되는 애플리케이션은 역할 제공 임시 자격 증명을 사용하여 API 요청에 서명할 수 있습니다.

역할을 사용하여 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 권한을 부여하기 위해서는 약간의 추가적인 구성이 필요합니다. Amazon EC2 인스턴스에서 실행되는 애플리케이션은 가상화된 운영 체제에 의해 AWS에서 추상화됩니다. 이러한 추가적인 분리로 인해 Amazon EC2 인스턴스에 AWS 역할 및 관련 권한을 할당하고 이를 그 애플리케이션도 사용 가능하게 만들려면 추가 절차가 필요합니다. 여기서 추가 절차란 인스턴스에 연결된 인스턴스 프로파일을 생성하는 것입니다. 그러면 인스턴스 프로필은 해당 역할을 포함하게 되며 인스턴스에서 실행되는 애플리케이션에 이 역할의 임시 자격 증명을 제공할 수 있습니다. 이 임시 자격 증명은 애플리케이션의 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 인스턴스의 역할은 어떻게 작동하나요?

다음 그림에서는 개발자가 photos라는 S3 버킷에 대한 액세스 권한이 필요한 Amazon EC2 인스턴스에서 애플리케이션을 실행하고 있습니다. 관리자가 Get-pics 서비스 역할을 생성해 Amazon EC2 인스턴스에 연결합니다. 이 역할에는 지정된 S3 버킷에 대한 읽기 전용 액세스 권한을 부여하는 권한 정책이 포함되어 있습니다. 또한 Amazon EC2 인스턴스가 해당 역할을 수임하고 임시 보안 인증 정보를 가져오도록 허용하는 신뢰 정책도 포함되어 있습니다. 애플리케이션이 인스턴스에서 실행되면 역할의 임시 자격 증명을 사용하여 photos 버킷에 액세스할 수 있습니다. 관리자는 개발자 권한을 부여하지 않아도 photos 버킷에 액세스할 수 있고 개발자는 자격 증명을 공유하거나 관리할 필요가 전혀 없습니다.


        AWS 리소스에 액세스하는 Amazon EC2 인스턴스의 애플리케이션
  1. 관리자가 IAM을 사용하여 Get-pics 역할을 생성합니다. 역할의 신뢰 정책에서 관리자는 Amazon EC2 인스턴스만이 역할을 맡을 수 있도록 지정합니다. 역할의 권한 정책에서 관리자는 photos 버킷에 읽기 전용 권한을 지정합니다.

  2. 개발자는 Amazon EC2 인스턴스를 시작하고 이 인스턴스에 Get-pics 역할을 할당합니다.

    참고

    IAM 콘솔을 사용하는 경우, 인스턴스 프로파일은 콘솔에서 관리하고 대개 사용자가 파악하기 쉽습니다. 그러나 AWS CLI 또는 API를 사용하여 역할 및 Amazon EC2 인스턴스를 만들고 관리하는 경우 사용자는 인스턴스 프로파일을 만들고 별도 절차에 따라 여기에 역할을 할당해야 합니다. 그런 다음 인스턴스를 시작할 때 역할 이름이 아닌 인스턴스 프로파일 이름을 지정해야 합니다.

  3. 애플리케이션이 실행되면 인스턴스 메타데이터에서 보안 자격 증명 검색에 설명된 대로 Amazon EC2 인스턴스 메타데이터에서 임시 보안 자격 증명을 가져옵니다. 이러한 자격 증명은 제한된 시간 동안에만 유효한 임시 보안 자격 증명으로 역할을 나타냅니다.

    개발자는 몇몇 AWS SDK를 사용하여 임시 보안 자격 증명을 투명하게 관리하는 공급자를 사용할 수 있습니다. (자격 증명 관리를 위해 해당 SDK가 지원하는 기능에 대한 설명은 각각의 AWS SDK 설명서를 참조하세요.)

    또는 애플리케이션이 Amazon EC2 인스턴스의 인스턴스 메타데이터에서 임시 보안 인증 정보를 가져올 수 있습니다. 자격 증명과 관련 값은 메타데이터의 iam/security-credentials/role-name 범주(이 경우 iam/security-credentials/Get-pics)에서 구할 수 있습니다. 애플리케이션이 인스턴스 메타데이터에서 자격 증명을 가져오면 자격 증명을 캐시할 수 있습니다.

  4. 애플리케이션은 가져온 임시 자격 증명을 사용하여 photo 버킷에 액세스합니다. Get-pics 역할에 연결된 정책으로 인해 이 애플리케이션에는 읽기 전용 권한만 있습니다.

    인스턴스에서 사용 가능한 임시 보안 인증은 만료되기 전에 자동으로 업데이트되므로 항상 유효한 설정을 사용할 수 있습니다. 애플리케이션은 현재 자격 증명이 만료되기 전에 인스턴스 메타데이터에서 새 자격 증명을 가져와야 합니다. AWS SDK를 사용해 자격 증명을 관리하도록 함으로써 애플리케이션이 자격 증명을 새로 고치기 위해 추가적인 로직을 포함할 필요가 없게 할 수도 있습니다. 예를 들어 클라이언트를 인스턴스 프로필 자격 증명 공급자로 인스턴스화하면 됩니다. 그러나 애플리케이션이 인스턴스 메타데이터에서 임시 보안 자격 증명을 가져와 캐시한 경우, 현재 자격 증명이 만료되기 전에 한 시간 또는 최소 15분마다 갱신한 자격 증명을 가져와야 합니다. 만료 시간은 iam/security-credentials/role-name 카테고리에 반환되는 정보에 포함되어 있습니다.

Amazon EC2로 역할을 사용하는 데 필요한 권한

역할을 사용하여 인스턴스를 시작하려면 개발자에게 Amazon EC2 인스턴스를 시작할 수 있는 권한과 IAM 역할을 전달할 수 있는 권한이 있어야 합니다.

다음과 같은 샘플 정책은 사용자가 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 인스턴스를 시작할 때 이 인스턴스에 전달할 수 있는 역할을 제한할 수 있습니다. 이를 통해 사용자가 자신이 받은 권한보다 더 많은 권한이 있는 애플리케이션을 실행하지 않도록, 즉 높은 권한을 가져오지 않도록 할 수 있습니다. 예를 들어 사용자 Alice는 Amazon EC2 인스턴스를 시작하고 Amazon S3 버킷을 사용할 권한만 있지만, 그녀가 Amazon EC2 인스턴스에 전달하는 역할에는 IAM 및 Amazon DynamoDB를 사용할 권한이 있다고 가정합니다. 이 경우 Alice는 인스턴스를 시작하고 여기에 로그인하여 임시 보안 자격 증명을 가져온 다음 그녀에게 권한이 없는 IAM 또는 DynamoDB 작업을 수행할 수도 있습니다.

사용자가 Amazon EC2 인스턴스에 전달할 수 있는 역할 중 어떤 것을 제한하려면 PassRole 작업을 허용하는 정책을 생성합니다. 그런 다음 그 정책을 Amazon EC2 인스턴스를 시작할 사용자(또는 사용자가 속한 IAM 그룹)에게 연결합니다. 이 정책의 Resource 요소에서 사용자가 Amazon EC2 인스턴스에 전달할 수 있는 역할을 나열합니다. 사용자가 인스턴스를 시작하고 역할을 인스턴스에 연결하면 Amazon EC2에서 사용자가 해당 역할을 전달할 수 있는지 확인합니다. 물론 사용자가 전달할 수 있는 역할에 사용자가 보유하고 있을 것으로 추정되는 권한보다 더 많은 권한이 포함되어 있지 않은지도 확인해야 합니다.

참고

PassRoleRunInstances 또는 ListInstanceProfiles와 동일한 방식의 API 작업이 아닙니다. 역할 ARN이 API에 대한 파라미터로 전달될 때마다 AWS에서 검사하는 권한입니다(또는 사용자 대신 콘솔이 이 기능을 수행). 관리자가 어느 사용자가 어느 역할을 전달할 수 있는지를 제어할 수 있습니다. 이 경우 사용자가 Amazon EC2 인스턴스에 특정 역할을 연결할 수 있습니다.

예 사용자에게 특정 역할로 Amazon EC2 인스턴스를 시작할 권한을 부여하는 정책의 예

다음과 같은 샘플 정책은 사용자가 Amazon EC2 API를 사용하여 역할로 인스턴스를 시작할 수 있도록 허용합니다. Resource 요소는 역할의 Amazon 리소스 이름(ARN)을 지정합니다. ARN을 지정함으로써 정책은 사용자에게 Get-pics 역할만을 전달할 권한을 부여합니다. 사용자가 인스턴스를 시작할 때 다른 역할을 지정하려는 경우 작업이 실패합니다. 사용자는 역할을 전달하는지와 관계없이 모든 인스턴스를 실행할 권한이 있습니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::account-id:role/Get-pics" } ] }

인스턴스 프로파일 역할이 다른 계정의 역할로 전환하도록 허용

Amazon EC2 인스턴스에서 실행 중인 애플리케이션에서 다른 계정에 있는 명령을 실행하도록 허용할 수 있습니다. 이를 위해 첫 번째 계정에 있는 Amazon EC2 인스턴스 역할이 두 번째 계정의 역할로 전환하도록 허용해야 합니다.

두 개의 AWS 계정을 사용 중이고 Amazon EC2 인스턴스에서 실행 중인 특정 애플리케이션이 두 계정 모두에서 AWS CLI 명령을 실행하도록 허용하고자 한다고 가정합니다. Amazon EC2 인스턴스가 111111111111 계정에 존재한다고 가정합니다. 해당 인스턴스에는 애플리케이션이 동일한 111111111111 계정 내에 있는 my-bucket-1 버킷에서 읽기 전용 Amazon S3 작업을 수행하도록 허용하는 abcd 인스턴스 프로파일 역할이 포함되어 있습니다. 하지만 애플리케이션은 efgh 크로스 계정 역할을 수임하여 222222222222 계정의 my-bucket-2 Amazon S3 버킷에 액세스하도록 허용되어야 합니다.

애플리케이션이 abcd Amazon S3 버킷에 액세스하도록 허용하려면 my-bucket-1 Amazon EC2 인스턴스 프로파일 역할에 다음과 같은 권한 정책이 있어야 합니다.

계정 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:::my-bucket-1/*", "arn:aws:s3:::my-bucket-1" ] }, { "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 계정 내에 있는 my-bucket-2 버킷에서 읽기 전용 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:::my-bucket-2/*", "arn:aws:s3:::my-bucket-2" ] } ] }

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 역할 자습서. 링크된 다음 동영상에서는 Amazon EC2 인스턴스로 IAM 역할을 사용하여 애플리케이션이 이 인스턴스에서 실행될 때 수행할 수 있는 작업을 제어하는 방법을 보여줍니다. 또한 이 애플리케이션(AWS SDK로 작성)이 역할을 통해 임시 보안 자격 증명을 가져오는 방법도 보여줍니다.

  • SDK 설명입니다. AWS SDK 설명서에 Amazon S3 버킷을 읽기 위해 역할에 임시 자격 증명을 사용하는 Amazon EC2 인스턴스에서 실행되는 애플리케이션을 보여주는 자세한 안내가 포함되어 있습니다. 다음과 같은 각 설명에서는 여러 프로그래밍 언어를 사용하여 비슷한 절차를 제시합니다.

역할 생성 및 Amazon EC2 인스턴스의 역할에 대한 자세한 내용은 다음 정보를 참조하세요.