ユーザーデータ内のエンコードされた鍵情報の確認

ユーザーデータに実際の秘密鍵が含まれていないか確認します。Base64 エンコードではシークレットを保護できません。

説明

EC2 のユーザーデータに秘密鍵を埋め込むと、そのデータにアクセスできる利用者やソフトウェアが鍵を読み取れる可能性があります。Base64 はエンコード形式であり、暗号化ではありません。まず PEM 形式の内容が秘密鍵なのか、公開鍵や証明書なのかを区別してください。

想定される影響

実際に使用中の秘密鍵が漏えいすると、用途や保護の状態によっては認証や署名に悪用される可能性があります。公開証明書や例示用の文字列を、秘密鍵の漏えいとして扱わないでください。

対処方法

シークレットをユーザーデータから削除し、AWS Secrets Manager などの専用ストアから、必要な権限だけを持つインスタンスロールで取得してください。既に漏えいした鍵は失効または交換し、利用する構成要素も更新してください。古い起動設定、テンプレートのバージョン、インスタンスに残ったコピーも確認してください。

例

新しい構成には EC2 起動テンプレートを使用してください。ami_id と security_group_ids に実際のリソースを指定し、default キーペアが存在することを確認してください。このモジュールの user_data は Base64 でエンコードした値を受け取ります。

変更前

yaml
- name: launch template with illustrative encoded key material
  amazon.aws.ec2_launch_template:
    name: special
    image_id: "{{ ami_id }}"
    key_name: default
    security_group_ids: "{{ security_group_ids }}"
    instance_type: t3.micro
    user_data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpzb21lS2V5

この値は -----BEGIN RSA PRIVATE KEY----- と、その次の行の someKey をエンコードした例であり、完全な秘密鍵ではありません。実際の鍵をこのように埋め込まないでください。

変更後

yaml
- name: launch template without embedded private key
  amazon.aws.ec2_launch_template:
    name: special
    image_id: "{{ ami_id }}"
    key_name: default
    security_group_ids: "{{ security_group_ids }}"
    instance_type: t3.micro
    user_data: IyEvYmluL3NoCmV4aXQgMAo=

置き換えた値は、#!/bin/sh の次の行で exit 0 を実行する、何も処理しない初期化スクリプトです。シークレットは含みません。アプリケーションによるシークレットの取得処理は別途構成してください。

参考資料