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

所要時間2分
0

Amazon Simple Email Service (Amazon SES) の簡易メール転送プロトコル (SMTP) 認証情報を、AWS Identity and Access Management (IAM) でローテーションしたいと考えています。Amazon SES と互換性のあるユーザー名とパスワードを作成する方法を教えてください。

解決策

SMTP ユーザーの IAM コンソールで作成したアクセスキーは、お客様が SES API エンドポイントに接続している場合は機能しますが、Amazon SES SMTP インターフェイスでは機能しません。IAM コンソールで生成されるキーは、Amazon SES SMTP サーバーに必要な認証情報に必要な形式とは形式が異なります。

既存のシークレットアクセスキーを変換する代わりに、新しい Amazon SES SMTP 認証情報を作成するのがベストプラクティスです。

Amazon SES SMTP インターフェイスの認証情報を設定するには、次のいずれかを実行します。

新しい Amazon SES SMTP 認証情報を作成する (推奨)

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

2.    新しい認証情報を取得したら、不要であれば IAM の既存の Amazon SES 認証情報を削除できます。

既存のシークレットアクセスキーを Amazon SES 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 スクリプトを実行するには、既存のシークレットアクセスキーを入力します。次に、スペースと SMTP パスワードを使用する AWS リージョンを入力します。以下のコマンドを使用します。

python3 seskey.py YOURKEYrrpg/JHpyvtStUVcAV9177EAKKmDP37P us-east-1

重要: 認証情報を入力し、このスクリプトを安全で信頼できるマシンで実行してください。

4.    このスクリプトは、Amazon SES で使用できる新しいシークレットアクセスキーを出力します。生成された SMTP 認証情報をアプリケーションに保存し、その認証情報を使用して SES SMTP エンドポイントに接続します。


コメントはありません

関連するコンテンツ