AWS 크레덴셜 안전하기 사용하기 – Assume Role

AWS에서 제공하는 자격 증명의 제공 방식은 크게 사용자 계정의 액세스 키 방식과 IAM 역할(Role)에 대해서 역할 위임(Assume Role)을 하는 두 가지 방식으로 나눌 수 있습니다. AWS SSO는 이러한 방식 중에서 후자를 통해서 마스터 계정으로부터 하위 계정에 대한 권한을 위임하는 것입니다. 물론 이러한 위임 절차는 SSO 서비스가 자동으로 진행하고 있습니다. 저는 이미 앞선 글들을 통해서 이 두 가지 방식을 이용하여 AWS CLI를 안전하게 사용하는 방법을 알아보았습니다.

그렇다면 SSO를 설정하지 못하는, 즉 내가 관리하지 못하는 계정에 대해서 안전하게 권한을 획득하려면 어떻게 해야 할까요? 액세스 키를 발급받아서 사용할 수도 있지만 상대방이 보안을 중요시한다면 함부로 액세스 키를 제공하려고 하지 않을 것입니다. 이러한 상황에서는 먼저 내 계정(A)에서 상대방 계정(B)의 IAM 역할을 위임할 수 있도록 신뢰 관계를 설정하고, 내 계정에 대한 액세스 키를 발급받아서 사용하면 됩니다.

B계정에서 저에게 부여하고 싶은 권한 정책을 생성하고, IAM 역할에 할당합니다. 그리고 이 역할에 다음과 같이 신뢰관계를 작성합니다. 보통 이러한 과정은 상대방이 진행하기 때문에 사실 사용하는 당사자인 제 입장에서 크게 신경쓸 부분은 아닙니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::000000000000:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:ExternalId": "35e413a2-b7d2-45a3-9126-6fdf4563863d"
                }
            }
        }
    ]
}Code language: JSON / JSON with Comments (json)

이와 같이 A의 계정에 대해서 B 계정의 IAM 역할을 위임할 수 있는 신뢰관계를 구축하였습니다. 역할 위임의 범위를 축소하려면 root 대신에 역할 arn을 넣거나 계정을 지정할 수 있습니다. 그리고 추가적인 보안을 위해서 역할 위임시에는 ExternalId가 맞는지 확인하도록 조건을 제공하였기 때문에, A 계정에서 역할 위임시에는 이 값을 반드시 전달해야 합니다.

그러면 이제 A 계정의 액세스 키를 사용하여 다음과 같이 역할을 위임할 수 있습니다. 여기서 사용하는 role_arn 값은 B 계정에서 역할이 위임될 IAM 역할의 것입니다.

> aws sts assume-role --role-arn <role_arn> \
  --external-id 35e413a2-b7d2-45a3-9126-6fdf4563863d \
  --role-session-name test
{
    "Credentials": {
        "AccessKeyId": "ASIAXXXX",
        "SecretAccessKey": "XXXX",
        "SessionToken": "XXXX",
        "Expiration": "2023-03-19T13:50:27+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAXXXX:test",
        "Arn": "<role_arn>/test"
    }
}Code language: JSON / JSON with Comments (json)

그러면 B 계정에서 사용할 수 있는 세션에 대한 크레덴셜 정보가 출력되는데, 이것을 사용하여 B 계정에서의 명령을 수행할 수 있게 됩니다.


하지만… 이렇게 출력된 정보를 다시 저장하고 갱신하고 하는 과정이 여간 귀찮은게 아닙니다. 그래서 이러한 정보들을 사전에 CLI에 설정해놓고 손쉽게 인증 정보를 갱신할 수 있습니다. 먼저 A 계정에 대한 액세스 키 정보를 토대로 앞선 글들과 같이 demo 프로파일을 생성합니다. 그리고 B 계정에서 위암할 역할에 대한 정보를 별도의 프로파일로 생성합니다. [공식 문서]

> vi ~/.aws/config
[profile test]
external_id=35e413a2-b7d2-45a3-9126-6fdf4563863d
role_arn=<role_arn>
role_session_name=test
source_profile=demo
region=ap-northeast-2Code language: Bash (bash)

source_profile 항목에 demo 프로파일을 지정함으로써, 역할 위임 프로파일 test는 demo 프로파일의 크레덴셜을 사용하여 위임 과정을 진행하라고 명시하는 것입니다. 그러면 앞서 sts 명령을 사용하여 크레덴셜을 취득하고 복사하고 저장하고 사용하는 과정 자체를 한 번에 건너 뛸 수 있게 됩니다.

> aws-vault exec test -- aws s3 ls
2023-03-07 09:46:21 aws-athena-query-xxx
2023-03-07 09:46:21 cf-templates-xxx
...Code language: Bash (bash)

이렇게 역할 위임을 통해서 내 계정으로부터 다른 계정의 권한을 취득하고 사용할 수 있습니다. 다만 현재 버그 때문인지, AWS Vault로는 역할 위임 프로파일이 제대로 동작하지 않고 있는데, 바로 다음 버전에서 수정될 예정에 있으므로 참고 바랍니다 [링크].

Leave a Reply

Your email address will not be published. Required fields are marked *