pkcs11-toolを通じてGoogle Cloud HSMを使ったAES-CBC暗号化・複合をしてみた
概要
OpenSSLとクラウドHSMやYubiKeyを連携可能にするOpenSSL Engine APIとはで述べたように、GoogleはGoogle Cloud上のHSM(Hardware Security Module)を使った署名や暗号化をPKCS#11というインターフェイスを通じて操作可能にするライブラリGoogle PKCS #11 Cloud KMS Libraryを提供している。
この記事ではPKCS#11操作用のCLIであるpkcs11-tool
を利用し、Google Cloud HSM上に用意した256 ビット AES-CBC用鍵を使った暗号化・複合をする方法を書く。
概念図
これから作る環境を改めて図にした。
pkcs11-tool
CLIはGoogleのPKCS #11 Cloud KMS Libraryを通じてGoogle Cloud上のHSMを操作するという関係性。
Libraryをインストールしただけではダメで、LibraryがGoogle CloudのAPIを呼び出す際の資格情報ADCを用意したり、どの鍵を使うかを別途設定する必要がある。
環境
OS: Ubuntu 24.04.2 LTS
pkcs11-tool
CLIはopensc
パッケージをインストールすることで使えるようになる。
$ sudo apt install opensc
Google Cloud HSM上でAES-CBC用の鍵を生成する
まずは鍵を束ねておくためのKeyRingを作成する。
作成したKeyRingを選び、次は鍵を作成する。
設定は次のような設定とした。
- 保護レベル: HSM
- 鍵のマテリアル: HSMが生成した鍵
- 目的: raw対象暗号化/複合
- アルゴリズム: 256ビットAES-CBCキー
- 破棄の予定: 1日
- テストで使う鍵はすぐに破棄しても差し支えないので、破棄の予定(実際に破棄されるまでの猶予日数)には最小値の1日を設定した。
ポイント1 - PKCS #11 Cloud KMS Libraryのダウンロード
上記URLから libkmsp11-1.6-linux-amd64-fips.tar.gz をダウンロードし解凍しておく。
cd /tmp
wget https://github.com/GoogleCloudPlatform/kms-integrations/releases/download/pkcs11-v1.6/libkmsp11-1.6-linux-amd64-fips.tar.gz
tar zxvf libkmsp11-1.6-linux-amd64-fips.tar.gz
ポイント2 - PKCS #11 Cloud KMS LibraryからどのKeyRingにアクセスするか設定する
次のような設定を記述したYAMLを /tmp/pkcs11-config.yaml
といったパスに用意する。
---
tokens:
- key_ring: "projects/my-project/locations/us/keyRings/my-key-ring"
key_ring
に指定する値は、Google CloudコンソールのKeyRing一覧画面で対象のKeyRingの三点リーダーメニューから「リソース名をコピー」で取得できる。
YAMLファイルを作り終えたら、YAMLファイルのパスをKMS_PKCS11_CONFIG
という名前の環境変数に設定する。
export KMS_PKCS11_CONFIG="/tmp/pkcs11-config.yaml"
なお、YAMLの設定値の一覧は次のURLで公開されている。
ポイント3 - PKCS#11ライブラリがGoogle Cloudにアクセスする際の認証情報ADCを用意する
gcloud CLIで次のようなコマンドを実行し、ADCをローカルPC上に用意しておく。
gcloud auth application-default login
ローカルPC上でのADC設定の詳細は次のURLが参考になる。
pkcs11-tool CLIから暗号化・複合ができることを確認する
まずは暗号化時に使うIVを16バイトで適当に作る
# IVは適当に16バイト作る
openssl rand 16 > iv.bin
暗号化は次のようにする。
# 暗号化するテキスト文を用意する
echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit" > plain.txt
# 暗号化する
pkcs11-tool --module /tmp/libkmsp11-1.6-linux-amd64-fips/libkmsp11.so \
--encrypt --mechanism AES-CBC-PAD \
--iv $(xxd -p iv.bin) \
--input-file plain.txt --output-file encrypted.pad.bin
# 暗号化されたファイルをhex dumpしてみる
xxd encrypted.pad.bin
複合は次のようにする。
# 複合
pkcs11-tool --module /tmp/libkmsp11-1.6-linux-amd64-fips/libkmsp11.so \
--decrypt --mechanism AES-CBC-PAD \
--iv $(xxd -p iv.bin) \
--input-file encrypted.pad.bin --output-file decrypted.txt
# 元の文と差が無いことを確かめる
diff decrypted.txt plain.txt
備考 - PKCS #11で本当にやりとりしているか確認する方法
PKCS #11 Spyというライブラリをpkcs11-tool CLIとGoogle PKCS #11 Cloud KMS Libraryの間に挟み込むと、CLIがどのようなPKCS #11 APIを呼び出しているのか見ることができる。
PKCS #11 Spyはopenscパッケージの中に入っている。
sudo apt-get install opensc
PKCS #11 SpyがGoogle PKCS #11 Cloud KMS Libraryを呼び出すように環境変数を設定する。
# Note: Google PKCS #11 Cloud KMS Libraryを設置した実際のパスを設定のこと。
export PKCS11SPY="/tmp/libkmsp11-1.6-linux-amd64-fips/libkmsp11.so"
最後に、CLIが暗号化・複合時に使うモジュールをPKCS #11 Spypkcs11-spy.so
にすればOK。
pkcs11-tool --module /usr/lib/x86_64-linux-gnu/pkcs11-spy.so \
--encrypt --mechanism AES-CBC-PAD \
--iv $(xxd -p iv.bin) \
--input-file plain.txt --output-file encrypted.pad.bin
なお、PKCS #11 Spyは機微な情報をログ出力するので、検証時のみ利用すること。
Discussion