GoogleマネージドSSL/TLS証明書でWebサーバーを構築してみた

記事タイトルとURLをコピーする

G-gen の山崎です。 当記事では Google マネージド SSL/TLS 証明書、ロードバランサ、Compute Engine 上の Apache HTTP Server という構成のシステムを構築したので、その手順を解説します。

システム構成

今回構築したシステムの構成は、以下のとおりです。

システム構成

Google マネージド SSL/TLS 証明書は、無料かつスピーディに調達することができる、Google Cloud 提供の SSL/TLS 証明書です。この構成では、Google マネージド SSL/TLS 証明書を Cloud Load Balancing に登録することで、HTTPS プロトコルでのアクセスを可能にしています。

今回は、以下の順序で環境を構築しました。

  1. Web サーバの構築
  2. Google マネージド SSL/TLS 証明書の構築
  3. ロードバランサの構築

前提知識

今回使用する Google Cloud サービスの詳細は、以下の記事をご参照ください。

Compute Engine blog.g-gen.co.jp

Cloud Load Balancing blog.g-gen.co.jp

Google マネージド SSL/TLS 証明書 blog.g-gen.co.jp

Web サーバの構築

VM インスタンスの作成

コンソールにて、Compute Engine > VMインスタンス と移動し、「インスタンスを作成」を押下します。

以下の箇所のみ設定を行い、「作成」を押下します。

項目名 設定値
名前 test-vm
リージョン asia-northeast1
ゾーン asia-northeast1-a
マシンタイプ e2-micro
HTTP トラフィックを許可する オン
HTTPS トラフィックを許可する オン

Apache のインストール

作成した VM に SSH でログインします。

以下のコマンドで Apache HTTP Server をインストールします。

sudo apt update
sudo apt install apache2

index.html の更新

Web サーバにアクセスした際に、Hello,world が表示されるように index.html を更新します。

sudo nano /var/www/html/index.html

index.html の記述

<!DOCTYPE html>
<html>
<head>
  <title>My Website</title>
</head>
<body>
  <h1>Hello, world!</h1>
  <p>You are accessing web server.</p>
</body>
</html>

Web サーバ接続確認

VM インスタンスの外部 IP アドレスを確認します。

ブラウザを起動し、http://{IPアドレス}で接続します。 先ほど更新した index.html の内容で画面が表示されていることを確認します。 http でのアクセスとなるため、保護されていない通信と表示される可能性があります。

インスタンスグループの構築

前の手順で作成した VM を選択し、「このVMに基づいてグループを作成」を押下します。

以下の箇所のみ設定を行い、「グループを作成」を押下します。

項目名 設定値
インスタンステンプレートの名前 test-vm-template
インスタンスグループの名前 test-vm-instance-group
インスタンス数 2
ポートマッピングのポート名 http
ポートマッピングのポート番号 80

Google マネージド SSL/TLS 証明書の作成

DNS 認証を作成する

当記事では、DNS 認証を用いて、Google マネージド SSL/TLS 証明書を作成します。 まずは、DNS 認証を作成します。

gcloud certificate-manager dns-authorizations create test-dns-auth --domain="{使用するドメイン}"

CNAME レコードを登録する

先ほどのコマンドで作成した CNAME レコードを確認します。

gcloud certificate-manager dns-authorizations describe test-dns-auth

出力結果の CNAME レコードの data の値は、以降の処理で使用するため、控えておきます。

DNS 構成に CNAME レコードを追加する

CNAME レコードを、ドメインを管理している DNS ゾーンに追加します。

# トランザクションの開始
gcloud dns record-sets transaction start --zone="{DNS ゾーン名}"
  
# CNAME レコードをターゲット DNS ゾーンに追加
gcloud dns record-sets transaction add {CNAME レコードの data の値} \
    --name="_acme-challenge.{使用するドメイン}." \
    --ttl="30" \
    --type="CNAME" \
    --zone="{DNS ゾーン名}"
  
# トランザクションの終了
gcloud dns record-sets transaction execute --zone="{DNS ゾーン名}"

DNS 認証を参照する Google マネージド証明書を作成する

前の手順で作成した DNS 認証を参照する Google マネージド証明書を作成します。

gcloud certificate-manager certificates create test-cert
    --domains="{使用するドメイン}"
    --dns-authorizations=test-dns-auth

証明書の有効性を確認する

証明書自体が有効であることを確認します。以下のコマンドを実行し、STATUS が ACTIVE となっていることを確認します。

証明書の作成には、10分以上時間がかかるのでご留意ください。

gcloud certificate-manager certificates describe test-cert

ロードバランサの構築

外部 IP アドレスを予約する

ロードバランサにユーザが接続する際に使用するグローバル静的外部 IP アドレスを設定します。

gcloud compute addresses create lb-ipv4 \
    --ip-version=IPV4 \
    --network-tier=PREMIUM \
    --global

作成した IP アドレスは、以下のコマンドで確認できます。

gcloud compute addresses describe lb-ipv4 \
    --format="get(address)" \
    --global

ヘルスチェックを作成する

サービスの正常性を確認するために、ヘルスチェックを作成します。

gcloud compute health-checks create http http-basic-check \
    --port 80

バックエンドサービスを作成する

バックエンドとのつなぎ役を担うバックエンドサービスを作成します。

gcloud beta compute backend-services create web-backend-service \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTP \
    --port-name=http \
    --health-checks=http-basic-check \
    --global

インスタンスグループをバックエンドとしてバックエンドサービスに追加する

前の手順で作成したインスタンスグループをバックエンドとして、バックエンドサービスに追加します。

gcloud beta compute backend-services add-backend web-backend-service \
  --instance-group=test-vm-instance-group \
  --instance-group-zone=asia-northeast1-a \
  --global

受信リクエストをデフォルトのバックエンドサービスに転送する URL マップを作成する

受信リクエストをデフォルトのバックエンドサービスに転送するための URL マップを作成します。

gcloud beta compute url-maps create web-map-https \
  --default-service web-backend-service

ロードバランサと証明書を紐づける Certificate Map を作成する

ロードバランサと証明書を紐づけるための Certificate Map を作成します。

gcloud certificate-manager maps create test-cert-map

ドメイン名と Certificate を紐づける Certificate Map Entry を作成する

ドメイン名と Certificate を紐づけるための Certificate Map Entry を作成します。

gcloud certificate-manager maps entries create test-cert-map-entry \
  --map="test-cert-map" \
  --certificates="test-cert" \
  --hostname="{使用するドメイン}"

リクエストを URL マップに転送するターゲット HTTPS プロキシを作成する

リクエストを URL マップに転送するためのターゲット HTTPS プロキシを作成します。

gcloud compute target-https-proxies create https-lb-target-proxy \
  --url-map="web-map-https" \
 --certificate-map="test-cert-map"

受信リクエストをプロキシに転送するグローバル転送ルールを作成する

受信リクエストをプロキシに転送するためのグローバル転送ルールを作成します。

gcloud beta compute forwarding-rules create https-content-rule \
  --load-balancing-scheme=EXTERNAL_MANAGED \
  --network-tier=PREMIUM \
  --address=lb-ipv4 \
  --global \
  --target-https-proxy="https-lb-target-proxy" \
  --ports=443

DNS 構成に A レコードを追加する

ロードバランサに関連付けられた IP アドレスを元に A レコードを作成し、ドメインがロードバランサを参照するようにします。

# トランザクションの開始
gcloud dns record-sets transaction start --zone="{DNS ゾーン名}"
  
# A レコードを作成
gcloud dns record-sets transaction add {作成した外部 IP アドレス} \
    --name="{使用するドメイン}" \
    --ttl=300 \
    --type=A \
    --zone="{DNS ゾーン名}"
  
# トランザクションの終了
gcloud dns record-sets transaction execute --zone="{DNS ゾーン名}"

アクセス確認

ブラウザを起動し、https://{DNS ゾーン名} で接続します。

前の手順でアクセスした時と同様に、更新した index.html の内容で画面が表示されていることを確認できます。また、https でアクセスしているため、保護されていない通信と表示されることもありません。

ロードバランサ構築時の注意事項

ロードバランサの構築は、Google Cloud コンソールや gcloud コマンドラインで実施することができます。しかし、コンソールで実施する場合、DNS 認証で作成した Google マネージド証明書をロードバランサに登録することはできません。プルダウンメニューに表示されるのは、ロードバランサ認証で作成した Google マネージド証明書のみです。

これは2024年10月現在の Google Cloud コンソールの仕様によるもので、今後の改善が期待されます。

ロードバランサ認証で作成した証明書のみがアタッチ可能

ロードバランサ認証は、証明書のドメイン名でロードバランサに外部から HTTP(TCP 80番ポート)でアクセス可能であることをもって認証するという特性上、ロードバランサを構築完了しなければ Google マネージド証明書が作成されません

これはセキュリティ上望ましくないほか、既存の Web サイトや Web アプリケーションを Google Cloud 移行する際には許容できないことが多いといえます。このような場合は、当記事のような手順で、gcloud コマンドラインを使って DNS 認証のマネージド証明書を作成してください。

山崎 曜(記事一覧)

クラウドソリューション部

元は日系大手SIerにて金融の決済領域のお客様に対して、PM/APエンジニアとして、要件定義〜保守運用まで全工程に従事。
Google Cloud 全 11 資格保有。
フルスタックな人材を目指し、日々邁進。