Alexa Skill 비밀정보 저장 방식 점검

Alexa 인증 비밀값을 템플릿에 직접 기록하지 말고 접근이 제한된 비밀 저장소로 관리하세요.

설명

Alexa Skill의 ClientSecret을 템플릿에 직접 기록하면 저장소, 배포 자료나 템플릿 이력을 통해 노출될 수 있습니다. RefreshToken도 보호해야 하며, 유출된 인증 정보가 필요한 다른 값과 함께 사용되면 허용된 스킬 관리 작업이 악용될 수 있습니다.

이 값들은 Login with Amazon에서 발급된 실제 애플리케이션 자격 증명이어야 합니다. 임의의 비밀번호를 생성해 기존 클라이언트 비밀값 대신 사용할 수는 없습니다.

잠재적 영향

  • 비밀값이 노출되어 허용된 작업을 수행하는 데 악용될 수 있습니다.
  • 복사된 템플릿과 저장소 이력에 값이 남아 교체와 사고 대응이 어려워질 수 있습니다.

해결 방법

실제 ClientSecret과 RefreshToken을 Secrets Manager에 저장하고 동적 참조로 전달하세요. 배포 역할의 조회 권한을 최소화하고 로그·출력에 값이 남지 않도록 하세요. 노출된 값은 발급 서비스에서 폐기·교체하고 배포에 새 값이 반영되는지 확인하세요.

예시

인증 설정의 발췌이며 SkillPackage 등 필수 구성은 생략했습니다. ClientId·VendorId를 실제 계정에 맞추고 AlexaCredentials에 동일한 LWA 앱의 clientSecret·refreshToken을 저장하세요. 예시 문자열은 실제 인증에 사용할 값이 아닙니다.

변경 전

yaml
Resources:
  MySkill:
    Type: Alexa::ASK::Skill
    Properties:
      AuthenticationConfiguration:
        ClientId: "amzn1.application-oa2-client.1234"
        ClientSecret: "1234"
        RefreshToken: "Atzr|1234"
      VendorId: "1234"

ClientSecret과 RefreshToken이 템플릿에 직접 포함되어 있습니다. 실제 비밀값이라면 템플릿 접근자가 확인할 수 있습니다.

변경 후

yaml
Resources:
  MySkill:
    Type: Alexa::ASK::Skill
    Properties:
      AuthenticationConfiguration:
        ClientId: "amzn1.application-oa2-client.1234"
        ClientSecret: "{{resolve:secretsmanager:AlexaCredentials:SecretString:clientSecret}}"
        RefreshToken: "{{resolve:secretsmanager:AlexaCredentials:SecretString:refreshToken}}"
      VendorId: "1234"

두 비밀값을 외부에서 참조합니다. 저장소의 값만 바꿔도 CloudFormation이 자동으로 다시 읽는 것은 아니므로 해당 리소스 업데이트와 적용 결과를 확인하세요.

참조