説明
CloudFormation の Alexa::ASK::Skill で AuthenticationConfiguration.RefreshToken は Login with Amazon 認証に使うシークレットです。テンプレートに直接保存すると、トークンがコードやリポジトリの履歴に残ります。
想定される影響
流出したリフレッシュトークンと必要なクライアント認証情報がそろうと、許可されたスコープの新しいアクセストークンが発行され、スキルの管理権限を悪用されるおそれがあります。
対処方法
発行されたリフレッシュトークンと ClientSecret を Secrets Manager に保存し、動的参照で渡してください。露出した認証情報は失効させて再発行し、デプロイ設定も更新してください。シークレットの値を変えるだけでは CloudFormation リソースに自動的に反映されません。
例
S3 に保存した既存のスキルパッケージと、読み取りを許可するロールの ARN を指定します。alexa-auth シークレットには、対象の Login with Amazon プロファイルの clientSecret と refreshToken を保存します。クライアント ID とベンダー ID は、開発者アカウントに関連付けられた値を使用してください。変更前のトークンは例示用です。
変更前
yaml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
ClientId:
Type: String
VendorId:
Type: String
SkillBucket:
Type: String
SkillKey:
Type: String
SkillBucketRoleArn:
Type: String
Resources:
MySkill:
Type: Alexa::ASK::Skill
Properties:
AuthenticationConfiguration:
ClientId: !Ref ClientId
ClientSecret: '{{resolve:secretsmanager:alexa-auth:SecretString:clientSecret}}'
RefreshToken: 'Atzr|1234'
VendorId: !Ref VendorId
SkillPackage:
S3Bucket: !Ref SkillBucket
S3Key: !Ref SkillKey
S3BucketRole: !Ref SkillBucketRoleArn
変更後
yaml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
ClientId:
Type: String
VendorId:
Type: String
SkillBucket:
Type: String
SkillKey:
Type: String
SkillBucketRoleArn:
Type: String
Resources:
MySkill:
Type: Alexa::ASK::Skill
Properties:
AuthenticationConfiguration:
ClientId: !Ref ClientId
ClientSecret: '{{resolve:secretsmanager:alexa-auth:SecretString:clientSecret}}'
RefreshToken: '{{resolve:secretsmanager:alexa-auth:SecretString:refreshToken}}'
VendorId: !Ref VendorId
SkillPackage:
S3Bucket: !Ref SkillBucket
S3Key: !Ref SkillKey
S3BucketRole: !Ref SkillBucketRoleArn