Keyless SSL now supports FIPS 140-2 L3 hardware security module (HSM) offerings from all major cloud providers

すべての主要なクラウドプロバイダーのハードウェアセキュリティモジュールに保存されたプライベートキー暗号化が、CloudflareのグローバルエッジでHTTPS接続を保護するために使用できるようになりました。

Cloudflareは、おそらく世界のどの企業よりも多くのSSL/TLSプライベートキーを生成、保護、管理しています。プライベートキーは慎重に保護する必要があります。これが攻撃者の手に渡ると、正当なサイトになりすまし、HTTPSリクエストを復号化する可能性があるためです。このリスクを軽減するために、Cloudflareでは厳格な鍵処理手順とエッジでのレイヤー化されたソリューションを備えており、エッジはあらゆる方法で鍵を保護するように設計されています。しかし、鍵を保管できる(またはできない)場所を指定する情報セキュリティポリシーを持つ少数のお客様にとっては、これらの保護は要件を満たしていません。

こうしたお客様のために、Cloudflareでは2014年に初めてKeyless SSLをリリースしました 。このプロトコルは、当社のネットワーク内で広く使用されているものです。Cloudflareのエッジで1日に確立されるすべてのTLSハンドシェイクが、その過程でお客様のプライベートキーにアクセスするわけではありません。その代わりに、セッションの確立に必要なデータが、別のシステムに送信され、そこで必要な署名の暗号化操作が行われます。Cloudflareがアップロード、そして生成したキーについては、この別のシステムで管理していますが、お客様の中には、このキーをご自身で管理したいと考える方もいらっしゃいます。

[LOGICAL DIAGRAM SHOWING PRIVATE KEYS STORED ON HSMs BEING USED FOR TLS HANDSHAKE]

従来、キーはハンドシェイクを処理するために提供しているオープンソースのgokeylessデーモンを実行するサーバーに置かれたり、gokeylessがPKCS#11という標準プロトコルを使って連動するオンプレミスのハードウェアセキュリティモジュール (HSM) で保護されていました。しかし、金融サービス、医療、暗号通貨、その他の規制やセキュリティ重視の企業がクラウドに移行するにともない、Amazonや、Google、IBM、Microsoftに、これらの高価な箱を出荷して在庫を抱えるようにお願いするわけにはいかなくなりました。

こういったお客様の中でも特に、情報セキュリティポリシーでFIPS 140-2 レベル3検証済みのHSMが必須のお客様に向けて、Keyless SSLでクラウドホスト型HSMがサポートされるようになったことをお知らせします。サポートされるのは、Amazon Cloud HSMGoogle Cloud HSMIBM Cloud HSMMicrosoft Azure 専用 HSMおよびマネージドHSMです。CloudflareではPKCS #11 標準を実装する他のHSMもサポートしています。これには nCipher nShield ConnectやThales Lunaなどのシリーズが含まれます。

HSMの概要

HSMは、改ざんしにくく、サイドチャネル攻撃などの弱点を強化し、署名や復号化などの暗号化操作を実行するために最適化された専用のマシンです。スタンドアロンのボックスとして、サーバー挿入の拡張カードとして、または最近ではクラウドサービスとしてもデプロイできます。

ベンダーやセキュリティの専門家は、サーバー上でプライベートキーを作成した上でHSMにアップロードするのではなく、通常はキーをデバイス自体で作成する(そして決してデバイスから離さない)ことを推奨しています。HSMは、汎用サーバーよりもランダム性が保証されており、暗号化された状態でディスクに同期する前に、メモリ内のキーを保護するための特別な予防措置を講じます。プライベートキーを必要とする操作が必要な場合、サービスはHSM ベンダーが提供するライブラリを使用して、認証済みのAPI呼び出しをデバイスに発信します。

HSMとFIPS 140-2 レベル3

HSMは通常、連邦情報処理標準(FIPS)規格140-2:暗号化モジュールのセキュリティ要件と照合し、検証されます。規格には、1から4までの4つのレベルがあり、近年ますます要件が厳しくなっている承認済みのアルゴリズム、セキュリティ機能、ロールベースのアクセス制御、改ざん証拠や耐性保護に沿ってレベルを特定します。

米国国立標準技術研究所(NIST)は、これらのガイドラインを公開し、暗号モジュール検証プログラムを管理し、検証済みモジュールが検索可能なデーターベースを提供しています。これには、以下に示すサービスが含まれています。当社では、Cloudflareでそれらを使用する方法をお知らせしています。

クラウドサービスの開始

既存のKeyless SSLのお客様は、このテクノロジーをすぐにご利用いただけます。そのための手順は https://developers.cloudflare.com/ssl/keyless-ssl/hardware-security-modules をご参照ください。ソースコードはGitHub: https://github.com/cloudflare/gokeylessで入手できます。

エンドツーエンドの例:Microsoft AzureマネージドHSM

MicrosoftのAzure Key Vaultチームは、2020年9月22日にマネージドHSMをパブリックプレビューでリリースしました。このサービスは、FIPS140-2 レベル3で検証済みで、Azureストレージ、Azure SQL、Azur情報保護などのAzureサービスと統合されています。マネージドHSMのパブリックプレビューは、East Us 2(米国東部)、south Central US(米国中南部)、North Europe(北ヨーロッパ)、West Europe(西ヨーロッパ)の各リージョンでご利用いただけます。

以下の手順は、クイックスタートから取得したものです。クイックスタート:Azure CLIを使ってマネージドHSMのプロビジョニングとアクティブ化の後に、CloudflareのマネージドHSMの使用に関する手順が記載されています。コマンドは、HSMと同じリージョン (米国中南部) で作成されたUbuntu VM上で実行されています。同じ場所でCloudflare Keyless SSLデーモンもデプロイする予定です。

HSMのプロビジョニングとアクティブ化

まず、CLIを経由してログインし、サポートされているリージョンの1つで、マネージドHSMのリソースグループを作成します。サービスのプレビューステータスに基づいて、さまざまなコマンドから警告が表示される場合があります。

$ LOCATION=southcentralus; GROUPNAME=”HSMgroup”; HSMNAME=”KeylessHSM”
$ az login
$ az group create --name $GROUPNAME --location $LOCATION

次に、HSMリソースをプロビジョニングし、セキュリティードメインをダウンロードして有効化します。次の例では、ログインしたユーザーに管理者アクセス権を付与しており、別の管理者はそのユーザーがログインしているCLIから同じ oid=$ (...) コマンドを実行することでOIDを取得できます。

$ MYOID=$(az ad signed-in-user show --query objectId -o tsv)
$ OTHERADMIN_OID=...

$ az keyvault create --hsm-name $HSMNAME --resource-group $GROUPNAME --location $LOCATION --administrators $MYOID $OTHERADMIN_OID

Argument '--hsm-name' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
Argument '--administrators' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
{- Finished ..
  "id": "/subscriptions/.../resourceGroups/HSMgroup/providers/Microsoft.KeyVault/managedHSMs/Keyles
sHSM",
  "location": "southcentralus",
  "name": "KeylessHSM",
  "properties": {
    "createMode": null,
    "enablePurgeProtection": false,
    "enableSoftDelete": true,
    "hsmUri": "https://keylesshsm.managedhsm.azure.net/",
    "initialAdminObjectIds": [
      "$MYOID",
      "$OTHERADMIN_OID"
    ],
    "provisioningState": "Succeeded",
    "softDeleteRetentionInDays": 90,
    "statusMessage": "The Managed HSM is provisioned and ready to use.",
    "tenantId": "..."
  },
  "resourceGroup": "$GROUPNAME",
  "sku": {
    "family": "B",
    "name": "Standard_B1"
  },
  "tags": {},
  "type": "Microsoft.KeyVault/managedHSMs"
}

上記のコマンドから返されるhsmUriプロパティを記録しておきます。これは、仮想マシンでKeyless SSLを設定するときにすぐに必要になります。

$ HSMURI="https://keylesshsm.managedhsm.azure.net/"

HSMがプロビジョニングされたので、少なくとも3つのRSAパブリックキーを指定する必要があります。HSMは、これらのキーを使用してセキュリティードメインを暗号化し、ユーザーに返します。その後、HSMが使用できるようになります。

$ openssl req -newkey rsa:2048 -nodes -keyout cert_0.key -x509 -days 365 -out cert_0.cer
$ openssl req -newkey rsa:2048 -nodes -keyout cert_1.key -x509 -days 365 -out cert_1.cer
$ openssl req -newkey rsa:2048 -nodes -keyout cert_2.key -x509 -days 365 -out cert_2.cer
$ az keyvault security-domain download --hsm-name $HSMNAME --sd-wrapping-keys ./cert_0.cer ./cert_1.cer ./cert_2.cer --sd-quorum 2 --security-domain-file $HSMNAME-SD.json

「MSIへの接続に失敗しました」というエラーが表示され、Azureポータルからクラウドシェルを使用している場合は、既知の問題であるため、azログインを再試行します。

HSMをプロビジョニングしたら、keyvaultにプライベートキーを追加します。

$ az keyvault key import --KeylessHSM

これにより、後でKeyless YAMLファイルに追加するURIが返され、プライベートキーが保存されている場所が示されます。

HSMのプロビジョニングとアクティブ化が完了したら、Keylessデーモンをデプロイする仮想マシン(VM)を作成する必要があります。この例では、AzureでUbuntu Xenial仮想マシンを作成します。ポータルで、「仮想マシン」ページに移動し、VMを追加します。そこでは、HSM用に以前に作成したリソースグループを使用できます。最適な結果を得るには、HSM用のリージョンと同じリージョンを選択します。仮想マシンのパブリック IPを書き留めます。これを使用してサーバーにリモート接続します。

次に、仮想マシンをキーサーバーに設定します。最初に、Cloudflareパッケージリポジトリを追加する必要があります。次に、OSのパッケージリストを更新し、gokeylessサーバーをインストールします。

$ apt-get update
$ echo 'deb http://pkg.cloudflare.com/Xenial main' |
sudo tee /etc/apt/sources.list.d/cloudflare-main.list
$ curl -C - https://pkg.cloudflare.com/pubkey.gpg | sudo apt-key
$ apt-get update
$ apt-get install gokeyless

続いて、gokeyless YAMLファイルを更新します。ここでは、キーサーバーのホスト名を追加します。このホスト名には、VM、ゾーンID、オリジンCA APIキーを指すDNSレコードが必要です。ゾーンIDとオリジンCA APIキーは、Cloudflareダッシュボードで見つけられます。さらに、private_key_storesの下にあるプライベートキーのディレクトリを指すURIを指定します。

$ vim /etc/keyless/gokeyless.yaml

最後に、keylessサーバーを起動します。

$ service gokeyless start

Azureポータルに戻り、Azure VMに必要なTCPポートを開きます。VM → ネットワーキング → に移動し、インバウンドポートルールを追加します。どの送信元ポートから来るトラフィックも許可するように設定し、宛先ポートにポート2407 を指定します。

変更を保存し、Cloudflareダッシュボードに移動し、SSL証明書をアップロードします。「SSL/TLS」タブの「エッジ証明書」セクションに「Keyless SSL証明書のアップロード」が表示されます。そこで、フィールドにキーサーバーラベル、YAMLファイルのホスト名、キーサーバーポート(2407 がデフォルトポート)を入力し、SSL証明書を貼り付けます。

これでテストする準備ができました! curl-v https://zone.com を実行し、TLSハンドシェイクが正常に完了することを確認します。

Microsoft Azure専用HSM

パブリックプレビューに現在公開されているマネージドHSMサービスに加えて、Azureのお客様は、SafeNet Lunaネットワーク HSM 7 モデル A790シリーズに基づき、Microsoftの専用HSMサービスに保管されたキーを利用するよう、Cloudflareのエッジを構成できます。

Azure専用HSMは、FIPS 140-2 レベル3およびeIDAS Common Criteria EAL4+ の両方に照らし合わせて検証されます。手順に従って、HSMをデプロイした後、Azure固有のKeyless SSL手順(こちら)に従う必要があります。

Amazon Web サービス (AWS) Cloud HSM

AWS Cloud HSMでも、プライベートキーを保存するためのFIPS 140-2 レベル3検証済みのHSMを提供しています。

公式のAWS Terraform Providerでは、aws_cloudhsm_v2_clusterがサポートされるようになりました。これは、Cloudflare がサポートしているバージョンです。AWS CloudHSM クラスターをプロビジョニングした後、お客様はAWS固有のKeyless SSLの手順(こちら)に従う必要があります。

Google Cloud HSM

Google Cloud HSMは、GCPのCloud KMSをフロントエンドとして使用し、FIPS 140-2 レベル 3検証済みのHSMでのキーのホスティングが可能です。さらに、Googleでは、Googleが提供するスペースでお客様自身のHSMをホストする機能を提供しています。このオプションの詳細については、GCPアカウント担当者にお問い合わせください。

HSM内でキーリングとキーを作成したら、Google Cloud固有のKeyless SSLの手順(こちら)に従う必要があります。GCP KMSで非対称キーを使用する方法の詳細については、こちらをご覧ください。

IBM Cloud

IBM Cloud HSM 7.0は、FIPS 140-2 レベル3検証済みのHSM機能を提供します。このサービスは、SafeNet Luna A750シリーズに基づいています。

HSMのプロビジョニング後、お客様はIBM固有のKeyless SSL手順(こちら)に従う必要があります。

サポートの相談とフィードバックの提供

HSMは強力なキー保護機能を提供しますが、セットアップとデプロイが複雑になることがあります。HSMをクラウドプロバイダーにデプロイする際にサポートが必要な場合は、サポートチャネルから始めることをお勧めします。

ただし、Cloudfareのエッジと連携するHSMを構成するためのサポートが必要な場合やプロセスに関するフィードバックの提供を希望される場合は、ソリューションエンジニアリングチームに直接お問い合わせください。CloudflareのKeyless SSLスペシャリストにおつなぎいたします。