설명
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