AWS

[AWS IAM] STS Basics

Sean 션 2024. 7. 15. 18:57

해당 포스팅은 UdemyUltimate AWS Certified Solutions Architect Professional 2024 영상을 보고 정리한 내용입니다.

 

[References]

https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html

https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html

AWS: Security Token Service

 

STS(Security Token Service)는 Role assume할 때 사용되는 임시 자격 증명입니다. 짧은 기간의 임시 자격 증명은 AWS 리소스 권한을 부여하는데 있어 IAM User 를 공유하는 것보다 보안적으로 뛰어납니다.

 

여러분이 Github Actions 를 사용한 CICD 를 구축한다고 가정합시다. 이 때 AWS의 EC2 리소스로 SSH 접근을 하기 위해 IAM User 같은 long term credential 을 공유하는 방식은 권장되지 않습니다. Long term credential 이 외부로 노출되면 짧은 기간의 임시 권한보다 훨씬 위험하기 때문입니다. 따라서 STS를 이용한 임시 자격 증명을 통해 Role 을 Assume 하는 방식이 권장됩니다.

 


사용하는 방법

  1. IAM Role을 생성합니다.
  2. IAM Role에 접근할 수 있는 principals를 정의합니다.
  3. AWS STS(Security Token Service)를 사용하여 자격 증명을 가져옵니다.

STS는 임시적 자격 증명이며, 이것을 통해 IAM Role을 assume 합니다. 이는 AssumeRole API를 통해 가능합니다. 임시 자격 증명은 15분에서 12시간 사이로 제공됩니다.


Feature

  • STS 만료시 AWSRevokeOlderSessions 를 이용하여 revoke가 가능합니다.
  • 주의 - role을 assume하면 기존에 가지고 있던 권한을 잃어버리고 새로 할당된 role을 갖게 됩니다. 한 시점에 하나의 role만 가질 수 있습니다.

Access through STS within your account

IAM User의 직접적인 권한을 사용

 

Role 을 switch 하여 권한을 부여 (Access through STS)

 

본인이 소유한 계정의 IAM User 에게 권한 부여 시 role 을 switch 하도록 설정할 수 있습니다.

 

장점

  • 명시적으로 유저가 권한을 assume 하도록 할 수 있습니다.
  • 유저가 AWS 관리 콘솔 또는 AWS CLI / AWS API 를 사용하여 role을 switch 하도록 설정할 수 있습니다.
  • MFA 보호를 통해 MFA 를 설정한 유저만 role 을 assume 할 수 있도록 설정할 수 있습니다.
  • 최소 권한 원칙을 지킬 수 있으며, CloudTrail을 통한 auditing 이 가능합니다.

Cross account access with STS

당신이 Production Account(좌측) 와 Development Account(우측)의 관리자라고 가정합시다. 이 때 Development Account 의 Developers 그룹에게 Production Account의 S3 버킷에 접근할 수 있는 권한을 부여하고 싶습니다.

  1. 당신은 S3 버킷에 접근할 수 있는 Role을 생성합니다.
  2. Developers 그룹이 생성된 Role 을 Assume 할 수 있는 권한을 부여합니다.
  1. Developers Group 에 있는 유저가 Role 의 Assume 을 요청하면, STS 임시 자격 증명을 반환합니다.
  1. 최종적으로 유저는 이 자격 증명을 통해 S3 버킷에 접근합니다.

이렇게 두 계정이 모두 관리자가 소유하고 있는 시나리오에선 그렇게 복잡하지 않습니다. 하지만 자격 증명을 서드파티 계정에 제공하고 싶다면 조금 복잡해집니다.


Providing Access to AWS Accounts Owned by Third Parties

유저가 서드파티에게 권한을 부여하기 위해:

  • 서드파티의 AWS 계정 ID가 필요합니다.
  • External ID 가 필요합니다. (유저와 서드파티만 공유하는 비밀 ID 값으로, 서드파티 계정에서 정의한 랜덤 문자열입니다.)
  • IAM policy 에서 권한을 정의합니다.

주의점:

AWS는 External ID를 비밀 값으로 처리하지 않습니다. 또한 External ID는 Role 을 볼 수 있는 권한이 있는 모든 사용자가 볼 수 있습니다.

따라서 External ID를 관리하는 것에 대한 책임은 유저에게 있다는 것을 의미하겠네요.


The confused deputy: External ID를 사용하지 않으면 생기는 문제

Example Corp(사진의 중간 컴포넌트) 은 대상의 Role을 Assume하여 해당 계정에 리소스를 생성해주는 서비스입니다. 먼저, 당신이 Example Corp의 서비스를 사용하기 시작했습니다. 당신은 AWS1:ExampleRole 을 만들고, ARN 을 Example Corp 에 제공합니다. 이후 Example Corp 은 AWS1:ExampleRole 권한으로 당신의 계정에 리소스를 생성합니다.

 

하지만 AWS1:ExampleRole ARN은 비밀 값이 아니기 때문에 외부에서 ‘흉내내기’ 쉽습니다. 따라서 오른쪽의 공격자가 AWS1:ExampleRole ARN 을 어떤 방식으로든 알아내게 되었다고 가정합시다.

 

그 후 Another AWS Account가 자신의 계정의 Role에 해당하는 ARN을 제공하지 않고, 알아낸 AWS1:ExampleRole ARN을 Example Corp에 제공합니다. 그러면 Example Corp 은 Another AWS Account 에게 서비스를 제공하기 위해 AWS1:ExampleRole 를 사용하게 되고, 당신의 계정에 리소스를 생성하게 됩니다.

 

이러한 문제를 The confused deputy 라고 칭합니다. 방지하기 위해 External ID 를 사용합니다.

따라서 AWS 는 External ID 를 사용하여 이러한 문제를 해결합니다. Role 을 Assume 할 때 External ID도 함께 사용하여 검증할 수 있습니다. 따라서 공격자의 Role 은 External ID 가 당신이 정의한 External ID 와 일치하지 않기 때문에 검증에 실패합니다.


Session Tags in STS

IAM Role 이나 federate user 를 assume 할 때 태그를 같이 전달할 수 있습니다.

 

다음과 같이 STS 발급 시 Department=HR 세션 태그를 전달하면 임시 자격 증명에 세션 태그가 포함됩니다.

이후, IAM Policy 에서 aws:PrincipalTag 을 통해 세션 태그를 통한 조건 설정이 가능합니다.

  • 예를 들어, S3 버킷에 접근하는 대상이 세션 태그를 가지고 있어야만 접근 가능하도록 설정할 수 있습니다.

STS Important APIs

  • AssumeRole: Role 에 Access 하기 위해 사용하는 API입니다.
  • AssumeRoleWithSAML: SAML 로 인증한 유저에게 임시 자격 증명을 제공합니다. 자세한 정보는 다음을 참고하세요.
  • AssumeRoleWithWebIdentity: 모바일이나 웹 앱에서 web identity provider 로 인증한 유저에게 임시 자격 증명을 제공합니다. 이는 Amazon Cognito, Login with Amazon, Facebook, Google 등 OpenID Connect 와 호환하는 identity provider 들이 해당합니다. 자세한 정보는 다음을 참고하세요. (AWS 는 Cognito 를 사용하도록 권장합니다.)
  • GetSessionToken: MFA 를 위해 사용되는 API 입니다.
  • GetFederationToken: Federated user 의 임시 자격 증명을 가져옵니다.

이상 이론적인 설명 정리입니다.