🔐

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-toolCLIはGoogleのPKCS #11 Cloud KMS Libraryを通じてGoogle Cloud上のHSMを操作するという関係性。
Libraryをインストールしただけではダメで、LibraryがGoogle CloudのAPIを呼び出す際の資格情報ADCを用意したり、どの鍵を使うかを別途設定する必要がある。

環境

OS: Ubuntu 24.04.2 LTS
pkcs11-toolCLIはopenscパッケージをインストールすることで使えるようになる。

$ sudo apt install opensc

Google Cloud HSM上でAES-CBC用の鍵を生成する

まずは鍵を束ねておくためのKeyRingを作成する。

KeyRing作成画面

作成したKeyRingを選び、次は鍵を作成する。
設定は次のような設定とした。

  • 保護レベル: HSM
  • 鍵のマテリアル: HSMが生成した鍵
  • 目的: raw対象暗号化/複合
  • アルゴリズム: 256ビットAES-CBCキー
  • 破棄の予定: 1日
    • テストで使う鍵はすぐに破棄しても差し支えないので、破棄の予定(実際に破棄されるまでの猶予日数)には最小値の1日を設定した。

鍵の作成画面

ポイント1 - PKCS #11 Cloud KMS Libraryのダウンロード

https://github.com/GoogleCloudPlatform/kms-integrations/releases
上記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で公開されている。
https://github.com/GoogleCloudPlatform/kms-integrations/blob/master/kmsp11/docs/user_guide.md#configuration

ポイント3 - PKCS#11ライブラリがGoogle Cloudにアクセスする際の認証情報ADCを用意する

gcloud CLIで次のようなコマンドを実行し、ADCをローカルPC上に用意しておく。

gcloud auth application-default login

ローカルPC上でのADC設定の詳細は次のURLが参考になる。
https://cloud.google.com/docs/authentication/set-up-adc-local-dev-environment?hl=ja

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