Auth0のCustom Email ProviderのAWSアクセスキーをManagement APIで更新する

Auth0のメール送信で利用する認証情報(AWSアクセスキー)をManagment APIで更新してみました。
2022.10.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWSアクセスキーは、90日のローテーションが推奨されています。AWS Security Hubでもローテーションのルールがあります。

今回は、Auth0で使っているAWSアクセスキーのローテーションをManagement APIで更新してみます。

AWSアクセスキーのローテーション自動化を推奨するものではありません。組織のルール、付与されている権限の内容、扱っている情報、などによって判断してください。

おすすめの方

  • AWSアクセスキーをプログラム等でローテーションしたい方
  • Auth0のManagment APIでAWSアクセスキーを更新したい方

AWSの設定をする

Amazon SESでメールアドレスを確認する

Amazon SESのSandbox環境で試します。 そのため、メールアドレスを事前に検証しておきます。

Amazon SESでメールアドレスの検証をしておく

Auth0用のIAMユーザを作成する

Auth0用のIAMユーザを作成します。

iam_user.yaml

AWSTemplateFormatVersion: 2010-09-09
Description: Auth0 IAM User

Resources:

  # Auth0用のユーザで必要な権限
  # https://auth0.com/docs/customize/email/smtp-email-providers/configure-amazon-ses-as-external-smtp-email-provider
  Auth0User:
    Type: AWS::IAM::User
    Properties:
      UserName: !Sub auth0-user-sample

  Auth0UserPolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: !Sub auth0-user-sample-policy
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          # Auth0用
          - Effect: "Allow"
            Action:
              - "ses:SendRawEmail"
              - "ses:SendEmail"
            Resource: "*"
          # AWSアクセスキーの更新用
          - Effect: Allow
            Action:
              - iam:CreateAccessKey
              - iam:DeleteAccessKey
            Resource: !GetAtt Auth0User.Arn
      Users:
        - !Ref Auth0User
aws cloudformation deploy \
    --template-file iam_user.yaml \
    --stack-name auth0-iam-user-sample-${AWS_ENV} \
    --capabilities CAPABILITY_NAMED_IAM \
    --no-fail-on-empty-changeset

AWSアクセスキーを取得する

aws iam create-access-key \
    --user-name auth0-user-sample

Auth0のCustom Email Providerを設定する(まずは準備)

AWSアクセスキーを設定する

先ほどの取得したAWSアクセスキーなどを設定します。 なお、Amazon SESがSandbox環境のため、Fromには検証済みのメールアドレス(自分のアカウントと同じ)を設定しています。

Auth0のメールプロバイダ設定をする

テストメールを送信する

「Send Test Email」を押して、テストメールを送信します。

Auth0からテストメールを送信する

無事に届きました。

Auth0からテストメールが届いた

IAMユーザのアクセスキー使用情報も更新されています。

AWSアクセスキーが利用された

Auth0のManagement APIで、AWSアクセスキーを更新する

ようやく本題です。

Pythonスクリプト

下記を実行して、AWSアクセスキーを更新します。

app.py

import json
import boto3
import requests
from typing import Tuple

AWS_IAM_USER_NAME = 'auth0-user-sample'

DOMAIN = 'your_tenant.auth0.com'
CLIENT_ID = 'your_client_id'
CLIENT_SECRET = 'your_client_secret'
AUDIENCE = 'https://your_tenant.auth0.com/api/v2/'


def main():
    # 新しいAWSアクセスキーを作成
    aws_access_key, aws_secret_access_key = create_aws_access_key()

    token = get_token()

    update_auth0_aws_access_key(token, aws_access_key, aws_secret_access_key)


def create_aws_access_key() -> Tuple[str, str]:
    iam = boto3.client('iam')
    resp = iam.create_access_key(
        UserName=AWS_IAM_USER_NAME
    )
    return resp['AccessKey']['AccessKeyId'], resp['AccessKey']['SecretAccessKey']


def get_token():
    headers = {'Content-Type': 'application/json'}

    url = f'https://{DOMAIN}/oauth/token'
    payloads = {
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'audience': AUDIENCE,
        'grant_type': 'client_credentials',
    }

    res = requests.post(url, headers=headers, data=json.dumps(payloads))
    return res.json().get('access_token')


def update_auth0_aws_access_key(token: str, aws_access_key: str, aws_secret_access_key: str) -> None:
    headers = {'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'}
    url = f'https://{DOMAIN}/api/v2/emails/provider'

    payloads = {
        'name': 'ses',
        'credentials': {
            'accessKeyId': aws_access_key,
            'secretAccessKey': aws_secret_access_key,
            'region': 'ap-northeast-1',
        }
    }

    res = requests.patch(url, headers=headers, data=json.dumps(payloads))
    print(res.status_code)
    print(res.json())


if __name__ == '__main__':
    main()
python app.py

Auth0のメール送信をテストする

問題なく届きました。

Auth0からテストメールが届いた

AWSアクセスキーの使用状況を確認する

新しいAWSアクセスキーが発行され、新しいアクセスキーが使用されていました。

新しいAWSアクセスキーが発行されて、新しいAWSアクセスキーが利用された

さいごに

Auth0のManagment APIを使って、Auth0が利用するAWSアクセスキーの更新をしてみました。

参考