はじめに
CloudFrontの署名付きURLを使用して画像などを配信する際に、
キーペアのローテーションをどうすれば良いのか?検討する必要があったため考えてみました。
AWSの推奨としてはセキュリティ担保のため、90日以内にキーローテーションすべきとのこと。
結論
結論から言いますと、AWSのドキュメントに丁寧に書いてあったため、 基本はそちらの手順に従いました。。
サマリだけ記載すると、以下になります。
- キーペアは2つまで作成できるため、更新時は2つ目を作成する
- キーペアを利用しているアプリケーションの環境変数などを更新する
- 古いキーペアの使用がなくなった時点で無効化→削除する
自システムに適用するなら、、
実際にシステムに適用する場合をイメージしてみた。
アプリケーションの実行基盤は、AWS Lambda(python3.8)を想定する。
① 秘匿情報を含むので、SSM Parameter Store(SecureString)に格納
キー名は/cf/key、複数情報をまとめて管理したいためJSON文字列とした。
{
"keyPairId": "aaa-key-pair-id",
"privateKey": "bbb-private-key"
}
② Lambda内でParameter Storeから取得
import json
import boto3
def get_parameter(param_key):
ssm = boto3.client('ssm')
response = ssm.get_parameters(
Names=[
param_key,
],
WithDecryption=True
)
return response['Parameters'][0]['Value']
def lambda_handler(event, context):
# キーペアをSSM Parameter Storeから取得
value = get_parameter('/cf/key')
params = json.loads(value)
print(params['keyPairId'])
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
③ 上記Parameter Storeにあるキーペア情報で署名URLを発行
それで、キーをローテーションする場合は、上記のParameter Storeを手動で更新するかな。
次回のLambda実行時から新しいキーペアが使用されるはずです。
課題
- 90日毎にローテーションするとなると、以外と面倒な運用である。
- キーペアはrootアカウントしか作成できないため、自動化するのも難しいと思い実現方法が想像できず。
- 古い署名付きURLの期限が切れるまで、古いキーペアを無効化→削除できない
- 単に待てば良いのだが、本番運用のオペレーション期間が長くなるので色々面倒
- Lambda内でParameter Storeの値をキャッシュする場合は、いつ新しい値に切り替わるか分からない
- 期限付きのキャッシュを実装する、DynamoDBにTTL付きで格納する、とかでしょうか。
おわりに
rootアカウントだったりもあり、いまいち使いにくい印象です。
もっと良い方法や、そもそも違うサービスを使うものなのでしょうかね。。