Cloud HSM 鍵を使用して Apache トラフィックを処理する

このガイドでは、Debian 11(BullsEye)での TLS 署名に Cloud HSM 鍵を使用するように Apache サーバーを設定する方法について説明します。OS または Linux ディストリビューションで動作するように、これらのコマンドの変更が必要になる場合があります。

このチュートリアルの Terraform ベースのブループリント バージョンは、kms-solutions GitHub リポジトリにあります。

始める前に

前提条件として、OpenSSL のセットアップに記載されている構成を完了します。

OpenSSL のセットアップが完了したら、Apache の最新バージョンがインストールされていることを確認します。

sudo apt-get update
sudo apt-get install apache2

構成

Cloud KMS でホストされる署名鍵を作成する

OpenSSL 用に構成済みのキーリングで、Google Cloud プロジェクトの Cloud KMS EC-P256-SHA256 署名鍵を作成します。

gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
  --project "PROJECT_ID" --location "LOCATION" \
  --purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
  --protection-level "hsm"

OpenSSL で自己署名証明書を作成する

Cloud KMS でホストされる署名鍵を使用して、自己署名証明書を生成します。OpenSSL を使用すると、ファイルパスの代わりに PKCS #11 URI を使用して、ラベルで鍵を識別できます。Cloud KMS PKCS #11 ライブラリでは、鍵ラベルは CryptoKey 名です。

openssl req -new -x509 -days 3650 -subj '/CN=CERTIFICATE_NAME/' \
  DIGEST_FLAG -engine pkcs11 -keyform engine \
  -key PKCS_KEY_TYPE=KEY_IDENTIFIER > PATH_TO_CERTIFICATE

以下を置き換えます。

  • CERTIFICATE_NAME: 証明書の名前。
  • DIGEST_FLAG: 非対称署名鍵で使用されるダイジェスト アルゴリズム。鍵に応じて、-sha256-sha384、または -sha512 を使用します。
  • PKCS_KEY_TYPE: 鍵の識別に使用される識別子のタイプ。最新の鍵バージョンを使用するには、鍵の名前とともに pkcs11:object を使用します。特定の鍵バージョンを使用するには、鍵バージョンの完全なリソース ID とともに pkcs11:id を使用します。
  • KEY_IDENTIFIER: 鍵の識別子。pkcs11:object を使用している場合は、鍵の名前を使用します(例: KEY_NAME)。pkcs11:id を使用している場合は、鍵または鍵バージョンの完全なリソース ID を使用します(例: projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/KEY_VERSION)。
  • PATH_TO_CERTIFICATE: 証明書ファイルを保存するパス。

このコマンドが失敗した場合、PKCS11_MODULE_PATH が正しく設定されていないか、Cloud KMS 署名鍵を使用するための適切な権限がない可能性があります。

次のような証明書が作成されます。

-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----

Apache サーバーを設定する

  1. 自己署名証明書を保存するディレクトリを /etc/apache2 に作成します。

    sudo mkdir /etc/apache2/ssl
    sudo mv ca.cert /etc/apache2/ssl
    
  2. /etc/apache2/sites-available にある 000-default.conf 仮想ホスト構成ファイルを編集して証明書ファイルのパスを指定し、SSLEngine がオンであることを確認します。

    ポート 443 でリッスンする構成の例を次に示します。

      <VirtualHost *:443>
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/html
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            SSLEngine on
            SSLCertificateFile /etc/apache2/ssl/ca.cert
            SSLCertificateKeyFile "PKCS_KEY_TYPE=KEY_IDENTIFIER"
      </VirtualHost>
    
  3. Apache が環境変数を正しくエクスポートするように、テキスト エディタを使用して /etc/apache2/envvars ファイルに追加します。sudo を使用して root としてファイルを編集する必要がある場合があります。次の行をファイルの末尾に追加します。

    export PKCS11_MODULE_PATH="<var>PATH_TO_LIBKMSP11</var>"
    export KMS_PKCS11_CONFIG="<var>PATH_TO_PKCS11_CONFIG</var>"
    export GRPC_ENABLE_FORK_SUPPORT=1
    

    以下を置き換えます。

    • PATH_TO_LIBKMSP11: libkmsp11.so へのパス。
    • PATH_TO_PKCS11_CONFIG: pkcs11-config.yaml へのパス。

    gRPC にフォークのサポートを追加し、Apache サーバーの一部として Cloud KMS PKCS #11 ライブラリを正しく実行するには、GRPC_ENABLE_FORK_SUPPORT が必要です。

    サービス アカウント キーを使用して認証する場合は、GOOGLE_APPLICATION_CREDENTIALS 環境変数の値もエクスポートする必要があります。

サーバーを実行する

Apache SSL モジュールを有効にし、仮想ホストの構成を有効にして、DocumentRoot フォルダにテスト ウェブページを追加します。

sudo a2enmod ssl
sudo a2ensite 000-default.conf
echo '<!doctype html><html><body><h1>Hello World!</h1></body></html>' | \
  sudo tee /var/www/html/index.html

Apache サーバーを再起動し、構成が期待どおりに動作することを curl でテストします。--insecure フラグは、自己署名証明書のチェックを無視するために必要です。

sudo systemctl restart apache2
curl -v --insecure https://127.0.0.1

エラーが発生した場合は、まず Apache エラーログで原因を確認してください。認証に関する問題がエラーの原因になることがよくあります。PERMISSION_DENIED エラーが表示された場合は、完全に認証されており、認証情報ファイルに適切な権限があることを確認してください。完全に認証されていることを確認するには、次のコマンドを実行します。

gcloud auth application-default login

認証が成功したことを確認するには、出力に Credentials saved to file: [/path/to/credentials.json] という行が含まれている必要があります。