はじめに (Windows)
これは はじめに の Windows 版です。統合の考え方は同一で、Oracle はバルクなテーブルおよび表領域の暗号化を引き続きローカルで AES-NI を用いて実行し、DuoKey は PKCS#11 を介してマスターキーのパスにのみ関与します。ただし、Windows では 3 つの点が実際に異なっており、いずれも誤りやすいうえ、失敗すると有用なログ出力を伴わない汎用的で分かりにくい Oracle エラーとして現れます。デプロイする前にこのページ全体をお読みください。3 つの点はいずれも、Windows 上で稼働中の Oracle Enterprise Edition インスタンスに対して検証済みです。
pkcs11.toml の正式なスキーマと、すべての DKE_PKCS11_* 上書き設定は、PKCS#11 プロバイダー構成 (pkcs11.toml) に一箇所にまとめて記載されています。
前提条件
Oracle Database
- Windows 向け Oracle Database 19c または 21c Enterprise Edition(サポートされるバージョンは Linux と同じです。はじめに を参照してください)
- Oracle Advanced Security オプションのライセンス
SYSDBAおよびADMINISTER KEY MANAGEMENTシステム権限を持つ DBA アクセス
DuoKey
- DuoKey Cockpit v2 Web インターフェイスへのアクセス
- DuoKey から提供される Windows 向け DuoKey PKCS#11 プロバイダーライブラリ (
dke_pkcs11.dll) - データベースサーバーから Cockpit ホストへの HTTPS(ポート 443) によるネットワーク接続
dke_pkcs11.dll は、C ランタイムを静的にリンクしてビルドする必要があります。
RUSTFLAGS="-C target-feature=+crt-static" cargo build --release -p dke-pkcs11
単に cargo build --release を実行しただけでは VCRUNTIME140.dll / api-ms-win-crt-*.dll が動的にリンクされ、対応する Visual C++ 再頒布可能パッケージがインストールされていないホストではロードに失敗します(Win32 エラー 126)。ビルドの確認は dumpbin /DEPENDENTS dke_pkcs11.dll で行い、これらの DLL が依存関係の一覧に現れないことを確かめてください。DuoKey が提供するビルドはすでにこの要件を満たしています。ご自身でライブラリをビルドする場合にのみ関係します。
システム
- Windows Server 2016 以降、または Windows 10/11。Oracle ソフトウェアがインストール済みで、データベースが作成済みであること
- ファイルの配置とアクセス許可の付与を行うためのローカル管理者アクセス
ステップ 1: Cockpit で Oracle TDE アプリを作成する
Linux と同一です。はじめに ステップ 1 を参照してください。デプロイバンドルをエクスポートする際は、Linux 用ではなく Windows のパスと PowerShell のインストールコマンドを得るために、Windows プラットフォームオプションを選択してください。
ステップ 2: 接続性を確認する
データベースサーバーから、Cockpit の API ホスト(フロントエンドのホストではありません)に HTTPS で到達できることを確認します。Cockpit v2 は通常、この 2 つを異なるホスト名で提供します(例: API は cockpit-api-<env>.duokey.cloud、ブラウザー UI は cockpit-<env>.duokey.cloud)。
Invoke-WebRequest -Uri "https://<cockpit-api-host>/api/apps/<app_id>/tde/pkcs11/<access_guid>" -Headers @{ Authorization = "Bearer <access_token>" }
これは JSON ({"ok":true,"status":"ready",...}) を返すはずです。代わりに 200 OK とともに HTML ページが返る場合、pkcs11.toml 内の server_url は API ではなくフロントエンドを指しています。 これは非常に起こしやすい間違いであり、Oracle がレスポンスを JSON としてパースしようとして失敗するまでは、接続が正常に動作しているように見えます。
ステップ 3: DuoKey PKCS#11 プロバイダーをインストールする — 固定のシステムドライブパスを使用する
Linux (/opt/oracle/extapi/...、ORACLE_BASE 配下に置かれます) とは異なり、Windows における Oracle の HSM ライブラリ検出は、データベースソフトウェアや ORACLE_HOME/ORACLE_BASE が実際にどこにあるかとは無関係に、システムドライブをルートとする固定パス を走査します。
C:\oracle\extapi\64\hsm\DuoKey\1.0\dke_pkcs11.dll
New-Item -ItemType Directory -Force -Path "C:\oracle\extapi\64\hsm\DuoKey\1.0"
Copy-Item dke_pkcs11.dll "C:\oracle\extapi\64\hsm\DuoKey\1.0\"
実地に確認済みです。%ORACLE_HOME%\extapi\... または %ORACLE_BASE%\extapi\... 配下に置かれたライブラリは、そのインスタンスで ORACLE_BASE がどのように構成されていても、Windows 上の Oracle によって 決してロードされません。走査されるのは、リテラルの C:\oracle\extapi\... パス(システムドライブが C: 以外の場合は、それに相当するパス)だけです。「当然そうだろう」と思えるインスタンスごとの場所にデプロイすると、ORA-28353 を伴って何も出力されないまま失敗し、ライブラリのログも一切残りません。ライブラリはロードされる以前に、そもそも発見すらされていないためです。
...\DuoKey\1.0\ 配下にファイルが複数あると(例えば .dll と、残されたバックアップコピー)、Oracle のディレクトリ検出の走査が正しく動作しないことがあります。現行のライブラリファイル 1 つだけを置いてください。
ステップ 4: 構成ファイルを配置し、Oracle サービスアカウントにアクセス権を付与する
New-Item -ItemType Directory -Force -Path "C:\oracle\dke"
Copy-Item pkcs11.toml "C:\oracle\dke\pkcs11.toml"
[System.Environment]::SetEnvironmentVariable("DKE_PKCS11_CONF", "C:\oracle\dke\pkcs11.toml", "Machine")
Windows 上の Oracle は、サービスごとの仮想アカウント — NT SERVICE\OracleService<SID> — として動作します。これは、これらのファイルを配置する際に使用したアカウントとは別のセキュリティプリンシパルです。ご使用のインスタンスの正確なアカウントを確認し、明示的にアクセス権を付与してください。
Get-WmiObject Win32_Service -Filter "Name='OracleService<SID>'" | Select-Object StartName
icacls "C:\oracle\dke" /grant "NT SERVICE\OracleService<SID>:(OI)(CI)(F)"
これを省略すると、ライブラリは自身の構成ファイルを読み取れず、C_Initialize から汎用的な CKR_GENERAL_ERROR を返します。しかもこれは 自身のロガーがセットアップされる前 に起きるため、プロバイダーのログファイルは完全に空のままになります。Oracle はこれを ORA-28407/ORA-28353 として表示しますが、アラートログには有用な情報が何も出ません。これはまさに「Oracle が何も言わずにライブラリのロードを拒否している」ように見え、Oracle のバグだと誤診して何時間も費やしてしまいがちです。キーストアのオープンが正常に失敗し、かつプロバイダーのログが空である場合は、まずこの点を確認してください。次に、<ORACLE_BASE>\diag\rdbms\<db_unique_name>\<instance>\trace\ 配下にある、失敗したセッションの通常(インシデントではない)トレースファイルで kzthsminit/C_Initialize/PKCS#11 error code の行を確認してください。アラートログよりもはるかに詳細な情報が得られます。
また、同一マシンに複数の Oracle Home をインストールした後に OracleService<SID> を再起動すると、現在のインスタンスと一致しない古いインストール由来のサービスアカウントグループ (ORA_OraDB<n>Home<m>_SVCACCTS) が残っていることがあります。「Oracle のグループらしく見える」既存の ACL エントリが実際に正しいものだと決めつけないでください。上記の Get-WmiObject コマンドで確認し、そこに表示された 正確な アカウント名に対して権限を付与してください。
ステップ 5: HSM ベースの TDE 向けに Oracle を構成する
SYSDBA として接続し、デプロイバンドルの SQL を実行します。Linux と同一で、異なるのは WALLET_ROOT のパスだけです。
ALTER SYSTEM SET WALLET_ROOT='C:\oracle\admin\<sid>\wallet' SCOPE=SPFILE;
-- Restart to apply WALLET_ROOT
SHUTDOWN IMMEDIATE;
STARTUP;
ALTER SYSTEM SET TDE_CONFIGURATION='KEYSTORE_CONFIGURATION=HSM' SCOPE=BOTH;
Windows では、Oracle が WALLET_ROOT のディレクトリを常に作成してくれるとは限りません。ディレクトリが存在しないと、このステップとはまったく無関係に見えるウォレットのオープン失敗 (ORA-28353) が後で発生します。再起動の前に、明示的に作成してください。
New-Item -ItemType Directory -Force -Path "C:\oracle\admin\<sid>\wallet"
続いて、Linux とまったく同じ手順でキーストアを開き、マスターキーを設定します。はじめに ステップ 5.2〜5.3 を参照してください(SQL は両プラットフォームで同一です)。
ステップ 6: 検証する
Linux と同一です。はじめに ステップ 6 を参照してください。これは Windows 上でエンドツーエンドに確認済みです。SET KEYSTORE OPEN、SET KEY、CREATE TABLESPACE ... ENCRYPTION、および実際の挿入/選択の一往復に加え、キーストアを閉じた状態ではデータにアクセスできない (ORA-28365) ことも確認しています。
既知の、まれに発生する、処理を妨げない Oracle 側のクラッシュ
検証中、SET KEYSTORE OPEN/ALTER SYSTEM SET TDE_CONFIGURATION=... によって、まれにインスタンスが ORA-07445 [kzthsminit_discover_load_pkcs_lib] でクラッシュすることがありました。これは、破損したレジスタを介して発生する Oracle 内部のアクセス違反であり、本プロバイダーのライブラリ、サードパーティの OpenSC モジュール、および本物の Securosys Primus バイナリのそれぞれに対して独立に再現しており、特定の PKCS#11 ライブラリに結び付くパターンは見られませんでした。この現象は非決定的で(一度クラッシュしたのとまったく同じ構成が、後には正常に完了しました)、デプロイを最後まで成功させることを 妨げませんでした。この ORA-07445 のシグネチャに遭遇した場合、それは利用者側の構成の問題ではなく、この同じまれな Oracle 側の問題である可能性が非常に高いです。単にステートメントを再実行してください。シグネチャが一致するか確認したい場合は、インシデントトレースの完全な分析について トラブルシューティング を参照してください。
次のステップ
- デプロイバンドルの例 (Windows) — 上記のバンドルエクスポート手順が生成する実際のファイル。
icaclsとライブラリパスに関するガイダンスを含みます。 - キー管理 — ローテーション、移行、バックアップとリカバリ。
- ベストプラクティス — セキュリティ、パフォーマンス、運用に関する推奨事項。
トラブルシューティング
ライブラリが一向にロードされない、ORA-28353、プロバイダーのログが空 — ほぼ必ず次のいずれかです。(1) ライブラリが固定パス C:\oracle\extapi\64\hsm\DuoKey\1.0\ に置かれていない(ステップ 3 を参照)、または (2) Oracle サービスアカウントが pkcs11.toml を読み取れない(ステップ 4 を参照)。Oracle の不具合だと決めつける前に、アラートログだけでなくセッション自身のトレースファイルで kzthsminit/PKCS#11 error code の行を確認してください。
接続確認で JSON ではなく HTML が返る — server_url が API ではなくフロントエンドのホスト名を指しています(ステップ 2 を参照)。
ORA-07445 [kzthsminit_discover_load_pkcs_lib] — 上記の「既知の、まれに発生する、処理を妨げない Oracle 側のクラッシュ」を参照してください。再実行してください。
その他のすべてのエラーコードと、Windows における調査記録の全文については、トラブルシューティング を参照してください。
サポート
- メール: [email protected]
- ドキュメント: DuoKey サポート
- ステータス: status.duokey.com