💭

【AWS】LightSailのSSL証明書設定にロードバランサーが必要なワケを調べた

に公開

はじめに

業務でLightSailでのSSL設定を担当した際、ACM(AWS Certificate Manager)証明書は「ロードバランサーなしでは使えない」という仕様に疑問が湧いたので、調べてみることにしました。

本記事では、ACM証明書の制限とその技術的な背景について、学びになった内容をまとめています。

ACM証明書の設定で疑問に感じた点

証明書ファイルをダウンロードできない

従来、WebサーバーのSSL証明書を取得する際は、Let's Encrypt、DigiCertなどの認証局から以下などのファイルをダウンロードする必要がありました。

  • 証明書ファイル(.crt)
  • 秘密鍵ファイル(.key)

しかし、ACMでは証明書ファイルをダウンロードする機能が存在しません

EC2/LightSailに直接インストールできない

証明書ファイルがダウンロードできないということは、EC2やLightSailインスタンスのWebサーバー(Apache、Nginx等)に直接インストールすることができません

ACM 証明書またはプライベート AWS Private CA 証明書を、 AWS ベースのウェブサイトまたはアプリケーションに直接インストールすることはできません。

https://docs.aws.amazon.com/acm/latest/userguide/acm-services.html

従来の証明書とACM証明書の違いについて

なぜこのような制限があるのかを理解するために、従来の証明書とACM証明書の違いを整理しました。

従来の証明書管理

従来の方式では、以下のプロセスで進められます。

  1. 秘密鍵の生成(ユーザーが実行)

  2. CSR(Certificate Signing Request)の作成(ユーザーが実行)

  3. 証明書の取得(認証局から)

    • Let's Encrypt、DigiCert等から証明書ファイルを取得
  4. サーバーへの設置(ユーザーが実行)

    • 証明書と秘密鍵をサーバーに配置
    • Webサーバーの設定ファイルを更新

ACMの証明書管理

ACMでは、証明書管理が完全に自動化されています。

  1. 証明書のリクエスト(ユーザーが実行)

    • ACMコンソールまたはAPIでドメインを指定
  2. 秘密鍵の生成と暗号化(ACMが自動実行)

    • AWS KMSで暗号化して保存
  3. ドメイン検証(自動または手動)

    • DNS検証またはEメール検証
  4. 証明書の配布(自動)

    • 統合サービスへ自動的に配信

最も大きな違いは秘密鍵の管理方法です。

項目 従来の証明書 ACM証明書
秘密鍵の生成者 ユーザー AWS
秘密鍵の保存場所 ユーザーのサーバー AWS KMS
秘密鍵へのアクセス ユーザーが直接アクセス可能 ユーザーはアクセス不可
証明書の更新 手動 自動

なぜ秘密鍵の管理方法に違いがあるのか

AWSは秘密鍵を完全に管理して、ユーザーには一切渡さない設計となっています。これは AWS KMS(Key Management Service) という仕組みです。

ACM は証明書とそれに対応するプライベートキーを保存し、プライベートキーを保護するために AWS Key Management Service (AWS KMS) を使用します。

https://docs.aws.amazon.com/acm/latest/userguide/data-protection.html

KMSではエンベロープ暗号化という方式を採用しており、これが従来の暗号化と異なります。

従来の暗号化

データ + 暗号化キー → 暗号化データ
  • 暗号化キーが1つだけ
  • キーを知っていれば誰でも復号可能

エンベロープ暗号化(KMS)

1. マスターキー → データキー(一時的な暗号化キー)
2. データ + データキー → 暗号化データ
3. データキー + マスターキー → 暗号化されたデータキー
4. 保存:暗号化データ + 暗号化されたデータキー

具体的な処理の流れ

暗号化プロセス

  1. マスターキー(aws/acm) がKMS内部で生成
  2. データキーが動的に生成される
  3. 秘密鍵がデータキーで暗号化
  4. データキーがマスターキーで暗号化
  5. 暗号化された秘密鍵暗号化されたデータキーが保存

復号プロセス

  1. 暗号化されたデータキーをマスターキーで復号
  2. 復号されたデータキーで秘密鍵を復号
  3. 復号された秘密鍵でSSL/TLS処理を実行
  4. 処理完了後、データキーは破棄

なぜLightSailに直接インストールできないのか

EC2やLightSailインスタンスにACM証明書を直接インストールできないのは、AWSがセキュリティと運用効率を重視した設計を採用しているためです。

秘密鍵のセキュリティリスクが増す

もしEC2インスタンスにACM証明書の機能を実装した場合、以下のリスクが挙げられます。

  • 秘密鍵がインスタンス内に保存されることになる
  • 攻撃者がインスタンスに侵入すれば、秘密鍵にアクセス可能になる
  • 証明書の管理が各インスタンスに分散され、セキュリティ統制が難しい

ACMでは「秘密鍵はKMSで暗号化して、ユーザーは直接アクセスできない」としているため、EC2での実装はこのセキュリティ設計に反することになります。

証明書管理の自動化が難しくなる

EC2インスタンスに実装した場合、運用上の問題として以下が考えられます。

  • 証明書の自動更新が複雑になる(各インスタンスでの個別処理が必要)
  • スケールアウト時の証明書配布が困難
  • インスタンス置き換え時の証明書再設定が必要
  • 証明書の期限切れ管理が手動作業になりやすい

EC2インスタンスで管理できると、ユーザー側の作業でミスが生じやすくなってしまうため、間違った設定ができない仕組みになっていると考えられます。

設計上の効率性

証明書管理をロードバランサーに集約することで、運用効率が向上します。

ロードバランサーでのSSL/TLS終端の利点

  • 複数のサーバーを管理していても、証明書の設定・更新は1箇所のみ
  • トラフィック増加時にSSL処理能力も自動的に拡張

ACM証明書を使うために必要な機能

証明書をAWSサービスに関連付けた際の処理については、以下のように説明されています。

証明書を AWS Certificate Manager と統合サービスに関連付けると、ACM は証明書と暗号化された秘密鍵をサービスに送信します。また、AWS KMS にグラントが作成され、証明書の秘密鍵を復号化するためにサービスが KMS 鍵を使用できるようになります。

https://docs.aws.amazon.com/acm/latest/userguide/data-protection.html

つまり、ACM証明書を使用するには、AWSサービス側に以下の機能が必要です。

  1. 証明書と暗号化された秘密鍵を受け取る機能
  2. KMSグラント機能

また、暗号化された通信を受信し、復号してバックエンドに転送するため「SSL/TLS終端機能」も必要になります。

KMSグラントとは?

KMSグラントとは、特定のAWSサービスがKMSキーを使用できるように、一時的な権限を与える仕組みです。

https://docs.aws.amazon.com/kms/latest/developerguide/grants.html

なぜKMSグラントが必要なのか?

一般的なAWS権限管理ではIAMポリシーを使いますが、ACM証明書の場合、IAMポリシーだけでは運用が大変になります。

項目 IAMポリシー KMSグラント
権限の設定 管理者が手動で設定 証明書関連付け時に自動作成
権限の削除 管理者が手動で削除 証明書削除時に自動削除
運用作業 証明書の追加・削除のたびに手動更新 完全自動化
削除忘れリスク あり(不要な権限が残る) なし(自動削除)

つまり、KMSグラントは「証明書の管理と権限管理を自動連動させる仕組み」 です。これにより、人的ミスを防ぎながら運用コストを下げられます。

処理の流れ ※ALBを使う場合

1. 証明書をALBに関連付け

  • ユーザーがAWSコンソールまたはAPIで証明書をALBに関連付ける
  • この操作をきっかけに、後続の自動処理が開始される

2. KMSグラントを自動作成

  • AWSが自動的にKMSグラントを作成
  • 権限付与先:ALBサービス
  • 許可操作Decrypt(復号化)、DescribeKey(キー情報取得)
  • 対象キーaws/acm(ACM専用のマスターキー)

3. ALBが秘密鍵を復号

  • ALBが付与された権限を使用して秘密鍵を復号
  • 復号された秘密鍵はメモリ上でのみ使用され、永続的に保存されない

4. 証明書削除時にグラントも自動削除

  • 証明書をALBから取り外すと、対応するKMSグラントも自動的に削除
  • これにより、ALBは即座に秘密鍵へのアクセス権限を失う

https://docs.aws.amazon.com/kms/latest/developerguide/grants.html

どうすればACM証明書を使えるのか

ACM証明書は以下などのAWSサービスで使用できます。

  • Application Load Balancer (ALB)
  • Network Load Balancer (NLB)
  • CloudFront
  • API Gateway

これらのサービスには、先ほど説明した機能(証明書受け取り、KMSグラント、SSL/TLS終端)が実装されているためです。

LightSailロードバランサーについて

LightSailインスタンスでSSL証明書を活用したい場合、LightSailロードバランサーを使用することで実現できます。
これはLightSail専用のロードバランサーで、ALB(Application Load Balancer)の簡易版として設計されており、以下の特徴があります。

  • LightSailインスタンス専用:LightSailインスタンス間の負荷分散に特化
  • 簡単設定:複雑なVPCやサブネット設定が不要
  • 固定料金:月額$18の定額制
  • ACM証明書対応:無料SSL証明書の自動管理

まとめ

本記事では、「なぜACMはロードバランサーなしで使えないのか?」という疑問から、ACMに関する技術、その背景について学んだ内容をまとめました。ACMでは、必要な機能(証明書受け取り、KMSグラント、SSL/TLS終端)を持つロードバランサー等のサービスを使用することで、証明書の完全自動管理と高いセキュリティを両立していることが分かりました。

最後までお読みいただき、ありがとうございました!

株式会社L&E Group

Discussion