🔒 Security / VPN / ACM

証明書ベースVPN認証 &
AWS Certificate Manager

従来のPSK(事前共有鍵)認証に代わる高セキュリティ認証方式と、 AWSの証明書管理マネージドサービスを「社員証システム」のたとえで徹底解説

💡 最初に押さえる4つの要点

🔐
PSKは「合言葉」、証明書は「社員証」
PSKは全員同じ合言葉を使い回すのに対し、証明書は一人一枚の社員証。個別管理・個別失効が可能
📄
ACMは証明書の「総務部門」
発行・更新・配布・失効をまとめて管理するマネージドサービス。手作業ゼロで証明書ライフサイクルを自動化
🛡
パブリック証明書=公的身分証、プライベート証明書=社内ID
外向けWebサイトにはパブリック、VPN・内部通信にはプライベート証明書を使い分ける
🔄
自動更新で「期限切れ事故」を防止
ACMはパブリック証明書を自動更新。プライベート証明書もAPI連携で自動ローテーション対応

🏢 社員証システムで理解するVPN認証

VPN認証の仕組みを「会社の入退館管理」にたとえてみましょう。 PSK認証が「全員同じ合言葉で入館する方式」だとすれば、 証明書認証は「顔写真付き社員証で入館する方式」です。

社員証システム(たとえ) AWS/VPN(実際の仕組み)
🏢 会社のビル(入りたい場所) AWS VPC(接続先ネットワーク)
👥 社員(入館したい人) VPNクライアント(接続元デバイス)
💳 社員証(個人の身分証明) クライアント証明書(デバイス認証情報)
🏣 総務部門(社員証を発行・管理) ACM / プライベートCA(証明書管理)
🚪 入退館ゲート(出入りを管理) VPNエンドポイント(接続制御ポイント)
🗒 退職者リスト(無効社員証の一覧) CRL(証明書失効リスト)
📅 社員証の有効期限 証明書の有効期限(自動更新対応)

💡 ポイント:社員証(証明書)なら退職者の分だけ無効化すればよいですが、 合言葉(PSK)は一人に漏れると全員分の変更が必要になります。これがスケーラビリティの決定的な差です。

🔓 PSK認証 vs 証明書認証の比較

VPN接続の認証方式を入退館管理のたとえで比べてみましょう。

PSK認証 vs 証明書認証 ― 入退館管理で比較 ❌ PSK認証 = 合言葉方式 🏢 守衛室 合言葉:「ABCD1234」 👤 社員A 合言葉で入館 👤 社員B 同じ合言葉 👤 退職者 合言葉を知ってる! ⚠️ PSKの問題点 • 全員が同じ鍵を共有 → 1人漏洩で全体がリスク • 退職者の個別無効化が不可能 • 鍵の変更時は全ユーザーへ再配布が必要 • 誰がいつ接続したか追跡困難 ✅ 証明書認証 = 社員証方式 🏣 総務部(CA) 個別社員証を発行 🪫 社員A 固有の社員証 🪫 社員B 固有の社員証 🚫 退職者 証明書を失効 ✅ 証明書認証のメリット • 一人一枚の固有証明書 → 個別管理が可能 • 退職者の証明書だけをCRLで即座に失効 • 他のユーザーには一切影響なし • 証明書ごとに詳細な接続ログ(監査証跡)

🛠 証明書ベースVPN認証の仕組み

社員証で入館する流れを、証明書認証のプロセスに対応させて見ていきましょう。

証明書ベースVPN認証フロー(社員証での入館プロセス) 👤 VPNクライアント (社員 / 入館希望者) 🚪 Client VPN Endpoint (入退館ゲート) 🏢 AWS VPC (会社のビル内) 🏣 ACM Private CA (総務部門) 🪫 クライアント 証明書 (社員証) 🔍 証明書検証 有効期限・CA署名・ CRL照合 📋 CRL 証明書失効リスト (退職者リスト) 📜 サーバー証明書 VPN側の身分証明 (ビルの許可証) ①証明書提示 ④接続許可 事前:サーバー証明書発行 事前: インストール ②検証開始 ③CRL照合 発行 事前:CAがクライアント証明書を発行 → デバイスにインストール

💡 認証フローの流れ: ①社員(クライアント)がゲートに社員証を見せる → ②ゲートが社員証の真贋・有効期限を確認 → ③退職者リスト(CRL)に載っていないか照合 → ④問題なければ入館(VPC接続)を許可

⭐ 証明書認証の5つの特徴

🔐

公開鍵暗号化方式

PSKが「全員同じ合言葉」なのに対し、証明書は「秘密鍵+公開鍵」のペア。 社員証の本人しか持っていない署名(秘密鍵)と、 受付が確認できる情報(公開鍵)で確実に本人確認。

🗒

証明書失効管理(CRL)

退職者の社員証だけを無効にできるのと同様に、 CRL(証明書失効リスト)で個別証明書を即座に無効化。 他ユーザーへの影響はゼロ。

📈

スケーラビリティ

社員が100人でも10,000人でも、一人一枚の社員証を管理するだけ。 PSKのように鍵変更時に全員へ再配布する必要なし。 ACM Private CAで大量発行も自動化。

🔍

監査証跡

社員証のゲート通過記録と同じく、 誰がいつどの証明書で接続したかの詳細ログを記録。 CloudTrailと連携して完全な監査証跡を保持。

🔄 上記4つを支える共通原理:自動化対応 ― ACM Private CAと連携することで、証明書の発行・更新・失効を自動化。 社員証の発行・期限更新・退職時の回収を総務部門が一括で管理するのと同じです。

📄 AWS Certificate Manager(ACM)での証明書管理

ACMはSSL/TLS証明書を管理するAWSマネージドサービスです。 会社の総務部門が社員証の発行から更新、廃棄までを一手に担うのと同じ役割を果たします。

証明書の種類

🌐 パブリック証明書

= 公的な身分証明書(パスポート)

  • 第三者認証局(Amazon Trust Services)が発行
  • Webサイト・API等の外部公開サービスで使用
  • ブラウザに信頼されている(緑の鍵マーク)
  • ACMで無料発行・自動更新

🔒 プライベート証明書

= 社内専用の社員証

  • 自社の内部認証局(ACM Private CA)が発行
  • VPN認証・内部システム間通信で使用
  • 社外では通用しない(自社内でのみ有効)
  • ACM Private CA料金が発生(月額\$400/CA)
ACM証明書管理の全体像 ― 総務部門のワークフロー 🏣 ACM(総務部門) 証明書の発行・更新・配布・失効を一元管理 パブリック証明書の配布先 ⚖️ ELB/ALB ロードバランサー 🌐 CloudFront CDN配信 🔗 API Gateway API管理 🌱 Beanstalk アプリ環境 プライベート証明書の配布先 🔒 Client VPN VPNクライアント認証 🔒 内部ALB 社内通信暗号化 📡 IoT Core デバイス認証 🐳 ECS/EKS サービス間mTLS 🔄 自動更新 ― 期限切れ事故をゼロに

ACMの主要機能

🔄

自動更新

パブリック証明書は期限切れ前に自動で更新。深夜の証明書切れ事故を根絶。

🔗

AWSサービス統合

ELB、CloudFront、API Gateway等にワンクリックで証明書をアタッチ。

📋

一元管理

全証明書の状態・期限をACMコンソールで一覧管理。棚卸しも簡単。

🔗 ACMとAWSサービスの統合パターン

ACMで管理する証明書を、各AWSサービスへどう配布するかを整理します。

AWSサービス 証明書タイプ 用途 たとえ
ELB / ALB パブリック HTTPS終端 ビル正面玄関の入館証
CloudFront パブリック CDNのSSL/TLS 各支店の入館証(全国展開)
API Gateway パブリック カスタムドメインSSL 取引先との受付窓口の証明
Client VPN プライベート クライアント認証 社員証(個人認証)
IoT Core プライベート デバイス認証 設備の管理タグ
ECS / EKS プライベート サービス間mTLS 部署間の相互身分確認

🔄 証明書ライフサイクル管理

社員証の発行から廃棄までの流れと同様に、証明書にもライフサイクルがあります。

📝

①リクエスト

新入社員の社員証発行申請

②検証・発行

身元確認後に社員証を作成

📦

③配布

社員証を本人に渡す

🔄

④更新

期限前に新しい社員証に切替

🗑

⑤失効・廃棄

退職時に社員証を無効化

💡 ACMの自動化ポイント: パブリック証明書は②〜④をACMが完全自動化。プライベート証明書は ACM Private CA APIを使ってCI/CDパイプラインに組み込むことで自動化可能です。

💻 実装コード例

ACM Private CA & VPN証明書の作成

# ① Private CA を作成
aws acm-pca create-certificate-authority \
  --certificate-authority-configuration \
    '{"KeyAlgorithm":"RSA_2048",
      "SigningAlgorithm":"SHA256WITHRSA",
      "Subject":{
        "Country":"JP",
        "Organization":"MyCompany",
        "CommonName":"MyCompany VPN CA"
      }}' \
  --certificate-authority-type "ROOT"

# ② サーバー証明書を発行(VPNエンドポイント用)
aws acm-pca issue-certificate \
  --certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:123456:certificate-authority/xxx \
  --csr fileb://server.csr \
  --signing-algorithm "SHA256WITHRSA" \
  --validity '{"Value":365,"Type":"DAYS"}'

# ③ クライアント証明書を発行(VPNユーザー用)
aws acm-pca issue-certificate \
  --certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:123456:certificate-authority/xxx \
  --csr fileb://client.csr \
  --signing-algorithm "SHA256WITHRSA" \
  --validity '{"Value":90,"Type":"DAYS"}'

# ④ 証明書を失効(退職者対応)
aws acm-pca revoke-certificate \
  --certificate-authority-arn arn:aws:acm-pca:ap-northeast-1:123456:certificate-authority/xxx \
  --certificate-serial "1a:2b:3c:..." \
  --revocation-reason "CESSATION_OF_OPERATION"
AWSTemplateFormatVersion: "2010-09-09"
Description: "Certificate-based VPN with ACM Private CA"

Resources:
  # Private CA(総務部門に相当)
  VpnPrivateCA:
    Type: AWS::ACMPCA::CertificateAuthority
    Properties:
      Type: ROOT
      KeyAlgorithm: RSA_2048
      SigningAlgorithm: SHA256WITHRSA
      Subject:
        Country: JP
        Organization: MyCompany
        CommonName: MyCompany VPN CA
      RevocationConfiguration:
        CrlConfiguration:
          Enabled: true
          ExpirationInDays: 7
          S3BucketName: !Ref CrlBucket

  # CRL保管用S3バケット
  CrlBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${AWS::AccountId}-vpn-crl"

  # Client VPN エンドポイント
  ClientVpnEndpoint:
    Type: AWS::EC2::ClientVpnEndpoint
    Properties:
      Description: "Certificate-based VPN endpoint"
      ServerCertificateArn: !Ref ServerCertificate
      ClientCidrBlock: "10.100.0.0/16"
      AuthenticationOptions:
        - Type: certificate-authentication
          MutualAuthentication:
            ClientRootCertificateChainArn: !GetAtt VpnPrivateCA.Arn
      ConnectionLogOptions:
        Enabled: true
        CloudwatchLogGroup: !Ref VpnLogGroup
# Terraform: 証明書ベースVPN構成

# Private CA(総務部門)
resource "aws_acmpca_certificate_authority" "vpn_ca" {
  certificate_authority_configuration {
    key_algorithm     = "RSA_2048"
    signing_algorithm = "SHA256WITHRSA"
    subject {
      country      = "JP"
      organization = "MyCompany"
      common_name  = "MyCompany VPN CA"
    }
  }

  revocation_configuration {
    crl_configuration {
      enabled            = true
      expiration_in_days = 7
      s3_bucket_name     = aws_s3_bucket.crl.id
    }
  }

  type = "ROOT"
}

# Client VPN Endpoint
resource "aws_ec2_client_vpn_endpoint" "main" {
  description            = "Certificate-based VPN"
  server_certificate_arn = aws_acm_certificate.server.arn
  client_cidr_block      = "10.100.0.0/16"

  authentication_options {
    type                       = "certificate-authentication"
    root_certificate_chain_arn = aws_acmpca_certificate_authority.vpn_ca.arn
  }

  connection_log_options {
    enabled               = true
    cloudwatch_log_group  = aws_cloudwatch_log_group.vpn.name
  }
}

✅ ベストプラクティス vs アンチパターン

✅ ベストプラクティス

クライアント証明書の有効期限を90日以内に設定し、定期ローテーションを実施
CRL(失効リスト)をS3に公開し、VPNエンドポイントが常に最新のリストを参照できるようにする
CloudTrailでACM Private CAのAPI操作を監査ログとして記録
証明書の自動発行はCI/CDパイプラインに組み込み、手動ミスを排除
秘密鍵はAWS KMSで暗号化し、最小権限のIAMポリシーで保護

❌ アンチパターン

PSK(事前共有鍵)を全ユーザーで使い回す → 個別管理・失効が不可能
CRLを設定せずにPrivate CAを運用 → 退職者の証明書が有効なままに
証明書の有効期限を数年に設定 → 漏洩リスクの長期化
秘密鍵をソースコードやSlack等に平文で保存 → 漏洩の温床
証明書更新をカレンダーリマインダーだけに頼る → 更新忘れで障害

🔧 トラブルシューティング

⚠️ VPN接続が「認証失敗」で拒否される

症状:クライアントが接続を試みると即座に切断される

原因:クライアント証明書がCRLに登録されている、またはCAの信頼チェーンが切れている

対処:① CRLにクライアント証明書のシリアル番号が含まれていないか確認 ② CAのルート証明書がVPNエンドポイントに正しくインポートされているか確認 ③ 証明書の有効期限切れをチェック

⚠️ ACMの証明書が自動更新されない

症状:パブリック証明書の期限が迫っているが更新されない

原因:DNS検証用のCNAMEレコードが削除されている、またはドメインの所有権確認が失敗

対処:① Route 53のCNAMEレコードを確認 ② ACMコンソールで「検証状態」を確認 ③ ドメインのネームサーバー設定を確認

⚠️ Private CAの証明書発行でエラー

症状:IssueCertificate API呼び出しがAccessDeniedで失敗

原因:IAMポリシーにacm-pca:IssueCertificate権限がない、またはリソースベースポリシーの不備

対処:① IAMポリシーにacm-pcaの必要なActionが含まれているか確認 ② Private CAのリソースポリシーでRAM共有設定を確認

🎓 ANS-C01 / SAP-C02 試験対策

🔹 出題パターン①:「退職者のVPNアクセスを即座に遮断したい」→ 答えは証明書ベース認証 + CRL(証明書失効リスト)。PSKでは個別無効化不可能。

🔹 出題パターン②:「VPN認証を個別管理しつつ監査証跡を残したい」→ 答えはACM Private CA + CloudTrail。証明書ごとの発行・使用・失効をログに記録。

🔹 出題パターン③:「HTTPS証明書の管理負荷を軽減したい」→ 答えはACMパブリック証明書(無料・自動更新)。CloudFrontはus-east-1のACMのみ対応に注意。

🔹 出題パターン④:「マイクロサービス間の通信をmTLSで保護したい」→ 答えはACM Private CA + App Mesh/ECS。相互認証(mutual TLS)でサービス間を暗号化。

🔹 頻出キーワード: 「certificate-based authentication」「mutual authentication」「CRL」「Private CA」 「revocation」が問題文に出たら証明書ベース認証を疑う。

🎓 注意点:CloudFrontの証明書はus-east-1(バージニア北部)のACMで発行する必要があります。 東京リージョンのACM証明書はCloudFrontにアタッチできません。これは頻出の引っかけ問題です。

❓ よくある質問(FAQ)

ACM Private CAは月額約\$400/CAです。加えて、発行した証明書1枚ごとに\$0.75が課金されます(月1,000枚を超えると割引あり)。小規模環境では短期モード(\$50/月、7日間有効の証明書に限定)も利用できます。

インターネットに公開するWebサイトやAPIにはパブリック証明書(無料・自動更新)を使います。VPN認証・社内通信・IoTデバイス認証など、社外に公開しないサービスにはプライベート証明書を使います。「外向け=パブリック、内向け=プライベート」と覚えましょう。

テスト環境や少人数の一時的なVPN接続であればPSKも選択肢です。ただし、本番環境・大規模ユーザー・コンプライアンス要件がある場合は、証明書ベース認証が推奨されます。特に退職者管理と監査証跡の観点で証明書が圧倒的に優れています。

OCSP(Online Certificate Status Protocol)があります。CRLがリスト全体をダウンロードするのに対し、OCSPは個別の証明書の状態をリアルタイムで確認します。ACM Private CAはOCSPレスポンダーもサポートしています。大規模環境ではOCSPの方が効率的です。

はい。AWS Client VPNは「証明書認証 + Active Directory認証」の組み合わせ(二重認証)をサポートしています。証明書でデバイスを認証し、ADでユーザーを認証する構成が最もセキュアです。

📚 用語集

PSK(Pre-Shared Key)
事前共有鍵。接続する双方が同じ秘密の鍵を事前に共有する認証方式。たとえ:全員同じ合言葉。
CA(Certificate Authority)
認証局。証明書を発行する機関。たとえ:社員証を発行する総務部門。
CRL(Certificate Revocation List)
証明書失効リスト。無効化された証明書のシリアル番号一覧。たとえ:退職者名簿。
OCSP
Online Certificate Status Protocol。個別の証明書の有効/無効をリアルタイムで確認するプロトコル。
mTLS(mutual TLS)
相互TLS認証。サーバーとクライアントの双方が証明書を提示して互いに認証する方式。
ACM Private CA
AWS内部のプライベート認証局。社内専用の証明書を発行・管理するマネージドサービス。

📋 チートシート(まとめ)

🔐 PSK vs 証明書

PSK=合言葉(全員共有)、証明書=社員証(個別管理)。本番環境は証明書一択。

📄 ACMの2つの証明書

パブリック=外向け(無料・自動更新)、プライベート=内向け(\$400/月/CA)。

🗒 失効管理

CRL(リスト一括)またはOCSP(リアルタイム)。CRLはS3に配置。

🎓 試験必須知識

CloudFrontの証明書はus-east-1必須。VPN個別無効化=証明書+CRL。

🔄 自動化

パブリックはACM自動更新。プライベートはAPI+CI/CDで自動ローテーション。

🔒 セキュリティ

秘密鍵はKMSで暗号化。IAM最小権限。CloudTrailで全操作を監査。

Created by SSuzuki1063

AWS SAP Learning Resources