Auth0のCustom Email ProviderのAWSアクセスキーをManagement APIで更新する
AWSアクセスキーは、90日のローテーションが推奨されています。AWS Security Hubでもローテーションのルールがあります。
今回は、Auth0で使っているAWSアクセスキーのローテーションをManagement APIで更新してみます。
AWSアクセスキーのローテーション自動化を推奨するものではありません。組織のルール、付与されている権限の内容、扱っている情報、などによって判断してください。
おすすめの方
- AWSアクセスキーをプログラム等でローテーションしたい方
- Auth0のManagment APIでAWSアクセスキーを更新したい方
AWSの設定をする
Amazon SESでメールアドレスを確認する
Amazon SESのSandbox環境で試します。 そのため、メールアドレスを事前に検証しておきます。
Auth0用のIAMユーザを作成する
Auth0用のIAMユーザを作成します。
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には検証済みのメールアドレス(自分のアカウントと同じ)を設定しています。
テストメールを送信する
「Send Test Email」を押して、テストメールを送信します。
無事に届きました。
IAMユーザのアクセスキー使用情報も更新されています。
Auth0のManagement APIで、AWSアクセスキーを更新する
ようやく本題です。
Pythonスクリプト
下記を実行して、AWSアクセスキーを更新します。
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のメール送信をテストする
問題なく届きました。
AWSアクセスキーの使用状況を確認する
新しいAWSアクセスキーが発行され、新しいアクセスキーが使用されていました。
さいごに
Auth0のManagment APIを使って、Auth0が利用するAWSアクセスキーの更新をしてみました。