CloudFormationテンプレートに認証情報を直接記載

テンプレートからシークレットを除き、用途に合うロールやシークレット管理方法を使ってください。

説明

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のファイルやソース設定にこの認証構成を関連付け、固定キーなしでアクセスできることを確認してください。

参考資料