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ユーザを作成します。
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には検証済みのメールアドレス(自分のアカウントと同じ)を設定しています。
テストメールを送信する
「Send Test Email」を押して、テストメールを送信します。
無事に届きました。
IAMユーザのアクセスキー使用情報も更新されています。
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のメール送信をテストする
問題なく届きました。
AWSアクセスキーの使用状況を確認する
新しいAWSアクセスキーが発行され、新しいアクセスキーが使用されていました。
さいごに
Auth0のManagment APIを使って、Auth0が利用するAWSアクセスキーの更新をしてみました。