認証は、Azure Cloud HSM 内で安全にアクセスして操作する上で重要な側面です。 この記事では、コマンド ライン インターフェイス (CLI)、PKCS#11、Java Cryptography Extension (JCE)、OpenSSL などの認証方法について説明します。 この記事では、マルチスレッドとセッション処理のベスト プラクティスについても説明します。
Cloud HSM CLI 認証
対話型モードまたは単一コマンド モードで azcloudhsm_util などの CLI ツールを使用して認証できます。 対話型モードでは、 loginHSM コマンドを使用します。 単一コマンド モードの場合は、singlecmdとloginHSMのパラメーターを含めます。 アプリケーションが HSM 資格情報を使用していない場合は、HSM 資格情報を安全に格納することをお勧めします。
対話型モード
./azcloudhsm_util
loginHSM -u CU -s cu1 -p user1234
単一コマンド モード
sudo ./azcloudhsm_util singlecmd loginHSM -u CU -s cu1 -p user1234 findKey
PKCS#11 認証
PKCS#11 では、C_Loginを使用してセッションを開いた後、C_OpenSession API を使用してサインインします。 スロットごとに 1 回だけ C_Login を使用する必要があります (Cloud HSM クラスター)。 正常にサインインしたら、もう一度サインインしなくても、 C_OpenSession を使用して追加のセッションを開くことができます。
char pPin[256] = "cu1:user1234";
…
rv = (func_list->C_Initialize) (NULL);
rv = (func_list->C_GetTokenInfo) (slot, &token_info);
rv = (func_list->C_OpenSession) (slot, CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL, NULL, &session_rw);
rv = (func_list->C_Login) (session_rw, CKU_USER, (CK_UTF8CHAR_PTR) pPin, n_pin);
…
PKCS#11 への認証のコード例については、 PKCS#11 と Azure Cloud HSM の統合に関するガイドを参照してください。
JCE 認証
Azure Cloud HSM の JCE プロバイダーでは、暗黙的なサインイン方法と明示的なサインイン方法の両方がサポートされています。 それぞれ異なるユース ケースに適しています。
SDK が認証を自律的に管理するため、可能な限り暗黙的なサインインを使用することをお勧めします。 この方法は、アプリケーションがクラスターから切断され、再認証が必要な場合に特に便利です。 暗黙的なサインインにより、アプリケーション コードを直接制御できないプラットフォームとの統合中に、アプリケーションに資格情報を提供することも容易になります。
LoginManager lm = LoginManager.getInstance();
lm.login("PARTITION_1","cu1", "user1234");
…
lm.logout();
…
サインイン方法の詳細については、 JCE と Azure Cloud HSM の統合に関するガイドを参照してください。
OpenSSL 認証
Azure Cloud HSM に OpenSSL エンジンを使用すると、環境変数によって資格情報が提供されます。 アプリケーションが HSM 資格情報を使用していない場合は、HSM 資格情報を安全に格納することをお勧めします。 手動入力を回避するために、これらの環境変数を自動的に取得して設定するように環境を構成するのが理想的です。
export azcloudhsm_password="cu1:user1234"
export azcloudhsm_openssl_conf=/usr/local/bin/AzureCloudHSM-ClientSDK-1.0.4.0/azcloudhsm_openssl_dynamic.conf
export LD_LIBRARY_PATH=/usr/local/lib64/AzureCloudHSM-ClientSDK-1.0.4.0/:$LD_LIBRARY_PATH
…
sudo ./azcloudhsm_client azcloudhsm_client.cfg > /dev/null 2>&1 &
openssl genpkey -algorithm RSA -out private_key.pem -engine azcloudhsm_openssl
…
OpenSSL での認証の詳細については、 OpenSSL と Azure Cloud HSM の統合に関するガイドを参照してください。
マルチスレッド手法
Azure Cloud HSM ではマルチスレッド アプリケーションがサポートされていますが、それらを処理するための考慮事項があります。
-
PKCS#11:
C_Initializeを 1 回だけ使用して PKCS#11 ライブラリを初期化します。C_OpenSessionを使用して、各スレッドに独自のセッションを割り当てます。 複数のスレッドで同じセッションを使用しないでください。 -
JCE: Azure Cloud HSM プロバイダーを 1 回だけ初期化します。 スレッド間でサービス プロバイダー インターフェイス (SPI) オブジェクトのインスタンスを共有しないようにします。 たとえば、
Cipher、Signature、Digest、Mac、KeyFactory、およびKeyGeneratorオブジェクトは、それぞれのスレッド コンテキスト内でのみ使用します。
HSM 操作の統合の再試行
Microsoft は、デバイスで障害が発生した場合など、運用またはメンテナンスの目的で、Azure Cloud HSM クラスター内の HSM をスワップアウトする場合があります。 このようなシナリオに備えてアプリケーションを準備するには、クラスターに送信されるすべての操作にクライアント側の再試行ロジックを追加することをお勧めします。 このセットアップでは、置き換えや一時的なメンテナンスの停止に関係なく、失敗した操作に対する後続の再試行が成功することが予測されます。
Cloud HSM クライアント セッションの処理
Azure Cloud HSM クライアントは、アプリケーションがサインインまたはサインアウトを実行するたびに、すべての HSM セッションのサインインとサインアウトを行います。その結果、2 つ目のアプリケーションが azurecloudhsm_client を使用する場合、同じセッションを共有し、同じホストから実行されている場合は同じサインイン資格情報を継承します。
azurecloudhsm_client ツールは、どのアプリケーションがサインインを試みるかを追跡します。 これにより、適切にサインインしたアプリケーションで、認証を必要とするコマンドを実行できます。
たとえば、 azurecloudhsm_util でサインインしていて、Azure Cloud HSM プロバイダーを使用して別のターミナル ウィンドウでアプリケーションまたはキー ツールを実行しようとすると、アクティブなセッションが既に開いているため、エラーが発生します。 アプリケーションが認証のためにホスト上で実行されているazurecloudhsm_utilセッションを作成するには、アプリケーションのazurecloudhsm_client セッションを閉じる必要があります。