Amplify アプリの Basic Auth パスワードの露出

Amplify アプリの Basic Auth パスワードを平文で保存すると、テンプレートを通じて認証情報が露出するおそれがあります。

説明

CloudFormation の AWS::Amplify::App で BasicAuthConfig.Password を直接記述したり、パラメータの Default に設定したりすると、アプリを保護するパスワードがコードや履歴に残ります。

想定される影響

露出したユーザー名とパスワードで、Basic Auth が適用されたサイトにアクセスされるおそれがあります。同じパスワードを使い回している環境も影響を受ける可能性があります。

対処方法

パスワードは Secrets Manager から参照し、パラメータの既定値には保存しないでください。露出したパスワードは変更してください。シークレットの値を変えるだけでは Amplify の設定は更新されないため、対象リソースも更新して新しい値を反映してください。

例

RepositoryUrl は GitHub リポジトリの URL、GitHubTokenSecretId は実際の GitHub トークンを token キーに保存したシークレットです。変更後は、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

参考資料