AWS 임시 자격 증명(AssumeRole)
AWS 자격 증명에 대해서 알아보고 Access key와 AssumeRole 에 대해서 알아보겠습니다.
AWS 자격 증명
AWS에서 자격 증명은 사용자나 서비스가 AWS 리소스에 액세스하는 데 필요한 보안 자격 증명을 의미합니다. AWS에서는 다음과 같은 종류의 자격 증명을 사용합니다.
비밀번호 + MFA
- AWS Console에 로그인하는 데 사용되는 사용자 이름과 비밀번호
- 멀티 팩터 인증(MFA)는 OTP 앱과 같이 다른 기기를 통해 추가 인증하는 방식
> IAM 사용자 MFA
키 페어
- Amazon EC2 인스턴스에 SSH 접속시 사용되는 공개 키와 개인 키의 쌍
> EC2 키 페어
Access key
- Access key는 AWS CLI, AWS SDK 와 같은 프로그래밍 방식으로 AWS를 액세스하는 데 사용
- Access key는 Access key ID와 Secret access key의 두 부분으로 구성
- 생성 후에는 다시 키 정보를 확인 할 수 없고 재발급 해야하며, 한 번에 최대 두 개의 키를 사용 할 수 있습니다.
임시 보안 토큰 (Temporary Security Tokens)
- 일시적 보안 자격 증명을 제공하는 데 사용되는 토큰
- 일반적으로 AWS Security Token Service (STS)의
AssumeRole
API 작업을 통해 발급
여러가지 자격 증명 중에서 실제 개발과 관련된 작업에서는 주로 Access key와 임시 보안 토큰이 사용됩니다.
Access key 와 장기 자격 증명
Access key
방식은 IAM 사용자로 부터 생성되며 사용자의 권한을 그대로 상속 받습니다. 생성 시 만료 기간 없이 계속해서 사용 할 수 있는 장기 자격 증명(Long-Term Credential) 방식을 이용 합니다. 만료 기간이 없기 때문에 간편하게 사용 할 수 있다는 장점이 있습니다.
하지만 여기서 만료 기간이 없는 키를 장기간 사용하게 되면서 관리가 소흘해지고 보안 취약점이 되는 경우가 많습니다. 대표적인 예를 봅시다.
- 키 정보가 git 에 commit 되어 공개 된다거나
- Access key 발급시 보관하던 키 정보가 공유 된다거나
이처럼 만료 기간이 없는 Access key가 유출되면 해당 IAM 사용자의 모든 권한을 그대로 행사 가능해지는 위험이 존재합니다.
임시 보안 토큰과 AssumeRole
임시 보안 토큰은 사용 기간이 정해져 있는 토큰을 사용하는 방식 입니다. 필요시 동적으로 생성하여 사용할 수 있기 때문에 관리가 용이하며 보안적 더 뛰어납니다.
임시 보안 토큰을 발급 받는 방법은 AWS Security Token Service(STS)를 통해서 토큰을 발급 받는 AssumeRole
방식이 있습니다.
AssumeRole은 다른 역할을 수행 할 수 있게 해줍니다. 이를 통해 필요한 작업을 수행하고, 작업이 끝나면 원래의 권한으로 돌아갈 수 있습니다.
> AWS 강의실 : 장기 자격 증명 vs 임시 자격 증명
사용자 생성 및 Access key 발급
1. 사용자 생성
Identity and Access Management(IAM)
을 이용한 사용자 생성과 개발에 사용할 Access key 발급을 받아보겠습니다. IAM
- 사용자
- 사용자 생성
을 선택합니다.
> IAM 서비스에서 사용자 메뉴를 선택 - 사용자 생성
2. 권한 추가
직접 정책 연결을 선택하고 AmazonEC2FullAccess
검색해서 체크합니다. 생성하는 사용자는 EC2에 관련된 권한 전체를 부여한다는 뜻입니다. 그럼 나머지 S3와 같은 다른 서비스는 권한이 없기 때문에 사용 할 수 없습니다. 이렇게 일반적으로 필요한 권한만 부여하고 관리하는 방식으로 운영합니다.
> 권한 추가
3. Access key 발급
생성한 사용자를 선택하고 보안 자격 증명
탭에서 Access key를 발급 할 수 있습니다. 해당 키는 현재 사용자의 권한을 동일하게 갖게되는 키입니다. 따라서 앞서 사용자에서 지정한 AmazonEC2FullAccess
권한을 가지게 됩니다.
> 액세스 키 만들기
액세스 키 모범 사례 및 대안 이라는 선택 창이 나오는데 크게 중요하지 않고 Command Line Interface(CLI)
를 선택하고 하단에 계속하기 체크하고 다음으로 넘어가 액세스 키 만들기 버튼을 클릭합니다. 그럼 Access key가 생성됩니다.
Access key는 두 가지 키값을 가집니다.
- 액세스 키
- 비밀 액세스 키
액세스 키는 발급 이후 다시 확인이 가능하며 공개되어도 무방합니다. 하지만 비밀 액세스 키는 절대 공개해서는 안됩니다. Access key는 할당 사용자와 동일한 권한을 갖게 되기 때문에 반드시 사용시 관리에 신경을 써야합니다. 더욱이 액세키는 장기 자격 증명 방식으로 한번 유출되면 키를 비활성화 또는 삭제 전까지 해당 키를 사용할 수 있기 때문에 각별히 주의해야 합니다.
비밀 액세스 키는 생성 후에 다시 확인 불가하기 때문에 분실시 다시 키를 생성 해야합니다. 두 가지 키값을 개인적인 공간에 잘 기록해둡니다. 필요한 경우 .csv 파일로 다운받아서 보관합니다.
> Access key는 액세스 키, 비밀 액세스 키 로 구성된다.
AWS CLI(Command Line Interface) 사용해보기
이제 발급받은 Access key를 이용해서 AWS CLI를 사용해보겠습니다. Ubuntu
환경에서 진행하며 Windows 사용자의 경우 AWS Command Line Interface 링크에서 파일을 다운받아 설치합니다. 또는 WSL 개발 환경을 구축 해보길 추천합니다.
$ sudo apt update
$ sudo apt install awscli
$ aws --version
설치가 끝나면 이제 앞서 발급한 Access key를 등록해야 해당 사용자로 AWS 서비스를 이용할 수 있습니다. aws configure
명령을 통해 Access key를 등록할 수 있습니다. Default region name 입력에서는 서울 리전 ap-northeast-2
를 입력합니다. Default output format에서 그대로 엔터를 누릅니다.
$ aws configure
AWS Access Key ID [None] : 발급받은 액서스키
AWS Secret Access Key [None] : 발급받은 비밀 액세스 키
Default region name [None] : ap-northeast-2
Default output format [None] :
이제 두 개의 키값을 AWS CLI에 세팅했으니 생성한 사용자와 동일한 권한을 갖게됩니다. EC2 에 접근 가능한지 확인해보겠습니다. JSON 형태의 정보가 나온다면 AWS CLI 에 Access key가 제대로 세팅된 것을 확인 할 수 있습니다.
$ aws ec2 describe-instances
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
...
AssumeRole 따라해보기
이번에는 앞서 생성한 사용자에 AssumeRole
권한을 부여하고, 다른 역할로 전환 해보겠습니다.
1. 사용자 AssumeRole 권한 부여
생성한 사용자에게 AssumeRole 권한을 부여해 보도록 하겠습니다. 사용자를 클릭해서 권한 탭에서 인라인 정책 생성
에서 서비스 선택에서 STS
를 검색해서 선택합니다. 그리고 액세스 수준 - 쓰기 - AssumeRole
을 체크합니다. 정책이 생성되면서 해당 사용자에게 정책이 추가된것을 확인 할 수 있습니다. 이제 이 사용자는 원하는 역할로 전환이 가능한 AssumeRole
권한을 갖게 됐습니다.
> step1. 인라인 정책 생성
> step2. STS 서비스 선택
> step3. 쓰기 - AssumeRole 체크
2. 사용자가 Assume 할 역할(Role) 생성
이제 AssumeRole
권한을 통해서 어떤 역할로 전환할지 선택할 수 있으며, 전환하는 역할에 할당된 권한을 부여 받을수 있습니다. 여기서는 S3 전체권한 AmazonS3FullAccess
을 역할로 만들고 그 역할로 전환해보독 하겠습니다. 우선 역할을 생성하겠습니다.
> step1. 역할 생성
신뢰할 수 있는 엔터티 선택 - AWS 계정을 선택합니다. 이 계정을 선택하고 다음으로 넘어갑니다. 권한 추가에서 AmazonS3FullAccess
를 검색하고 선택합니다. 역할 이름은 여기서는 dev-assume-role-AmazonS3FullAccess
로 작성해서 역할 생성 하겠습니다.
> step2. 신뢰할 수 있는 엔터티 선택
생성한 역할을 클릭해서 ARN
이라는 값을 확인할 수 있습니다. 이 값을 통해서 해당 역할로 전환이 가능합니다.
> 생성한 역할의 ARN
3. AWS CLI에서 AssumeRole
이제 AWS CLI 에서 사용자에게 부여한 AssumeRole 권한을 통해서 원하는 역할로 전환해 보도록 하겠습니다. 역할 전환을 하기 위해서 sts 서비스의 assume-role
API를 사용하여 두가지 옵션 값을 입력 합니다.
--role-arn
: 전환할 대상 역할의 ARN 값--role-session-name
: 임의의 문자열
$ aws sts assume-role --role-arn <ROLE_ARN> --role-session-name <test-session>
$ aws sts assume-role \
--role-arn arn:aws:iam::99842...:role/dev-assume-role-AmazonS3FullAccess \
--role-session-name test-session
AssumeRole 을 수행하면 두가지 키값과 추가로 토큰을 발급받을 수 있습니다. AssumeRole 을 통해 발급받은 두개의 키값과 토큰으로 역할을 전환 할 수 있습니다.
{
"Credentials": {
"AccessKeyId": "ASIA.......",
"SecretAccessKey": "YwyGY8dF5.......",
"SessionToken": "IQoJb3JpZ2.......",
"Expiration": "2024-04-21T08:08:12Z"
},
"AssumedRoleUser": {
"AssumedRoleId": "AROA6Q5UMFQN.......",
"Arn": "arn:aws:......."
}
}
일시적으로 환경 변수를 설정 해서 AWS CLI 명령으로 역할이 전환됐는지 확인 해보겠습니다. windows 의 경우는 export 를 대신해서 set
명령어로 대체 가능합니다.
$ export AWS_ACCESS_KEY_ID=ASIA.......
$ export AWS_SECRET_ACCESS_KEY=YwyGY8dF5.......
$ export AWS_SESSION_TOKEN=IQoJb3JpZ2.......
AmazonS3FullAccess
을 부여한 역할로 전환되면 이전에 접근하지 못하던 S3 에 대해서 접근이 가능 한 것을 확인 할 수 있습니다. 반대로 전환한 역할에는 EC2 권한이 없기 때문에 EC2 대한 접근 권한이 없을 것을 확인 할 수 있습니다.
$ aws s3 ls
$ aws ec2 describe-instances
Switching to a role (console)
추가적으로 AWS Console 에서 역할 전환 = Switching to a role (console)
또한 내부적으로 AssumeRole
을 수행합니다. 여기서도 ARN 에 포함되어 있는 정보 계정(숫자), 역할명을 입력해서 역할을 전환 할 수 있는 것을 확인 할 수 있습니다.
> AWS console 에서 역할 전환
끝으로
전체 내용을 정리를 하면 아래와 같습니다.
- AWS에서는 여러가지 방식의 자격 증명 방식 존재
- 그 중에서 개발 관련된 자격 증명 방식은 크게 두가지가 존재
- Access key : 장기 자격 증명 방식
- AssumeRole : 임시 자격 증명 방식
Access key
방식은 사용자 권한을 그대로 이용 할 수 있고, 만료기간이 없기 때문에 유출시 치명적AssumeRole
방식은 원하는 역할로 전환이 가능하며, 만료 기간이 있는 토큰을 이용하기 때문에 보안이 뛰어남
여기까지 AWS 자격 증명과 Access key, AssumeRole 을 알아 보았습니다. 다음에는 AWS SDK 를 이용한 개발 환경을 구축해보겠습니다! 😊