Alexa ASK スキルの平文リフレッシュトークン

Alexa ASK スキルのリフレッシュトークンをテンプレートに直接保存しないでください。

説明

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

参考資料