ユーザーデータ内のエンコードされた秘密鍵

Base64 でエンコードしても、ユーザーデータに含まれる秘密鍵は保護されません。

説明

UserData に秘密鍵を Base64 でエンコードして保存しても、簡単に元の値へ戻せます。エンコードは暗号化ではなく、テンプレートやインスタンスのユーザーデータを閲覧できる人に秘密情報が露出するおそれがあります。

想定される影響

露出した鍵が認証に使われている場合、その鍵のアクセス権限を悪用されるおそれがあります。

対処方法

UserData から秘密鍵を削除し、露出した鍵は失効させて置き換えてください。シークレットが必要な場合は、必要最小限の権限を持つインスタンスロールで専用ストアから実行時に取得し、ログやデプロイ成果物に残さないでください。

例

サポートされている起動テンプレートを使う例です。ImageId と互換性のある InstanceType を指定します。変更前の Base64 値は秘密鍵のヘッダーを模した例示用の値で、実際の鍵ではありません。変更後は Fn::Base64 を使い、秘密情報を含まない起動スクリプトをエンコードします。

変更前

json
{
  "Parameters": {
    "ImageId": {
      "Type": "AWS::EC2::Image::Id"
    },
    "InstanceType": {
      "Type": "String"
    }
  },
  "Resources": {
    "myLaunchConfig3": {
      "Type": "AWS::EC2::LaunchTemplate",
      "Properties": {
        "LaunchTemplateData": {
          "ImageId": {
            "Ref": "ImageId"
          },
          "InstanceType": {
            "Ref": "InstanceType"
          },
          "UserData": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpzb21lS2V5"
        }
      }
    }
  }
}

変更後

json
{
  "Parameters": {
    "ImageId": {
      "Type": "AWS::EC2::Image::Id"
    },
    "InstanceType": {
      "Type": "String"
    }
  },
  "Resources": {
    "myLaunchConfig3": {
      "Type": "AWS::EC2::LaunchTemplate",
      "Properties": {
        "LaunchTemplateData": {
          "ImageId": {
            "Ref": "ImageId"
          },
          "InstanceType": {
            "Ref": "InstanceType"
          },
          "UserData": {
            "Fn::Base64": "#!/bin/sh\necho bootstrap only\n"
          }
        }
      }
    }
  }
}

参考資料