説明
CloudFormation の AWS::DMS::Endpoint で Password を直接記述したり、パラメータの Default に設定したりすると、ソースまたはターゲットのデータストアへの接続用パスワードがコードや履歴に残ります。
想定される影響
認証情報が露出し、データベースへのネットワーク接続が可能な場合、そのアカウントの権限でデータに不正アクセスされるおそれがあります。
対処方法
パスワードはテンプレートの外部から安全に渡してください。パラメータを使う場合は既定値を設定せず、NoEcho: true を指定し、値をログや出力に残さないでください。対応するエンドポイントでは Secrets Manager 連携も利用できます。パスワードが露出した場合はデータベースアカウントと DMS の接続情報を両方更新し、接続を確認してください。
例
PostgreSQL のソースエンドポイントの例です。環境に合わせてサーバー、データベース名、ユーザー名を指定してください。変更後は、既存アカウントのパスワードを ParentMasterPassword に安全に渡します。例示用パスワードを実環境で使用しないでください。
変更前
yaml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
DatabaseServer:
Type: String
DatabaseName:
Type: String
ParentMasterUsername:
Type: String
Resources:
DMSEndpoint1:
Type: AWS::DMS::Endpoint
Properties:
EndpointType: source
EngineName: postgres
DatabaseName: !Ref DatabaseName
Password: "asDjskjs73!!"
Port: 5432
ServerName: !Ref DatabaseServer
Username: !Ref ParentMasterUsername
SslMode: require
変更後
yaml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
ParentMasterPassword:
Type: String
NoEcho: true
DatabaseServer:
Type: String
DatabaseName:
Type: String
ParentMasterUsername:
Type: String
Resources:
DMSEndpoint1:
Type: AWS::DMS::Endpoint
Properties:
EndpointType: source
EngineName: postgres
DatabaseName: !Ref DatabaseName
Password: !Ref ParentMasterPassword
Port: 5432
ServerName: !Ref DatabaseServer
Username: !Ref ParentMasterUsername
SslMode: require