スキップしてコンテンツを表示

既存の SES SMTP IAM ユーザーのアクセスキーをローテーションする方法を教えてください。

所要時間2分
0

AWS Identity and Access Management (IAM) において、Amazon Simple Email Service (Amazon SES) の Simple Mail Transfer Protocol (SMTP) 認証情報をローテーションしようとしています。

解決策

IAM コンソールで作成したアクセスキーは、Amazon SES エンドポイントへの接続時には機能します。ただし、このアクセスキーは SES SMTP インターフェイスでは機能しません。これは、キーの形式が SMTP 認証情報に必要な形式とは異なるためです。

アクセスキーを SES SMTP インターフェイスで使用できるようにするには、新しい SES SMTP 認証情報を作成します。または、既存のシークレットアクセスキーを SMTP 認証情報に変換することもできます。

重要: 既存のシークレットアクセスキーを SMTP 認証情報に変換するのではなく、新しい SES SMTP 認証情報を作成することをおすすめします。

新しい SES SMTP 認証情報を作成する (ベストプラクティス)

Amazon SES コンソールを使用して新しい SES SMTP 認証情報を作成します。

注: 新しい SES SMTP 認証情報を取得した後、IAM ユーザーが必要ない場合は、その IAM ユーザーを削除または非アクティブ化してもかまいません。

既存のシークレットアクセスキーを SMTP 認証情報に変換します。

注: これらの手順を完了するには、Python バージョン 3 以降を使用する必要があります。

次の手順を実行します。

  1. 既存の IAM ユーザーのポリシーを更新します。少なくとも、ses:SendRawEmail へのアクセス許可を含めます。

  2. 次の Python コードをテキストエディタに貼り付け、seskey.py としてファイルを保存します。

    #!/usr/bin/env python3
    import hmac
    import hashlib
    import base64
    import argparse
    
    SMTP_REGIONS = [
        'us-east-2',       # US East (Ohio)
        'us-east-1',       # US East (N. Virginia)
        'us-west-2',       # US West (Oregon)
        'ap-south-1',      # Asia Pacific (Mumbai)
        'ap-northeast-2',  # Asia Pacific (Seoul)
        'ap-southeast-1',  # Asia Pacific (Singapore)
        'ap-southeast-2',  # Asia Pacific (Sydney)
        'ap-northeast-1',  # Asia Pacific (Tokyo)
        'ca-central-1',    # Canada (Central)
        'eu-central-1',    # Europe (Frankfurt)
        'eu-west-1',       # Europe (Ireland)
        'eu-west-2',       # Europe (London)
        'sa-east-1',       # South America (Sao Paulo)
        'us-gov-west-1',   # AWS GovCloud (US)
    ]
    
    # These values are required to calculate the signature. Do not change them.
    DATE = "11111111"
    SERVICE = "ses"
    MESSAGE = "SendRawEmail"
    TERMINAL = "aws4_request"
    VERSION = 0x04
    
    
    def sign(key, msg):
        return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
    
    
    def calculate_key(secret_access_key, region):
        if region not in SMTP_REGIONS:
            raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.")
    
        signature = sign(("AWS4" + secret_access_key).encode('utf-8'), DATE)
        signature = sign(signature, region)
        signature = sign(signature, SERVICE)
        signature = sign(signature, TERMINAL)
        signature = sign(signature, MESSAGE)
        signature_and_version = bytes([VERSION]) + signature
        smtp_password = base64.b64encode(signature_and_version)
        return smtp_password.decode('utf-8')
    
    
    def main():
        parser = argparse.ArgumentParser(
            description='Convert a Secret Access Key for an IAM user to an SMTP password.')
        parser.add_argument(
            'secret', help='The Secret Access Key to convert.')
        parser.add_argument(
            'region',
            help='The AWS Region where the SMTP password will be used.',
            choices=SMTP_REGIONS)
        args = parser.parse_args()
        print(calculate_key(args.secret, args.region))
    
    
    if __name__ == '__main__':
        main()
  3. 次の Python スクリプトを実行します。

    python3 seskey.py YOURKEYrrpg/JHpyvtStUVcAV9177EAKKmDP37P your-region
    

    注: YOURKEYrrpg を既存のシークレットアクセスキーに、your-region を SMTP パスワードを使用する AWS リージョンに置き換えます。
    スクリプト出力には、SES SMTP インターフェイスで使用できる新しい SMTP パスワードが表示されます。

  4. 新しい SMTP 認証情報をアプリケーションに安全に保存し、SES SMTP エンドポイントへの認証を行います。

コメントはありません

関連するコンテンツ