본문 바로가기

AWS/IAM

AWS CLI 환경에서 역할을 사용하여 일시적인 권한을 부여받기

안녕하세요. 오늘은 IAM 서비스의 역할(Role)이라는 녀석에 대해서 포스팅하려고 합니다.

제가 처음 AWS를 접했을 때 '역할을 사용하도록 하는 것이 모범사례다.' 라고 배웠는데,

그때 당시만 해도 이게 무슨 말인지 전혀 몰랐습니다.(물론 지금도 잘 모ㄹ...)

 

역할이란 AWS에서 간단하게 '일시적으로 권한을 위임할 수 있다.'라고 소개하고 있는데요.

또한, 아키텍처 아이콘에서 역할은 헬멧 모양으로 사용되고 있습니다.

 

IAM Role의 아이콘

 

저는 이 녀석을 이해할 때 이렇게 생각했습니다.

'헬멧의 안쪽(내피)에 이 헬멧을 쓸 수 있는 사람의 이름을 적어놓고, 헬멧의 정면(챙 위쪽 면)에는 권한을 적는다'

즉, '헬멧을 착용했을 때 바깥면에 권한이 적혀있기 때문에 헬멧을 착용한 동안에는 적힌 권한을 사용할 수 있다'
라고 생각했습니다.

 

역할이란 것을 사용하기 위해서는 이 역할을 사용할 수 있는 사용자를 지정해야 합니다.

즉, 신뢰 관계를 맺어야 합니다.(Ex. EC2, RDS, 다른 계정...)

또한, 신뢰 관계를 맺은 서비스나 사용자가 이 역할을 맡게 됐을 때 사용할 수 있는 권한을 역할에 연결을 해놓습니다.

 

그러면 사용자는 이 역할을 맡게 될 때 임시세션토큰을 발급받게 되고, 역할에 연결된 권한을 사용할 수 있습니다.

 

말보다는 직접 간단한 테스트를 해보는 것이 이해를 하시는데 가장 큰 도움이 되실 것이라고 생각합니다.

해서 AWS CLI 환경에서 역할을 사용하여 임시적인 권한을 사용하도록 해보겠습니다.

 

테스트는 Local(Window 10)에서 AWS CLI 2를 설치하여 진행하며, 이 과정은 생략합니다.


먼저 역할을 사용하려면 sts:AssumeRole API를 호출할 수 있는 권한이 필요합니다.

우리는 위의 API만 허용하는 Policy를 만들고 그 Policy를 IAM User에게 부여하도록 하겠습니다.

 

  • AWS Web Console - IAM - Policies - Create policy - Json - 복사/붙여넣기

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "*"
        }
    ]
}

 

이후, 필요에 따라 태그를 입력해주시고 적절한 이름과 설명을 입력하신 후 생성합니다.

 

Create policy

 

 

다음은 생성한 Policy를 IAM User에게 부착하겠습니다.

 

  • AWS Web Console - IAM - Users - Create user - Programmatic access - AssumeRole-Test - Create user
    이후 생성되는 AccessKey는 꼭 다운로드 받아놓습니다.


Create user


다음은 Role을 생성하도록 하겠습니다.

 

  • AWS Web Console - IAM - Roles - Create role - Another AWS account - 자신의 12자리 계정 번호
  • 테스트 용도로 S3ReadOnly Policy 부착
  • 적절한 태그와 역할의 이름, 설명을 입력하여 생성


Create role

 

보통 여기서 Another AWS account에는 타사 계정 번호를 입력하여 타사 계정에서 감사의 목적으로 일시적인

권한을 부여하기도 합니다. 그러나 저희는 간단하게 테스트하기 위해 자기 자신의 계정 번호를 입력했습니다.

 

역할을 생성한 다음에 바꿔주셔야 하는 부분이 있는데요.

Another AWS account로 입력하면 신뢰관계가 기본 root로 잡혀있습니다.

추가적으로 역할의 기본 세션 지속시간은 1시간입니다. 1시간 후에는 세션 토큰이 만료됩니다.(최대 12시간까지 가능)

 

우리는 IAM User가 이 역할을 맡을 수 있도록 신뢰관계를 편집하도록 하겠습니다.

즉, 위에서 말한 헬멧 내피의 주기를 위에서 생성한 IAM User의 이름으로 수정하겠습니다.

 

  • Trust relationships - Edit trust relationship - root 부분을 user/AssumeRole-User 로 변경

 

신뢰관계 편집


이제 AWS CLI 환경에서 AssumeRole-User의 자격증명을 등록하고(Assume Role을 사용할 수 있는 권한만 존재),

역할을 호출하여 임시 자격증명을 발급받고, 임시자격증명을 사용하여 S3 버킷 정보를 가져오겠습니다.
역할을 호출하기 위해서는 역할의 ARN 정보가 필요하기에 기록해두도록 합니다.

 

먼저 Cmd 창에서 aws configure 명령어를 사용하여 자격증명을 입력합니다.

 

C:\Users\jang_>aws configure --profile Assume

AWS Access Key ID [None]: testWJGtestH4testYtestW
AWS Secret Access Key [None]: testC8testK/ltestnCtestBtesthctestyYtest
Default region name [None]: ap-northeast-2
Default output format [None]: json

 

이후, 역할을 호출하기 전에 먼저 테스트로 aws s3 ls 명령어를 입력해봅니다.

 

C:\Users\jang_>aws s3 ls --profile Assume

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

 

AccessDenied가 발생했으니, AssumeRole을 이용해서 위에서 생성한 Role의 임시자격증명을 발급받습니다.

 

C:\Users\jang_>aws sts assume-role --role-arn arn:aws:iam::123456789012:role/Assume-S3-Read-Role --role-session-name JunHyeong --profile Assume


{
    "Credentials": {
        "AccessKeyId": "test5HtestREtestWFtest",
        "SecretAccessKey": "TESTTESTTESTZPYB7U51LsN31wkz6GAnNMTESTtestTESTqP",
        "SessionToken": "TESTTESTTESTJpZ2luX2VjEIX//////////wEaTESTtestTESTFzdC0yIkTESTCa9NXjb3CpkRbAwRgMmP8C0ByKfbewHiozbTkJxmkCIQDRdm+rpj0nA16NyRX7w13AxPRuWQCn11HADreM0sw8dCqfAgiO//////////8BEAEaDDQzMjA4OTY1NTgwMSIM3wE6Zt8rO9YiS02TKvMBxHqQT+qhdUk7rlP/QP7dp1lnQ4wK14o0rDoe6b3kABiqXu2b8MqY5vzRFYzIrW4QEP2QGjNHH+jnrnlweKVUR2bA+Cjhm1hHSCXohnzO/1w8nKeLspCHz9kmUUwemVuWkPY2Kix1GuYiCrVeGQVdfg/0eVZeRZhXs72zRCXRVvLEoqqxk7dDsUa4jUISPVzrMqA0p8Wep9jYs+mP5ymHNr0ciMoYJ1gWmKN8t7D0cjqusz3K+cCHlhF5fkoSEcC7vLyzM1Tll9XdhBoKDUZ5d78yy23IK4r/MfpZgk/reiuS5mj1nlhkpC82nw+wW+deeJDxMK/uvoEGOp0BlWV3sfKOM3Zh+wPtKSON/OBOIvsWkBm+5hwoh6qiK7IP00lulBygMU4lt0B2PMh5YjDiF3PW8V7BJMomLk6bajc9iHwsXvDdHMGO1raBDBpBncnQG+H9h5ZuQ8hwEWry/i3UspxVsJyU8cFzy6b9zxXyGzkAH7+U8Dgsl9ugSe5R/k3jtsDIEDzfpebpbRhsEg3UQVrLjM5LZjqF0g==",
        "Expiration": "2021-02-19T14:03:43+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "TESTJTESTMTESTRWTESTVTESTG:JunHyeong",
        "Arn": "arn:aws:sts::123456789012:assumed-role/Assume-S3-Read-Role/JunHyeong"
    }
}

 

위와 같은 명령어를 입력하게 되면, 다음과 같이 임시자격증명이 반환되고 이를 %HOMEPATH%\.aws\credentials

파일에 새로운 자격증명을 입력해주시면 됩니다.

 

%HOMEPATH%\.aws\credentials 파일 수정

 

혹은, CMD에서 다음과 같은 명령어를 입력하셔도 됩니다.

 

C:\Users\jang_>aws configure set --profile S3Read aws_access_key_id test5HtestREtestWFtest
C:\Users\jang_>aws configure set --profile S3Read aws_secret_access_key TESTTESTTESTZPYB7U51LsN31wkz6GAnNMTESTtestTESTqPt
C:\Users\jang_>aws configure set --profile S3Read aws_session_token TESTTESTTESTJpZ2luX2VjEIX//////////wEaTESTtestTESTFzdC0yIkTESTCa9NXjb3CpkRbAwRgMmP8C0ByKfbewHiozbTkJxmkCIQDRdm+rpj0nA16NyRX7w13AxPRuWQCn11HADreM0sw8dCqfAgiO//////////8BEAEaDDQzMjA4OTY1NTgwMSIM3wE6Zt8rO9YiS02TKvMBxHqQT+qhdUk7rlP/QP7dp1lnQ4wK14o0rDoe6b3kABiqXu2b8MqY5vzRFYzIrW4QEP2QGjNHH+jnrnlweKVUR2bA+Cjhm1hHSCXohnzO/1w8nKeLspCHz9kmUUwemVuWkPY2Kix1GuYiCrVeGQVdfg/0eVZeRZhXs72zRCXRVvLEoqqxk7dDsUa4jUISPVzrMqA0p8Wep9jYs+mP5ymHNr0ciMoYJ1gWmKN8t7D0cjqusz3K+cCHlhF5fkoSEcC7vLyzM1Tll9XdhBoKDUZ5d78yy23IK4r/MfpZgk/reiuS5mj1nlhkpC82nw+wW+deeJDxMK/uvoEGOp0BlWV3sfKOM3Zh+wPtKSON/OBOIvsWkBm+5hwoh6qiK7IP00lulBygMU4lt0B2PMh5YjDiF3PW8V7BJMomLk6bajc9iHwsXvDdHMGO1raBDBpBncnQG+H9h5ZuQ8hwEWry/i3UspxVsJyU8cFzy6b9zxXyGzkAH7+U8Dgsl9ugSe5R/k3jtsDIEDzfpebpbRhsEg3UQVrLjM5LZjqF0g==      

 

 

그럼 이제 업데이트된 S3Read 자격증명으로 S3 버킷 정보를 가져오도록 하겠습니다.

 

C:\Users\jang_>aws s3 ls --profile S3Read


1234-11-22 11:22:33 Test-Bucket1
1234-11-22 11:22:33 Test-Bucket2
1234-11-22 11:22:33 Test-Bucket3
1234-11-22 11:22:33 Test-Bucket4
1234-11-22 11:22:33 Test-Bucket5

 

 

예제에서는 제가 버킷 생성 날짜와 버킷 이름은 수정을 했는데요, 실제로 여러분들의 버킷 정보가 보이실 겁니다.

 

 

여기까지 역할에 대해서 소개해드렸는데요.

저번 MFA가 등록된 사용자와 비슷하게 임시자격증명이 반환되다 보니 그러한 정보를 새로 업데이트하는 것이
너무나 번거롭죠..?? 그래서 다음 시간에는 저번 CLI에서 임시세션토큰 자동화 포스팅 때처럼

간단하게 코드 소개해드리면서 조금이나마 편리하게 사용하실 수 있도록 도와드리겠습니다 ^^

 

그럼 다음 포스팅 때 인사드리겠습니다.

 

 

감사합니다.