Amplify App Basic Auth 비밀번호 노출

Amplify App Basic Auth 비밀번호를 평문으로 저장하면 템플릿을 통해 자격 증명이 노출될 수 있습니다.

설명

CloudFormation의 AWS::Amplify::App에서 BasicAuthConfig.Password를 직접 쓰거나 파라미터의 Default에 넣으면 앱 보호용 비밀번호가 코드와 이력에 남습니다.

잠재적 영향

노출된 사용자 이름과 비밀번호로 Basic Auth가 적용된 사이트에 접근할 수 있습니다. 같은 비밀번호를 재사용한 다른 환경도 영향을 받을 수 있습니다.

해결 방법

비밀번호를 Secrets Manager에서 참조하고 파라미터 기본값에는 저장하지 마세요. 노출된 비밀번호는 교체하세요. 보안 암호의 값만 바꾸면 Amplify 설정이 자동으로 갱신되지는 않으므로, 해당 리소스도 업데이트해 새 값을 적용하세요.

예시

RepositoryUrl은 GitHub 저장소 URL이고 GitHubTokenSecretId는 token 키에 실제 GitHub 토큰을 저장한 보안 암호입니다. 변경 후에는 별도의 Basic Auth 비밀번호를 생성합니다. 변경 전 비밀번호는 예시입니다.

변경 전

yaml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  RepositoryUrl:
    Type: String
  GitHubTokenSecretId:
    Type: String
Resources:
  NewAmpApp1:
    Type: AWS::Amplify::App
    Properties:
      Name: NewAmpApp
      Repository: !Ref RepositoryUrl
      AccessToken: !Sub '{{resolve:secretsmanager:${GitHubTokenSecretId}:SecretString:token}}'
      BasicAuthConfig:
        EnableBasicAuth: true
        Password: "@skdsjdk0234!AB"
        Username: admin

변경 후

yaml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  RepositoryUrl:
    Type: String
  GitHubTokenSecretId:
    Type: String
Resources:
  NewAmpApp1:
    Type: AWS::Amplify::App
    Properties:
      Name: NewAmpApp
      Repository: !Ref RepositoryUrl
      AccessToken: !Sub '{{resolve:secretsmanager:${GitHubTokenSecretId}:SecretString:token}}'
      BasicAuthConfig:
        EnableBasicAuth: true
        Password: !Sub '{{resolve:secretsmanager:${MyAmpAppSecretManagerRotater}:SecretString:password}}'
        Username: !Sub '{{resolve:secretsmanager:${MyAmpAppSecretManagerRotater}:SecretString:username}}'
  MyAmpAppSecretManagerRotater:
    Type: AWS::SecretsManager::Secret
    Properties:
      GenerateSecretString:
        SecretStringTemplate: '{"username": "admin"}'
        GenerateStringKey: password
        PasswordLength: 16

참조