AWS 기술 블로그

리전 AWS STS 엔드포인트 사용하기

이 글은 AWS Big Data 블로그의 How to use Regional AWS STS endpoints by Darius Januskis의 한국어 번역입니다.

이 블로그 포스팅에서는 글로벌 (현재 레거시) AWS Security Token Service (AWS STS) 엔드포인트의 가용성이 예기치 않게 감소하는 경우 복원력을 개선하는 데 도움이 되는 권장 사항을 제공합니다. 글로벌 (레거시) AWS STS 엔드포인트 https://sts.amazonaws.com은 가용성이 높지만 단일 AWS 리전—미국 동부 (버지니아 북부)—에서 호스팅되며 다른 엔드포인트와 마찬가지로 다른 리전의 엔드포인트로 자동 장애 조치를 제공하지 않습니다. 이 포스팅을 통해서 워크로드의 성능과 복원력을 개선하기 위해 환경 설정에 리전 AWS STS 엔드포인트를 사용하는 방법을 안내드리고자 합니다.

인증의 경우 자격 증명이 의도치 않게 공개, 공유 또는 도용될 수 있는 위험을 줄이기 위해서 장기 자격 증명 대신 임시 자격 증명을 사용하는 것이 가장 좋습니다. AWS STS를 사용하면 신뢰할 수 있는 사용자가 제한된 권한의 임시 자격 증명을 요청하여 AWS 리소스에 접근할 수 있습니다.

임시 자격 증명은 액세스 키 쌍과 세션 토큰을 포함합니다. 액세스 키 쌍은 액세스 키 ID와 비밀 키로 구성됩니다. AWS STS는 임시 보안 자격 증명을 동적으로 생성하여 요청 시 사용자에게 제공하므로 장기 보관이 필요하지 않습니다. 임시 보안 자격 증명은 수명이 제한되어 있는 관계로 직접 관리하거나 교체하지 않아도 됩니다.

이러한 자격 증명을 얻기 위해 여러 가지 방법을 사용할 수 있습니다:

그림 1: AWS STS에서 자격 증명을 요청하는 방법

글로벌 (레거시) 및 리전 AWS STS 엔드포인트

프로그래밍 방식으로 AWS 서비스에 연결하기 위해 엔드포인트를 사용합니다. 엔드포인트는 AWS STS 진입점의 URL입니다.

AWS STS는 모든 리전에 리전 엔드포인트를 제공합니다. AWS는 처음에 미국 동부 (버지니아 북부) 리전 (us-east-1) 에서 호스팅되는 글로벌 엔드포인트 (현재는 레거시) https://sts.amazonaws.com을 사용하여 AWS STS를 구축했습니다. 리전 AWS STS 엔드포인트는 AWS 계정에서 기본적으로 이용 가능한 리전에 대해 기본적으로 활성화됩니다. 예를 들어, https://sts.us-east-2.amazonaws.com은 미국 동부 (오하이오) 리전 엔드포인트입니다. 기본적으로 AWS 서비스는 리전 AWS STS 엔드포인트를 사용합니다. 예를 들어, IAM Roles Anywhere신뢰 앵커에 해당하는 리전 STS 엔드포인트를 사용합니다. 각 리전의 AWS STS 엔드포인트 전체 목록은 AWS Security Token Service 엔드포인트 및 할당량을 참조하십시오. 비활성화된 리전에서는 AWS STS 엔드포인트를 활성화할 수 없습니다. 기본적으로 활성화되는 AWS STS 엔드포인트와 활성화 또는 비활성화할 수 있는 엔드포인트에 대한 자세한 내용은 리전 및 엔드포인트를 참조하십시오.

앞서 언급한 바와 같이 글로벌 (레거시) AWS STS 엔드포인트 https://sts.amazonaws.com은 단일 리전—미국 동부 (버지니아 북부)—에서 호스팅되며, 다른 엔드포인트와 마찬가지로 다른 리전의 엔드포인트에 대한 자동 장애 조치를 제공하지 않습니다. AWS 또는 AWS 외부의 워크로드가 글로벌 (레거시) AWS STS 엔드포인트 https://sts.amazonaws.com을 사용하도록 구성된 경우 미국 동부 (버지니아 북부) 단일 리전에 대한 종속성이 발생합니다. 드물지만 해당 리전에서 엔드포인트를 사용할 수 없거나 리소스와 해당 리전 간의 연결이 끊어지는 경우 AWS STS를 통한 임시 자격 증명 조회가 불가하여 워크로드 가용성에 위험을 초래할 수 있습니다.

AWS는 글로벌 (레거시) AWS STS 엔드포인트 대신 리전 AWS STS 엔드포인트 (https://sts.<region-name>.amazonaws.com) 사용을 권장합니다.

복원력 개선 외에도 리전 엔드포인트 사용 시 다음과 같은 이점이 있습니다:

  • 격리 및 제한 — 워크로드와 동일한 리전에 있는 AWS STS 엔드포인트에 요청을 보냄으로써 리전 간 종속성을 최소화하고 리소스 범위를 임시 보안 자격 증명의 범위와 일치시켜 가용성 및 보안 문제를 해결할 수 있습니다. 예를 들어, 워크로드가 미국 동부 (오하이오) 리전에서 실행되는 경우 미국 동부 (오하이오) 리전 (us-east-2) 의 리전 AWS STS 엔드포인트를 사용하여 다른 리전에 대한 종속성을 제거할 수 있습니다.
  • 성능 — 서비스 및 애플리케이션에 더 가까운 엔드포인트로 AWS STS 요청을 전송하면 더 낮은 지연과 짧은 응답 시간으로 AWS STS에 액세스할 수 있습니다.

그림 2는 임시 보안 자격 증명 세트를 반환하는 AWS STS AssumeRole API를 통해 AWS 보안 주체를 사용하여 AWS Identity and Access Management (IAM) 역할을 맡는 프로세스를 보여줍니다:

그림 2: 리전 AWS STS 엔드포인트에 대한 API 호출을 통해 IAM 역할 수임하기

동일한 리전 내에서 AWS STS 호출

특정 리전 내에 위치한 워크로드의 경우 해당 리전의 리전 AWS STS 엔드포인트만 사용하도록 구성해야 합니다. 리전 엔드포인트를 사용함으로써 워크로드와 동일한 리전에서 AWS STS를 사용하여 리전 간 종속성을 제거할 수 있습니다. 예를 들어, 미국 동부 (오하이오) 리전의 워크로드는 AWS STS를 호출할 때 리전 엔드포인트 https://sts.us-east-2.amazonaws.com만 사용해야 합니다. 리전 AWS STS 엔드포인트에 연결할 수 없는 경우, 워크로드는 운영 리전 외부의 AWS STS 엔드포인트를 호출해서는 안됩니다. 워크로드에 다중 리전간 복원력이 요구되는 경우 다른 활성 리전 또는 예비 리전은 해당 리전의 리전 AWS STS 엔드포인트를 사용해야 하며, 리전 장애가 발생해도 애플리케이션이 작동할 수 있도록 배포해야 합니다. STS 트래픽을 다른 지역으로부터 격리되어 독립된 동일 리전 내의 STS 엔드포인트로 전송하고 글로벌 (레거시) 엔드포인트에 대한 종속성을 제거해야 합니다.

AWS 외부에서 AWS STS 호출

AWS 외부 워크로드의 경우 가장 짧은 지연 시간을 보장하기에 적합한 리전 AWS STS 엔드포인트를 호출하도록 구성해야 합니다. 워크로드에 다중 리전간 복원력이 요구되는 경우 리전 AWS STS 엔드포인트에 접근할 수 없는 상황에 대비하여 다른 리전의 AWS STS 호출에 대한 장애 조치 로직을 구축하십시오. 리전 AWS STS 엔드포인트로부터 획득한 임시 보안 자격 증명은 기본 세션 기간 혹은 직접 지정한 기간 동안 모든 리전에서 유효합니다.

리전 AWS STS 엔드포인트를 구성하는 방법

AWS STS API 호출 시 최신 메이저 버전AWS 명령줄 인터페이스 (CLI) 또는 AWS SDK 사용을 권장합니다.

AWS CLI

기본적으로 AWS CLI 버전 2는 AWS STS API 요청을 현재 구성된 리전의 리전 AWS STS 엔드포인트로 보냅니다. AWS CLI v2를 사용하는 경우 추가적으로 변경이 필요한 사항은 없습니다.

기본적으로 AWS CLI v1은 AWS STS 요청을 글로벌 (레거시) AWS STS 엔드포인트로 보냅니다. $ aws --version 명령을 실행하여 사용 중인 AWS CLI의 버전을 확인할 수 있습니다.

AWS CLI 명령을 실행할 때 AWS CLI는 특정 순서대로 자격 증명 구성을 찾습니다. (예: 셸 환경 변수 조회 후 로컬 AWS 구성 파일 ~/.aws/config 조회)

AWS SDK

AWS SDK는 다양한 프로그래밍 언어 및 환경에서 사용할 수 있습니다. 2022년 7월부터 AWS SDK의 새로운 메이저 버전은 기본적으로 현재 구성된 리전에 해당하는 리전 엔드포인트를 사용합니다. 2022년 7월 이후에 출시된 AWS SDK의 메이저 버전을 사용하는 경우 추가적으로 변경이 필요한 사항은 없습니다.

AWS SDK는 자격 증명에 대한 설정 값을 찾을 때까지 다양한 설정 위치를 살펴봅니다. 예를 들어, Python용 AWS SDK (Boto3) 는 소스에서 설정 값을 검색할 때 다음 조회 순서를 따릅니다:

  1. 클라이언트 생성 시 AWS 설정 파라미터로 전달된 구성 객체
  2. 환경 변수
  3. AWS 설정 파일 ~/.aws/config

여전히 AWS CLI v1을 사용하거나 AWS SDK 버전이 리전 AWS STS 엔드포인트를 기본으로 사용하지 않는 경우, 다음과 같은 옵션을 활용하여 리전 AWS STS 엔드포인트를 설정할 수 있습니다.

옵션 1 — 공유 AWS 구성 파일 사용

구성 파일은 리눅스 또는 macOS의 경우 ~/.aws/config, 윈도우에서는 C:\Users\USERNAME\.aws\config 경로에 위치해 있습니다. 리전 엔드포인트를 사용하기 위해선 sts_regional_endpoints 파라미터를 추가하십시오.
다음은 AWS 구성 파일의 기본 프로파일을 사용하여 미국 동부 (오하이오) 리전 (us-east-2) 의 리전 AWS STS 엔드포인트에 대한 값을 설정하는 예시입니다:

[default]
region = us-east-2
sts_regional_endpoints = regional

AWS STS 엔드포인트 파라미터 (sts_regional_endpoints) 의 유효한 값은 다음과 같습니다.

  • legacy (default) — 글로벌 (레거시) AWS STS 엔드포인트 sts.amazonaws.com 사용
  • regional — 현재 구성된 리전의 AWS STS 엔드포인트 사용

참고: 2022년 7월부터 AWS SDK의 새 메이저 버전은 리전 AWS STS 엔드포인트를 기본적으로 적용하며 현재 구성된 리전에 해당하는 엔드포인트를 사용합니다. AWS CLI v1을 사용하는 경우, AWS STS 엔드포인트 파라미터를 사용하기 위해선 버전 1.16.266 이상을 사용해야 합니다.

--debug 옵션을 AWS CLI 명령과 함께 사용하여 수집된 디버그 로그를 통해 어떤 AWS STS 엔드포인트가 사용되었는지 검증할 수 있습니다.

$ aws sts get-caller-identity \
  --region us-east-2 \
  --debug

디버그 로그에서 UseGlobalEndpoint를 검색하면 UseGlobalEndpoint 파라미터가 False로 설정된 내역을 찾을 수 있으며 공유 AWS 구성 파일 또는 환경 변수에서 리전 AWS STS 엔드포인트가 구성된 경우 리전 엔드포인트 공급자의 FQDN (정규화된 도메인 이름) 이 표시되는 것을 확인할 수 있습니다:

2023-09-11 18:51:11,300 – MainThread – botocore.regions – DEBUG – Calling endpoint provider with parameters: {'Region': 'us-east-2', 'UseDualStack': False, 'UseFIPS': False, 'UseGlobalEndpoint': False}
2023-09-11 18:51:11,300 – MainThread – botocore.regions – DEBUG – Endpoint provider result: https://sts.us-east-2.amazonaws.com

리전 AWS STS 엔드포인트에 대한 공유 AWS 구성 파일 설정을 지원하는 AWS SDK 목록은 AWS SDK와의 호환성을 참조하십시오.

옵션 2 — 환경 변수 사용

환경 변수는 구성 옵션을 지정하는 또 다른 방법을 제공합니다. AWS 서비스 호출 시 전역 변수로 작용하며 대부분의 SDK는 환경 변수를 지원합니다. 환경 변수를 설정하면 SDK는 셸 세션이 끝날 때까지 또는 변수를 다른 값으로 변경할 때까지 설정된 값을 사용합니다. 이후 세션에서도 변수를 유지하려면 셸의 시작 스크립트에서 변수를 설정하세요.

다음 예제는 환경 변수를 사용하여 미국 동부 (오하이오) 리전 (us-east-2) 의 리전 AWS STS 엔드포인트의 값을 설정하는 방법입니다:

Linux or macOS

$ export AWS_DEFAULT_REGION=us-east-2
$ export AWS_STS_REGIONAL_ENDPOINTS=regional

$ (echo $AWS_DEFAULT_REGION; echo $AWS_STS_REGIONAL_ENDPOINTS) 명령을 실행하여 변수의 유효성을 검증할 수 있습니다. 명령어 결과는 다음과 같이 출력됩니다:

us-east-2
regional

Windows

C:\> set AWS_DEFAULT_REGION=us-east-2
C:\> set AWS_STS_REGIONAL_ENDPOINTS=regional

다음 예제는 환경 변수를 설정하여 Python용 AWS SDK (Boto3)STS 클라이언트가 리전 AWS STS 엔드포인트를 사용하도록 구성하는 방법을 보여줍니다:

import boto3
import os
os.environ["AWS_DEFAULT_REGION"] = "us-east-2" 
os.environ["AWS_STS_REGIONAL_ENDPOINTS"] = "regional"

메타데이터 속성 sts_client.meta.endpoint_url을 사용하여 STS 클라이언트가 어떻게 구성되어 있는지 검사하고 검증할 수 있습니다. 명령어 출력 결과는 다음과 같습니다:

>>> sts_client = boto3.client("sts")
>>> sts_client.meta.endpoint_url 'https://sts.us-east-2.amazonaws.com'

리전 AWS STS 엔드포인트의 환경 변수 설정을 지원하는 AWS SDK 목록은 AWS SDK와의 호환성을 참조하십시오.

옵션 3 — 엔드포인트 URL 생성

특정 리전 AWS STS 엔드포인트에 대한 엔드포인트 URL을 수동으로 구성할 수 있습니다.

다음 예시는 리전 AWS STS 엔드포인트를 사용하기 위해 특정 엔드포인트 URL을 설정하여 Python용 AWS SDK (Boto3)의 STS 클라이언트를 구성하는 방법입니다:

import boto3
sts_client = boto3.client('sts', region_name='us-east-2', endpoint_url='https://sts.us-east-2.amazonaws.com')

AWS STS와 VPC 엔드포인트 사용하기

Amazon VPC에 배포한 리소스에서 AWS STS에 대한 프라이빗 연결을 생성할 수 있습니다. AWS STS는 인터페이스 VPC 엔드포인트를 사용하여 AWS PrivateLink통합됩니다. AWS PrivateLink의 네트워크 트래픽글로벌 AWS 네트워크 백본 내에서 전송되며 퍼블릭 인터넷을 통과하지 않습니다. AWS STS용 VPC 엔드포인트를 구성하면 리전 AWS STS 엔드포인트의 트래픽이 해당 엔드포인트로 이동합니다.

기본적으로 VPC의 DNS는 리전 AWS STS 엔드포인트가 VPC에 있는 AWS STS용 VPC 엔드포인트의 프라이빗 IP 주소로 리졸브되도록 DNS 항목을 업데이트합니다. Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스에서 다음과 같이 AWS STS 엔드포인트의 도메인 이름을 조회해 보면 AWS STS용 VPC 엔드포인트의 프라이빗 IP 주소가 반환되는 것을 확인할 수 있습니다.

[ec2-user@ip-10-120-136-166 ~]$ nslookup sts.us-east-2.amazonaws.com
Server:         10.120.0.2
Address:        10.120.0.2#53

Non-authoritative answer:
Name:   sts.us-east-2.amazonaws.com
Address: 10.120.138.148

선택한 리전에서 AWS STS용 인터페이스 VPC 엔드포인트를 생성한 후, 환경 변수를 사용하여 동일한 리전의 AWS STS에 액세스할 수 있도록 해당 리전 AWS STS 엔드포인트의 값을 설정합니다.

다음 로그는 리전 AWS STS 엔드포인트에 대해 AWS STS 호출이 수행된 결과를 보여줍니다:

POST
/

content-type:application/x-www-form-urlencoded; charset=utf-8
host:sts.us-east-2.amazonaws.com

AWS STS 요청 로그

AWS CloudTrail 이벤트를 사용하여 AWS STS로의 요청 및 사용된 엔드포인트에 대한 정보를 조회할 수 있습니다. 이 정보는 AWS STS 요청 패턴을 식별하고 글로벌 (레거시) STS 엔드포인트를 계속 사용하고 있는지 확인하는 데 도움이 될 수 있습니다.

CloudTrail의 이벤트는 AWS 계정의 활동 기록입니다. CloudTrail 이벤트는 AWS Management Console, AWS SDK, 명령줄 도구 및 기타 AWS 서비스를 통해 발생한 API와 non-API 활동 기록을 제공합니다.

로그 경로

  • 리전 AWS STS 엔드포인트 sts.<region-name>.amazonaws.com에 대한 요청은 해당 지역 내 CloudTrail에 기록됩니다.
  • 글로벌 (레거시) STS 엔드포인트 sts.amazonaws.com에 대한 요청은 미국 동부 (버지니아 북부) 리전 (us-east-1) 내에 기록됩니다.

로그 필드

  • 리전 AWS STS 엔드포인트 및 글로벌 엔드포인트에 대한 요청은 CloudTrail의 tlsDetails 필드에 기록됩니다. 이 필드를 사용하여 요청이 리전 혹은 글로벌 (레거시) 엔드포인트에 전송되었는지 확인할 수 있습니다.
  • VPC 엔드포인트에서 발생한 요청은 CloudTrail의 vpcEndpointId 필드에 기록됩니다.

다음은 VPC 엔드포인트를 통해 리전 AWS STS 엔드포인트로 전송된 STS 요청에 대한 CloudTrail 이벤트의 예시입니다:

"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "123456789012",
"vpcEndpointId": "vpce-021345abcdef6789",
"eventCategory": "Management",
"tlsDetails": {
    "tlsVersion": "TLSv1.2",
    "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
    "clientProvidedHostHeader": "sts.us-east-2.amazonaws.com"
}

다음은 글로벌 (레거시) AWS STS 엔드포인트로 전송된 STS 요청에 대한 CloudTrail 이벤트의 예시입니다:

"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "123456789012",
"eventCategory": "Management",
"tlsDetails": {
    "tlsVersion": "TLSv1.2",
    "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
    "clientProvidedHostHeader": "sts.amazonaws.com"
}

AWS STS 로그 데이터를 대화형 방식으로 검색하고 분석하기 위해 CloudWatch Logs Insights 또는 Amazon Athena를 사용할 수 있습니다.

CloudWatch Logs Insights

다음은 글로벌 (레거시) AWS STS 엔드포인트에 대한 API 호출을 조회하기 위해 CloudWatch Logs Insights 쿼리를 실행하는 방법에 대한 예시입니다. CloudTrail 이벤트를 쿼리하기 위해서 먼저 이벤트를 CloudWatch Logs로 전송하도록 CloudTrail 트레일을 구성해야 합니다.

filter eventSource="sts.amazonaws.com" and tlsDetails.clientProvidedHostHeader="sts.amazonaws.com"
| fields eventTime, recipientAccountId, eventName, tlsDetails.clientProvidedHostHeader, sourceIPAddress, userIdentity.arn, @message
| sort eventTime desc

쿼리 결과에는 글로벌 (레거시) AWS STS 엔드포인트 https://sts.amazonaws.com에 대한 AWS STS 호출 이벤트 세부 정보가 표시됩니다.

그림 3: CloudWatch Logs Insights 쿼리를 사용하여 STS API 호출을 확인할 수 있습니다.

Amazon Athena

다음은 Amazon Athena를 사용하여 CloudTrail 이벤트를 쿼리하고 글로벌 (레거시) AWS STS 엔드포인트에 대한 API 호출을 검색하는 방법입니다.

SELECT
    eventtime,
    recipientaccountid,
    eventname,
    tlsdetails.clientProvidedHostHeader,
    sourceipaddress,
    eventid,
    useridentity.arn
FROM "cloudtrail_logs"
WHERE
    eventsource = 'sts.amazonaws.com' AND
    tlsdetails.clientProvidedHostHeader = 'sts.amazonaws.com'
ORDER BY eventtime DESC

쿼리 결과에는 글로벌 (레거시) AWS STS 엔드포인트 https://sts.amazonaws.com에 대한 AWS STS 호출 내역이 표시됩니다.

그림 4: Athena를 사용하여 STS API 호출을 검색하고 STS 엔드포인트 식별할 수 있습니다.

결론

이 포스팅을 통해 리전 AWS STS 엔드포인트를 사용하여 AWS 운영 리전 환경의 복원력 개선 및 지연 시간 감소, 그리고 세션 토큰 사용량 증가 방법에 대해 알아봤습니다.

사용자 환경에서 AWS STS 엔드포인트의 구성 여부와 사용 이력을 확인해 보시기 바라며 CloudTrail 로그를 통한 AWS STS 활동 및 리전 AWS STS 엔드포인트의 사용 여부 점검을 권장드립니다.

궁금한 점이 있을 경우 보안, ID 및 규정 준수 re:Post 토픽에 포스팅하거나 AWS Support에 문의해 보세요.

Mehyeong Lee (이미형)

Mehyeong Lee (이미형)

이미형 Cloud Support Engineer는 Amazon EC2 Linux 서비스의 SME(Subject Matter Expert)로 활동하며 고객 EC2 환경의 네트워크 및 OS 상태를 진단하고 서버와 스토리지 관련 기술 문의를 지원하고 있습니다.