동일 계정내에서 A 리소스 → B 리소스에 접근하기 위해서는 고려할 사항이 적지만 멀티 어카운트에서는 고려해야 할 사항이 늘어나게 된다.
A계정에서 B계정을 신임해야 하며, B 계정에서도 A 계정을 신임해야 한다.
⇒ STS: Assume Role에 대해 이해해야 함
A 계정 : 1111111111
B 계정 : 2222222222
이라고 가정하겠음
A 계정 Role
1. A 계정의 IAM User, 각각 IAM User들의 Access Key를 확인하도록 허용해주는 Policy 추가
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListIAMUserandListAccessKeys",
"Action": [
"iam:ListUsers",
"iam:ListAccessKeys"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
2. 신뢰 관계는 B 계정의 특정 Role을 신임할 수 있도록 설정한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::2222222222:role/LambdaRole"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
B 계정 Role
1. A계정에 있는 role/IAMListRole에 대해 sts:AssumeRole을 허용해주는 Policy를 기입해준다.
⇒ sts:AssumeRole은 어슘 롤을 사용하기 위함이다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::1111111111:role/IAMListRole"
}
]
}
2. 신뢰 관계는 해당 Role은 계정 B에서 Lambda를 수행해야 하기 때문에 lambda를 신뢰한다.
해볼 내용 : Lambda에서 해당 Role을 사용하여 A 계정의 IAM 유저 내역 조회하기
- 테스트용 Lambda를 생성한다.
Python Code
간단한 Python 예시.
Python에서는 AWS API를 사용하기 위해 Boto3라는 SDK를 제공한다.
Boto3는 client(Low level)와 resource(High level)을 제공하며, 선호에 맞게 사용할 수 있다.
client의 경우 json 형식으로 값을 받아오게 된다.
assume_role로 A 계정의 Role을 사용하여 A 계정이 권한을 일시적으로 부여받을 수 있는 ACCESS_KEY, SECRET_KEY, SESSION_TOKEN을 받게 되며, 이를 iam client에서 인증값으로 사용한다. 그 후에는 list_users() 메서드를 이용해 response를 받게 된다.
import boto3
def lambda_handler(event, context):
sts_client = boto3.client('sts')
another_account = sts_client.assume_role(
RoleArn="arn:aws:iam::1111111111:role/IAMListRole",
RoleSessionName="cross_acct_lambda"
)
ACCESS_KEY = another_account['Credentials']['AccessKeyId']
SECRET_KEY = another_account['Credentials']['SecretAccessKey']
SESSION_TOKEN = another_account['Credentials']['SessionToken']
# create service client using the assumed role credentials
client = boto3.client(
'iam',
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
response = client.list_users()
print(response)
간단히 IAM 내역만 조회하였지만 추가 권한이 필요할 경우 권한을 부여한 뒤, 여러가지 작업을 기대해볼 수 있을 것이다.