본문 바로가기

AWS

[IAM] A 계정의 IAM 유저 리스트를 B 계정의 Lambda에서 조회하기 (Cross account - STS Assume role)

반응형

동일 계정내에서 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를 제공한다.

Boto3client(Low level)와 resource(High level)을 제공하며, 선호에 맞게 사용할 수 있다.

client의 경우 json 형식으로 값을 받아오게 된다.

 

assume_role로 A 계정의 Role을 사용하여 A 계정이 권한을 일시적으로 부여받을 수 있는 ACCESS_KEY, SECRET_KEY, SESSION_TOKEN을 받게 되며, 이를 iam client에서 인증값으로 사용한다. 그 후에는 list_users() 메서드를 이용해 response를 받게 된다.

 

Boto3 Ref https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sts.html#STS.Client.assume_role

 

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 내역만 조회하였지만 추가 권한이 필요할 경우 권한을 부여한 뒤, 여러가지 작업을 기대해볼 수 있을 것이다.

반응형