Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

ドメイン認可で実現する、Google Cloudマネージド証明書の高速プロビジョニング

By Chimbu ChinnaduraiJul 28, 20236 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

domain authorization provision managed certificates DoiT

オンライン通信のセキュリティとプライバシーの確保が不可欠となった現在、SSL証明書は安全な接続の確立、機密データの保護、そしてユーザーとWebサイト間の信頼関係の構築において欠かせない役割を担っています。

Google Cloud Platform (GCP) でロードバランサー向けにSSL証明書を設定する際、ドメイン所有権の検証は重要なポイントになります。従来は、ロードバランサーベースの認可が一般的な方法でした。これは、Googleマネージド SSL証明書をロードバランサーに割り当て、AレコードでドメインをロードバランサーのIPに紐付ける方式です。

ただし、ロードバランサーベースの認可によるマネージドSSL証明書のセットアップには、時間がかかりミスも起こりやすいという課題があります。第一に、TLS(SSL)証明書のプロビジョニング前に、すべての構成手順を完了させる必要があります。途中で誤りや漏れがあると、その分遅延が発生します。第二に、グローバルなDNSレコードの伝播には最大48時間かかる場合があります。その結果、SSL証明書のドメインにアクセスできない時間帯が通常10〜15分発生します。そのため、この方法は本番トラフィックが流れていない新規環境のセットアップに最も適しています。

こうした課題を解消し、ロードバランサーの構築前や他ベンダーからGoogle Cloudへの移行前にGoogleマネージド証明書を準備しておくための代替手段が、ドメイン認可です。ドメイン認可では、専用のDNSレコードを追加してドメイン所有権を検証します。これにより、ターゲットプロキシがネットワークトラフィックを処理できる状態になる前から、証明書を事前にプロビジョニングできます。その結果、サードパーティ製ソリューションからGoogle Cloudへのダウンタイムゼロ移行が可能となり、よりスムーズな移行を実現できます。

ロードバランサー認可とドメイン認可の違いは、以下のをご覧ください。

domain-authorization-doit

本記事では、ドメイン認可のセットアップ方法と、これを使ってCertificate Managerで新しい証明書を作成する手順を解説します。

前提条件

  • Cloud DNSのパブリックDNSゾーン

ドメイン認可は、他のDNSプロバイダーや でも利用可能です。

  • GCPプロジェクトでCertificate Manager APIが有効化されていること
  • gcloud CLI

本記事では、Cloud DNSのパブリックゾーン chimbuc.dns.doit-playground.com を使用します。

domain-authorization-gcp

DNS認可のセットアップ

  • 必要な環境変数を設定します。
export PROJECT_ID="your-project-id"
export REGION="your-region" # ex: us-central1
export DOMAIN_NAME="domain-name-for-the-certificate" # ex: example.chimbuc.dns.doit-playground.com
export DOMAIN_AUTHORIZATION_NAME="dns-authorization-resource-name" # ex: dns-authorization-example
export CLOUD_DNS_ZONE_NAME="your-cloud-dns-zone" # ex: chimbuc.dns.doit-playground.com.
export CERTIFICATE_NAME="certificate-manager-cert-name" # ex: example-chimbuc-dns-doit-playground-com
export CERTIFICATE_MAP_NAME="certificate-map-name" # ex: example-dns-authorization-cert-map
export CERTIFICATE_MAP_ENTRY_NAME="certificate-map-entry" # ex: example-dns-authorization-cert-map-entry
  • ドメイン用のDNS認可を作成します。1つのDNS認可は単一のホスト名のみを対象とするため、対象の証明書で使用したいホスト名ごとにDNS認可を作成する必要があります。

*.example.com のようなワイルドカード証明書のDNS認可を作成する場合は、親ドメイン( example.com など)に対してDNS認可を構成します。

gcloud certificate-manager dns-authorizations create $DOMAIN_AUTHORIZATION_NAME \
--domain="${DOMAIN_NAME}" \
--project $PROJECT_ID

provision-certificates

example.chimbuc.dns.doit-playground.com に対するDNS認可

gcloud certificate-manager dns-authorizations describe $DOMAIN_AUTHORIZATION_NAME \
--project $PROJECT_ID

provision

example.chimbuc.dns.doit-playground.com のDNS認可詳細

  • CNAMEレコードをDNS構成に追加します。Google CloudでDNSを管理している場合は本セクションの手順に従ってください。それ以外の場合は、ご利用のサードパーティ製DNSソリューションのドキュメントを参照してください。
#Initiate the DNS record transaction
gcloud dns record-sets transaction start --zone="${CLOUD_DNS_ZONE_NAME}" \
--project $PROJECT_ID
#Add the CNAME record to the target DNS zone
gcloud dns record-sets transaction add CNAME_RECORD_DATA \
--name="_acme-challenge.${DOMAIN_NAME}." \
--ttl="30" \
--type="CNAME" \
--zone="${CLOUD_DNS_ZONE_NAME}" \
--project $PROJECT_ID
#Execute the DNS record transaction to save your changes
gcloud dns record-sets transaction execute --zone="${CLOUD_DNS_ZONE_NAME}" \
--project $PROJECT_ID

managed-certificates

DNS構成

DNS認可を使ったGoogleマネージド証明書の作成

  • DNS認可を構成したドメイン向けに証明書を作成します。Googleマネージド証明書はグローバルロケーションでのみ作成可能です。
gcloud certificate-manager certificates create $CERTIFICATE_NAME \
--domains="${DOMAIN_NAME}" \
--dns-authorizations="${DOMAIN_AUTHORIZATION_NAME}" \
--project $PROJECT_ID

gcp-managed-certificates

managed

証明書のプロビジョニングには数分かかります。完了するとステータスがactiveに変わります。Pendingのまま長く変化がない場合は、証明書名をクリックして失敗の理由を確認してください。

  • 証明書のステータスを確認します。
gcloud certificate-manager certificates describe $CERTIFICATE_NAME --project $PROJECT_ID

google-managed-certificate

作成した証明書をロードバランサーにデプロイするには、ホスト名ごとに証明書を割り当てる1つ以上の証明書マップエントリを参照する証明書マップを作成する必要があります。詳しくはHow Certificate Manager Worksをご覧ください。

  • 証明書マップを作成します。
gcloud certificate-manager maps create $CERTIFICATE_MAP_NAME --project $PROJECT_ID

gcloud-compute-instance-groups-managed-create

証明書マップ

  • ドメイン用の証明書マップエントリを作成します。
gcloud certificate-manager maps entries create $CERTIFICATE_MAP_ENTRY_NAME \
--map="${CERTIFICATE_MAP_NAME}" \
--certificates="${CERTIFICATE_NAME}" \
--hostname="${DOMAIN_NAME}" \
--project $PROJECT_ID

gcp-load-balancer

証明書マップエントリ

証明書マップエントリのプロビジョニングには数分かかり、完了するとステータスがactiveに変わります。

gcloud certificate-manager maps entries describe $CERTIFICATE_MAP_ENTRY_NAME \
--map="${CERTIFICATE_MAP_NAME}" \
--project $PROJECT_ID

create-https-proxy

サンプルアプリケーションのデプロイ

  • マネージドインスタンスグループを作成し、Apacheをインストールします。
#Create an instance template.
gcloud compute instance-templates create web-app-instance-template \
--region=$REGION \
--project $PROJECT_ID \
--network=default \
--subnet=default \
--tags=allow-health-check \
--image-family=debian-10 \
--image-project=debian-cloud \
--metadata=startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
a2ensite default-ssl
a2enmod ssl
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://metadata.google.internal/computeMetadata/v1/instance/name)"
echo "Page served from: $vm_hostname" | \
tee /var/www/html/index.html
systemctl restart apache2'
#Create the managed instance group based on the template.
gcloud compute instance-groups managed create web-app-instance-group \
--template=web-app-instance-template \
--size=1 \
--zone="${REGION}"-b \
--project $PROJECT_ID
#Add a named port to the instance group
gcloud compute instance-groups set-named-ports web-app-instance-group \
--named-ports http:80 \
--zone "${REGION}"-b \
--project $PROJECT_ID
  • Google Cloudのヘルスチェックシステムからのトラフィックを許可するファイアウォールルールを作成します。
gcloud compute firewall-rules create fw-allow-health-check \
--network=default \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=allow-health-check \
--rules=tcp:80 \
--project $PROJECT_ID

certificate-map

サンプルインスタンス

証明書をロードバランサーへデプロイ

  • ロードバランサーのリソースを作成します。
#Reserve an external ip
gcloud compute addresses create external-lb-ipv4 \
--ip-version=IPV4 \
--network-tier=PREMIUM \
--global \
--project $PROJECT_ID
#Create a health check
gcloud compute health-checks create http http-basic-check \
--port 80 \
--project $PROJECT_ID
#Create a backend service
gcloud compute backend-services create web-app-backend-service \
--load-balancing-scheme=EXTERNAL \
--protocol=HTTP \
--port-name=http \
--health-checks=http-basic-check \
--global \
--project $PROJECT_ID
#Add the instance group as the backend to the backend service.
gcloud compute backend-services add-backend web-app-backend-service \
--instance-group=web-app-instance-group \
--instance-group-zone="${REGION}"-b \
--global \
--project $PROJECT_ID
#create a URL map to route the incoming requests to the default backend service
gcloud compute url-maps create web-app-url-map-https \
--default-service web-app-backend-service \
--project $PROJECT_ID
  • URLマップへリクエストをルーティングするターゲットHTTPSプロキシを作成し、証明書マップをターゲットプロキシに紐付けます。
gcloud compute target-https-proxies create https-lb-proxy \
--url-map=web-app-url-map-https \
--certificate-map="${CERTIFICATE_MAP_NAME}" \
--project $PROJECT_ID

gcp-tls

ターゲットHTTPSプロキシに証明書が紐付けられた状態

  • 受信リクエストをプロキシへルーティングするグローバル転送ルールを作成します。
gcloud compute forwarding-rules create web-app-https-fw-rule \
--load-balancing-scheme=EXTERNAL \
--network-tier=PREMIUM \
--address=external-lb-ipv4 \
--global \
--target-https-proxy=https-lb-proxy \
--ports=443 \
--project $PROJECT_ID

gcp-security

外部LBの構成

  • Cloud DNSにドメイン用のレコードセットを作成し、エンドポイントへアクセスします。

setting-up-ssl-certificates-in-google-cloud-platform

example.chimbuc.dns.doit-playground.com のAレコード

setting-up-managed-ssl-certificates-through-load-balancer-based-authorization

Google Cloud Platform (GCP) でドメイン認可を活用すれば、従来のロードバランサーベースの認可方式に比べて、SSL証明書のプロビジョニング速度を大幅に高められます。本記事で解説した手順に沿って進めれば、ドメイン認可のセットアップ、新しいTLS証明書の作成、そしてGCP環境のセキュリティ強化を効率的に実現できます。ダウンタイムを最小限に抑え、よりスムーズな移行を可能にするアプローチです。