STS, AssumeRole, PassRole이란?
STS란?
먼저 Assume role 을 이해하기 위해서는 STS를 알아야한다.
AWS Security Token Service(AWS STS)를 사용하면 AWS 리소스에 대한 액세스를 제어할 수 있는 임시 보안 자격 증명을 생성하여 신뢰받는 사용자에게 제공할 수 있습니다.
쉽게 말해서 토큰을 생성해 임시적으로 외부 서비스나 다른 계정에 액세스 키 보안 인증과 동일한 효력을 가지게 끔 하는 것
임시적으로 보안 인증을 하게 되면 아래와 같은 장점이 있다.
- 애플리케이션으로 장기 AWS 보안 자격 증명을 배포 또는 포함하지 않아도 된다.
- 사용자에 대한 AWS 자격 증명을 정의하지 않고 AWS 리소스에 대한 액세스 권한을 사용자에게 제공 가능
- 임시 보안 인증은 수명이 있어서 더 이상 필요하지 않을 때 업데이트나 취소할 필요가 없다.
일반적으로 아이덴티티 페더레이션, 위임, 크로스 계정 액세스, IAM 역할 등의 시나리오에서 유용하다.
- 아이덴티티 페더레이션
- AWS 밖의 외부 시스템에서 사용자 자격 증명을 관리할 수 있고 해당 시스템을 통해 로그인하는 사용자에게 액세스 권한을 부여하여 AWS 작업을 수행하고 AWS 리소스에 액세스 가능하다.
- 크로스 계정 액세스를 위한 역할
- 1개 이상의 AWS 계정을 유지할때 역할 및 크로스 계정 액세스를 사용하면 하나의 계정에서 사용자 자격 증명을 정의하고 그 자격 증명을 사용해 조직에 속한 다른 계정의 AWS 리소스에 액세스할 수 있다.
- 신뢰 관계를 생성한 후 신뢰받는 계정의 IAM 사용자 또는 애플리케이션은 STS AssumeRole API 작업을 사용할 수 있다.
- EC2의 역할
- EC2 서버 내에 AWS 보안 인증 정보를 포함하는 대신에 IAM 역할을 사용해 EC2 인스턴스에서 실행되는 애플리케이션에 대한 임시 보안 인증 정보를 관리할 수 있다.
- 인스턴스의 경우 UI Console에서는 찾을 수 없는데 IAM 역할을 연결하게되면 Instance Profile이 생성된다. 그러나 CLI나 SDK를 사용하는 경우 인스턴스 프로파일을 생성해 IAM 역할에 연결한 후 인스턴스 프로파일을 EC2 인스턴스에 연결해야 한다.
- 기타 AWS 서비스
- 임시 보안 자격 증명을 사용해 대부분의 AWS 서비스에 액세스할 수 있다. 임시 보안 자격 증명을 수락하는 서비스의 목록은 AWS IAM으로 작업하는 서비스 에서 확인 가능
Assume role 이란?
위에서 간략히 설명했지만 결국 Assume role 이란 AWS 리소스에 액세스할 수 있게끔 IAM 사용자나 정책, 역할을 추가하는 것이 아니라 임시로 자격을 얻는 행위이다.
역할에 신뢰 관계 정책을 설정하게 되면 해당하는 사용자, 그룹, 역할, 계정 및 서비스는 그 역할을 임시로 사용할 수 있는 것이다.
STS를 알아야 하는 이유는 Assume Role을 사용하기 위해서 STS를 이용해 일시적인 자격 증명을 생성하고 생성된 자격 증명으로 Assume Role을 호출하기 때문에. (사용자 콘솔에는 보이지 않는 과정이다.)
Assume role은 아래와 같은 장점이 있다.
- 하나의 IAM 사용자 또는 외부 자격 증명을 여러 AWS 계정 또는 리소스에 대해 공유할 수 있다.
- AWS 계정 또는 리소스에 대한 액세스 권한을 조정할 수 있다.
- 권한 부여를 간편히 할 수 있다.
일반적으로 계정 내에서 사용하거나 계정 간 액세스(Role Switching)에 사용된다. 역할을 생성하여 IAM 사용자에게 권한 위임
PassRole 이란?
iam:PassrRole이란 EC2 인스턴스 또는 AWS Lambda 함수와 같은 리소스를 구성해 IAM 주체가 AWS 서비스에 권한을 위임하거나 전달할 수 있도록 허용하는 IAM 권한이다.
쉽게 말해서 IAM 역할을 특정 리소스와 연결할 수 있는 IAM 내의 특수한 권한이라고 생각하면 된다.
역할을 Pass 한다는 의미는 IAM 역할을 리소스에 연결하는 프로세스를 의미하고, 이는 리소스가 다른 AWS 서비스에서 수행할 수 있는 작업이라고 생각하면 된다.
예시
예를 들어 ParameterStoreAccessRole 이라는 역할이 있으며 이 역할에는 SSM Parameter Store에서 비밀번호와 같은 중요한 데이터를 읽을 수 있는 권한이 있다고 가정해보자. IAM 사용자는 Parameter Store에 대한 권한이 거부되어 있지만, iam:PassRole을 이용해서 모든 리소스에 대한 권한(*)이 Access 상태인 정책이 할당되어 있다고 해보자.
이 상황에서 Lambda 함수를 생성해 ParameterStoreAccessRole 이라는 역할을 Lambda의 실행 역할로 할당하게 되면 사용자는 Lambda 함수를 이용해 SSM Parameter Store에서 비밀번호를 읽을 수 있는 기능이 부여된다는 이야기다.
결과적으로 IAM 사용자에게 해당 암호에 직접 액세스할 수 있는 권한이 없더라도 Lambda 함수를 호출해 민감한 데이터를 검색할 수 있다.
정리 해보자면 IAM 사용자가 직접적으로 콘솔이나 CLI로 확인은 할 수 없으나 PassRole을 이용하게 되면 Lambda나 어떠한 매개체에 대한 권한만 있다면 그리고 그 매개체가 역할을 가지고 있어 어떠한 동작을 수행 가능하다면 매개체가 할 수 있는 동작들을 IAM 사용자가 우회하여 사용할 수 있다.
3줄 요약
- STS 는 토큰을 생성해 임시적으로 AWS 리소스에 대한 제어권을 부여할 수 있으며, 유효 기간이 있어 자동으로 만료되는 서비스. 이를 이용해서 외부 시스템에서 자격 증명을 부여하거나, 다른 계정의 역할을 사용 가능하다.
- AssumeRole은 Role에 신뢰 관계 정책을 할당하게 되면 할당 받은 사용자, 그룹, 역할, 계정 등의 서비스는 해당 Role을 임시로 이용할 수 있다.
- PassRole은 직접적으로 역할을 부여해 리소스를 사용하는 것은 아니지만 PassRole을 이용하게 되면 해당하는 역할이 허용한 매개체를 이용해 매개체가 수행할 수 있는 작업을 우회하여 사용 가능하다.
내 생각
어느정도 이해가 가긴 했지만 정책이나 역할 그리고 SDK 또는 CLI로 사용하는 방법에 대한 궁금증이 아직 남았다. 어렵지만 조금 더 정확한 이해를 위해서 나중에 정리 해봐야겠다.
[참조] :
https://kyung123a.tistory.com/entry/AWS-STS%EC%99%80-Assume-Role
https://tutorialsdojo.com/understanding-the-iampassrole-permission/
https://devopscube.com/aws-iam-role-instance-profile/
https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_roles_use_passrole.html
https://docs.aws.amazon.com/ko_kr/STS/latest/APIReference/API_AssumeRole.html