従来のPSK(事前共有鍵)認証に代わる高セキュリティ認証方式と、 AWSの証明書管理マネージドサービスを「社員証システム」のたとえで徹底解説
VPN認証の仕組みを「会社の入退館管理」にたとえてみましょう。 PSK認証が「全員同じ合言葉で入館する方式」だとすれば、 証明書認証は「顔写真付き社員証で入館する方式」です。
| 社員証システム(たとえ) | AWS/VPN(実際の仕組み) | |
|---|---|---|
| 🏢 | 会社のビル(入りたい場所) | AWS VPC(接続先ネットワーク) |
| 👥 | 社員(入館したい人) | VPNクライアント(接続元デバイス) |
| 💳 | 社員証(個人の身分証明) | クライアント証明書(デバイス認証情報) |
| 🏣 | 総務部門(社員証を発行・管理) | ACM / プライベートCA(証明書管理) |
| 🚪 | 入退館ゲート(出入りを管理) | VPNエンドポイント(接続制御ポイント) |
| 🗒 | 退職者リスト(無効社員証の一覧) | CRL(証明書失効リスト) |
| 📅 | 社員証の有効期限 | 証明書の有効期限(自動更新対応) |
💡 ポイント:社員証(証明書)なら退職者の分だけ無効化すればよいですが、 合言葉(PSK)は一人に漏れると全員分の変更が必要になります。これがスケーラビリティの決定的な差です。
VPN接続の認証方式を入退館管理のたとえで比べてみましょう。
社員証で入館する流れを、証明書認証のプロセスに対応させて見ていきましょう。
💡 認証フローの流れ: ①社員(クライアント)がゲートに社員証を見せる → ②ゲートが社員証の真贋・有効期限を確認 → ③退職者リスト(CRL)に載っていないか照合 → ④問題なければ入館(VPC接続)を許可
PSKが「全員同じ合言葉」なのに対し、証明書は「秘密鍵+公開鍵」のペア。 社員証の本人しか持っていない署名(秘密鍵)と、 受付が確認できる情報(公開鍵)で確実に本人確認。
退職者の社員証だけを無効にできるのと同様に、 CRL(証明書失効リスト)で個別証明書を即座に無効化。 他ユーザーへの影響はゼロ。
社員が100人でも10,000人でも、一人一枚の社員証を管理するだけ。 PSKのように鍵変更時に全員へ再配布する必要なし。 ACM Private CAで大量発行も自動化。
社員証のゲート通過記録と同じく、 誰がいつどの証明書で接続したかの詳細ログを記録。 CloudTrailと連携して完全な監査証跡を保持。
🔄 上記4つを支える共通原理:自動化対応 ― ACM Private CAと連携することで、証明書の発行・更新・失効を自動化。 社員証の発行・期限更新・退職時の回収を総務部門が一括で管理するのと同じです。
ACMはSSL/TLS証明書を管理するAWSマネージドサービスです。 会社の総務部門が社員証の発行から更新、廃棄までを一手に担うのと同じ役割を果たします。
= 公的な身分証明書(パスポート)
= 社内専用の社員証
パブリック証明書は期限切れ前に自動で更新。深夜の証明書切れ事故を根絶。
ELB、CloudFront、API Gateway等にワンクリックで証明書をアタッチ。
全証明書の状態・期限をACMコンソールで一覧管理。棚卸しも簡単。
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パイプラインに組み込むことで自動化可能です。
# ① 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 } }
症状:クライアントが接続を試みると即座に切断される
原因:クライアント証明書がCRLに登録されている、またはCAの信頼チェーンが切れている
対処:① CRLにクライアント証明書のシリアル番号が含まれていないか確認 ② CAのルート証明書がVPNエンドポイントに正しくインポートされているか確認 ③ 証明書の有効期限切れをチェック
症状:パブリック証明書の期限が迫っているが更新されない
原因:DNS検証用のCNAMEレコードが削除されている、またはドメインの所有権確認が失敗
対処:① Route 53のCNAMEレコードを確認 ② ACMコンソールで「検証状態」を確認 ③ ドメインのネームサーバー設定を確認
症状:IssueCertificate API呼び出しがAccessDeniedで失敗
原因:IAMポリシーにacm-pca:IssueCertificate権限がない、またはリソースベースポリシーの不備
対処:① IAMポリシーにacm-pcaの必要なActionが含まれているか確認 ② Private CAのリソースポリシーでRAM共有設定を確認
🔹 出題パターン①:「退職者の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にアタッチできません。これは頻出の引っかけ問題です。
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=合言葉(全員共有)、証明書=社員証(個別管理)。本番環境は証明書一択。
パブリック=外向け(無料・自動更新)、プライベート=内向け(\$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