평문으로 노출된 Alexa ASK 스킬 리프레시 토큰

Alexa ASK 스킬의 리프레시 토큰을 템플릿에 직접 저장하지 마세요.

설명

CloudFormation의 Alexa::ASK::Skill에서 AuthenticationConfiguration.RefreshToken은 Login with Amazon 인증에 사용하는 비밀 값입니다. 템플릿에 직접 저장하면 토큰이 코드와 저장소 이력에 남습니다.

잠재적 영향

유출된 리프레시 토큰과 필요한 클라이언트 인증 정보가 함께 있으면, 허용된 범위의 새 액세스 토큰을 발급받아 스킬 관리 권한을 악용할 수 있습니다.

해결 방법

실제 발급받은 리프레시 토큰과 ClientSecret을 Secrets Manager에 저장하고 동적 참조로 전달하세요. 노출된 자격 증명은 폐기·재발급하고 배포 설정도 갱신하세요. Secrets Manager 값만 변경해도 CloudFormation 리소스에 자동으로 반영되는 것은 아닙니다.

예시

기존 S3 스킬 패키지와 이를 읽을 수 있는 역할 ARN을 입력합니다. alexa-auth 보안 암호에는 해당 Login with Amazon 프로필의 clientSecret과 refreshToken 값을 저장합니다. 클라이언트와 공급자 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

참조