説明
CloudFormationテンプレートにシークレットアクセスキーやパスワードを直接書くと、テンプレートやリポジトリ履歴を読める人に値が見えてしまいます。漏えいした認証情報は、許可されたAWSや外部サービスの操作に悪用されるおそれがあります。
cfn-initがS3からファイルを取得する場合、関連付けたインスタンスプロファイル内のロールをroleNameで指定できます。NoEcho入力にしても、MetadataやOutputsで値を公開すれば保護されません。
想定される影響
- 認証情報の漏えいにより、権限のあるリソースへの不正操作が可能になるおそれがあります。
- 複数の環境で値を再利用すると、交換と影響範囲の確認が難しくなる場合があります。
対処方法
S3アクセスには最小限の権限を持つインスタンスロールとroleNameを使ってください。他のシークレットは対象プロパティで対応する参照や実行時の取得で渡し、ログやメタデータへの露出を防いでください。漏えいが確認された認証情報は失効・交換し、利用履歴を調査してください。
例
認証設定の抜粋です。AMIなどのインスタンス属性、cfn-initの実行とファイル設定は別途構成してください。WebServerRoleはWebServerInstanceProfileに含まれる実際のロールで、必要なS3権限を持つ必要があります。
変更前
yaml
Resources:
WebServer:
Type: AWS::EC2::Instance
Metadata:
AWS::CloudFormation::Authentication:
S3AccessCreds:
type: S3
accessKeyId: AKIAIOSFODNN7EXAMPLE
secretKey: very-secret-value
例のアクセスキーとシークレットキーをメタデータに直接含めています。運用する認証情報をこの方法で保存しないでください。
変更後
yaml
Resources:
WebServer:
Type: AWS::EC2::Instance
Metadata:
AWS::CloudFormation::Authentication:
S3AccessCreds:
type: S3
roleName: !Ref WebServerRole
Properties:
IamInstanceProfile: !Ref WebServerInstanceProfile
インスタンスプロファイルのロールをS3認証に使います。cfn-initのファイルやソース設定にこの認証構成を関連付け、固定キーなしでアクセスできることを確認してください。