【Lambda + Boto3】AWSアカウント間でよりセキュアなSTS認証を行う
Posted in aws, blog on November 4, 2020 by Henk Verlinde ‐ 1 min read
はじめに
STS とは AWS Security Token Service (AWS STS) を使用して、AWS リソースへのアクセスをコントロールできる一時的セキュリティ認証情報を持つ、信頼されたユーザーを作成および提供することができます。 アクセスキー認証情報と違いは以下の通りです。
- STS が発行する、認証情報は一時的なものであり、一定時間で消失します。(時間は数分から数時間まで設定可能)
- STS が発行する、認証情報はユーザーとともに保存されることはなく、ユーザーのリクエストによって提供されます。 IAM ユーザーが所有するアクセスキーをそのまま使用すると思いもよらない、セキュリティー事故が起こる可能性があります。 STS が発行する一時的なアクセスキーを持つユーザーを作成し、利用するほうが安全です。
以上を踏まえて、よりセキュアな別アカウントの情報を参照する Lambda を作成します。
参照先で AssumeRole を作成する
参照するテーブルの作成
AssumeRole とは STS の利用を許可するためのロールです。 IAM ロール作成に進んでください。
【アカウント ID】には連携先の AWS アカウントのアカウント ID を入力
このロールには DynamoDB のアクセス権限が欲しいため、 ポリシー【AmazonDynamoDBFullAccess】を選択
必要あれば入力してください。 今回は未入力です。
ロール名を適当に入力。 今回は【assumeRoleDynamoDB】とします。 これでロールの作成を行いましょう。
参照元で DynamoDB を作成
テスト用に参照する DyanmoDB を作成します。 名前は【sample_tbl】とします。
参照先で Lambda 関数を作成
以下コードを入力し、Lambda 関数を実行してみてください。
import boto3
def get_external_account_session():
// 先ほど作ったロールのArnを入力
role_arn = "arn:aws:iam::***********:role/assumeRoleDynamoDB"
assume_role = boto3.client('sts').assume_role(
RoleArn = role_arn,
RoleSessionName = 'testSession'
)
session = boto3.session.Session(
aws_access_key_id = assume_role.get('Credentials').get('AccessKeyId'),
aws_secret_access_key = assume_role.get('Credentials').get('SecretAccessKey'),
aws_session_token = assume_role.get('Credentials').get('SessionToken'),
region_name = "us-east-1"
)
return session
def lambda_handler(event,context):
external_session = get_external_account_session()
external_dynamodb = external_session.client('dynamodb')
external_table = external_dynamodb.scan(TableName = "sample_tbl")
return external_table
以上です。