boto3で二段階認証を使用する方法


AWSの二段階認証

AWSへのアクセス、キーを使用する時に個人の携帯に入れている認証デバイスで発行されているワンタイムパスワードを入力しないと、
AWSへの機能が制限される仕組み。
大規模開発において、よりセキュアな個人アカウントの管理方法としてAWSから提供されている

問題

セキュアなのは良いが、面倒くさい。ある程度テンプレートを用意しないと開発の効率が落ちる。

やり方

こんな感じにやる

regionsは全てのリージョンに対して処理をしているが、適宜減らしても問題なし。

import boto3
import argparse

config = {
    "device": "",
    "AccessKeyId": "",
    "SecretAccessKey": "",
    "regions": ['us-east-1','us-east-2','us-west-1','us-west-2','ca-central-1','eu-central-1','eu-west-1','eu-west-2','eu-west-3','ap-northeast-1','ap-northeast-2','ap-southeast-1','ap-southeast-2','ap-south-1','sa-east-1']
}

def set_param():
    parser = argparse.ArgumentParser()
    parser.add_argument('-mfacode', dest='mfacode', default="")
    parameter = parser.parse_args()
    return parameter

def get_one_time_token(access_key_id,secret_access_key,device,mfa_code):
    duration_seconds = 86400
    client = boto3.client('sts',aws_access_key_id =access_key_id,aws_secret_access_key = secret_access_key)
    response = client.get_session_token(DurationSeconds=duration_seconds,SerialNumber=device,TokenCode=mfa_code)
    return response

def main():
    parameter = set_param()
    token =  get_one_time_token(config['AccessKeyId'],config['SecretAccessKey'],config['device'],parameter.mfacode)

    one_time_access_key_id = token['Credentials']['AccessKeyId']
    one_time_secret_access_key = token['Credentials']['SecretAccessKey']
    session_token = token['Credentials']['SessionToken']
    for region in config['regions']:
        #Please input main function
        print 'This region is ' + region
        instance_name = 'hogehoge'
        ec2_client = boto3.client(
            'ec2',
            aws_access_key_id = one_time_access_key_id,
            aws_secret_access_key = one_time_secret_access_key,
            region_name = region,
            aws_session_token = session_token
        )
        response = ec2_client.describe_instances(Filters=[{'Name':'tag:Name','Values':[instance_name]}])
        print response
main()