CloudHSM を KMS のカスタムキーストアとして使用してみた
AWS CloudHSM key stores - AWS Key Management Service
CloudHSM を使ったことがなかったのでチュートリアルとしてやってみました。
前提
- AdministratorAccess 権限を付与した IAM ロールにスイッチロールして作業
- プライベートサブネットが 2 つ以上ある VPC を作成済み
- AdministratorAccess 権限を付与した EC2 インスタンスプロファイルを作成済み
- Cloud9 環境をデフォルト設定で作成済み
手順概要
Getting started with AWS CloudHSM - AWS CloudHSM
基本的には上記ドキュメント通りに進めていきます。
- IAM ユーザーの作成 (スキップ)
- VPC の作成 (スキップ)
- CloudHSM クラスターの作成
- CloudHSM クラスターのセキュリティグループの確認
- EC2 インスタンスの作成
- EC2 インスタンスのセキュリティグループの設定
- CloudHSM で HSM を作成
- CloudHSM クラスターの HSM の ID と信頼性の確認 (スキップ)
- CloudHSM クラスターの初期化
- CloudHSM CLI のインストール
- CloudHSM クラスターのアクティブ化
- クライアントと CloudHSM 間の相互 TLS の有効化 (スキップ)
- HSM の追加
- KMS でカスタムキーストア作成
- KMS で CMK 作成
- EBS を CMK で暗号化
1. IAM ユーザーの作成 (スキップ)
Create IAM administrative groups for AWS CloudHSM - AWS CloudHSM
IAM のセットアップについては上記ドキュメントをご参照ください。
前提に記載した通り、本ブログでは AdministratorAccess 権限を付与した IAM ロールにスイッチロールして作業します。
2. VPC の作成 (スキップ)
Create a virtual private cloud (VPC) for AWS CloudHSM - AWS CloudHSM
VPC のセットアップについては上記ドキュメントをご参照ください。
本ブログではパブリックサブネットとプライベートサブネットが 3 つずつある VPC を作成済みです。
3. CloudHSM クラスターの作成
Create a cluster in AWS CloudHSM - AWS CloudHSM
CloudHSM コンソールからクラスターを作成します。
-
VPC は作成済みの VPC を選択
-
アベイラビリティーゾーンではプライベートサブネットを 2 つ設定
-
HSM タイプはデフォルト
-
ネットワークタイプはデフォルト
-
クラスターソースは「新しいクラスターの作成」
-
バックアップ保持期間は 7 日
-
タグはなし
プレビューで問題なければクラスターを作成します。
なお、クラスターの作成には数分かかります。
4. CloudHSM クラスターのセキュリティグループの確認
Review the security group for your cluster in AWS CloudHSM - AWS CloudHSM
cloudhsm-cluster-clusterID-sg
という名称のセキュリティグループが作成されていることを確認します。
後述の EC2 インスタンスのセキュリティグループの設定の手順で EC2 インスタンスのセキュリティグループとの通信を許可するため、この時点ではセキュリティグループの存在確認のみとします。
5. EC2 インスタンスの作成
Launch an Amazon EC2 client instance for interacting with AWS CloudHSM - AWS CloudHSM
上記ドキュメントを参考に EC2 インスタンスを起動します。
なお、今回はキーペアを作成せずに EC2 Instance Connect で接続します。
- AMI: デフォルトで選択されている Amazon Linux 2023 AMI
- インスタンスタイプ: t2.micro
- キーペア: キーペアなしで続行
- VPC: 手順 2 で作成した VPC
- サブネット: 手順 2 で作成したパブリックサブネット
- パブリック IP の自動割り当て: 有効化
- セキュリティグループ: 既存のセキュリティグループを選択する
- VPC のデフォルトセキュリティグループを選択
- IAM インスタンスプロファイル: AdministratorAccess を付与した EC2 インスタンスプロファイルを選択
6. EC2 インスタンスのセキュリティグループの設定
Configure the Client Amazon EC2 instance security groups for AWS CloudHSM - AWS CloudHSM
EC2 インスタンスのセキュリティグループのインバウンドルールに以下のルールを追加します。
- タイプ: カスタム TCP
- ポート範囲: 2223-2225
- ソース: カスタム
- 手順 4 で確認した CloudHSM のセキュリティグループ
- 手順 4 で確認した CloudHSM のセキュリティグループ
手順 4 で確認した CloudHSM のセキュリティグループのインバウンドルールに以下のルールを追加します。
- タイプ: カスタム TCP
- ポート範囲: 2223-2225
- ソース: カスタム
- 上記 EC2 インスタンスのセキュリティグループ
- 上記 EC2 インスタンスのセキュリティグループ
7. CloudHSM で HSM を作成
Create an HSM in AWS CloudHSM - AWS CloudHSM
手順 3 で作成したクラスターを初期化します。
クラスターのサブネットのいずれかを選択して作成します。
なお、HSM の作成には数分かかります。
8. CloudHSM クラスターの HSM の ID と信頼性の確認 (スキップ)
Verify the identity and authenticity of your cluster's HSM in AWS CloudHSM (optional) - AWS CloudHSM
今回はスキップしますが、信頼性の確認が必要な場合は上記ドキュメントに沿って実施してください。
9. CloudHSM クラスターの初期化
Initialize the cluster in AWS CloudHSM - AWS CloudHSM
HSM の作成後に証明書をダウンロードできるようになったら、クラスター CSR をダウンロードして続行します。
Cloud9 環境のターミナルを開き、以下のコマンドで秘密鍵を作成します。
$ openssl genrsa -aes256 -out customerCA.key 2048
Generating RSA private key, 2048 bit long modulus
........+++
............+++
e is 65537 (0x10001)
Enter pass phrase for customerCA.key: 任意のパスワードを入力 (test など)
Verifying - Enter pass phrase for customerCA.key: パスワード再入力
以下のコマンドで秘密鍵を使用して自己署名証明書を作成します。
$ openssl req -new -x509 -days 3652 -key customerCA.key -out customerCA.crt
Enter pass phrase for customerCA.key: 上記手順で入力したパスワードを入力
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
# デフォルト設定のまま Enter キーで進めます。
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
コンソールからダウンロードしたクラスター CSR を以下の手順で Cloud9 環境にアップロードします。
「File > Upload Local Files > Select files > ローカル環境にダウンロードした cluster-id_ClusterCsr.csr を選択」
以下のコマンドでクラスター CSR に署名します。
<cluster ID>
は手順 3 で作成した CloudHSM クラスターの ID に置換してください。
openssl x509 -req -days 3652 -in <cluster ID>_ClusterCsr.csr \
-CA customerCA.crt \
-CAkey customerCA.key \
-CAcreateserial \
-out <cluster ID>_CustomerHsmCertificate.crt
Signature ok
subject=/C=US/ST=CA/O=Cavium/OU=N3FIPS/L=SanJose/CN=HSM:<HSM identifier>:PARTN:<partition number>, for FIPS mode
Getting CA Private Key
Enter pass phrase for customerCA.key: 上記手順で入力したパスワードを入力
上記コマンドを実行した結果、<cluster ID>_CustomerHsmCertificate.crt というファイルが生成されていることを確認します。
$ ls
README.md cluster-qwwh5lnvyzu_ClusterCsr.csr cluster-qwwh5lnvyzu_CustomerHsmCertificate.crt customerCA.crt customerCA.key customerCA.srl
customerCA.crt と <cluster ID>_CustomerHsmCertificate.crt をローカル環境にダウンロードします。
CloudHSM コンソールで証明書をアップロードします。
もしコンソールのセッションが切れてクラスターの一覧画面に戻った場合は以下の手順で初期化の手順に戻れます。
「クラスターを選択 > 初期化 > クラスター CSR をダウンロード > 続行」
証明書のアップロードで「クラスター証明書」を選択し、<cluster ID>_CustomerHsmCertificate.crt をアップロードします。
「証明書の発行」を選択し、customerCA.crt をアップロードします。
「アップロードと初期化」ボタンをクリックします。
なお、クラスターの初期化には数分かかります。
10. CloudHSM CLI のインストール
Install and configure CloudHSM CLI - AWS CloudHSM
手順 5 で作成した EC2 インスタンスに CloudHSM CLI をインストールします。
インストールコマンドは OS ごとに異なるため、実行コマンドについては上記ドキュメントをご参照ください。
今回は Amazon Linux 2023 の手順を実行します。
EC2 には EC2 Instance Connect で接続します。
[ec2-user@ip-10-0-0-11 ~]$ wget https://s3.amazonaws.com/cloudhsmv2-software/CloudHsmClient/Amzn2023/cloudhsm-cli-latest.amzn2023.x86_64.rpm
[ec2-user@ip-10-0-0-11 ~]$ sudo yum install ./cloudhsm-cli-latest.amzn2023.x86_64.rpm
CloudHSM クラスターの初期化が完了していれば HSM の IPv4 アドレスを確認できるので、IPv4 アドレスを確認します。
HSM の IPv4 アドレスを指定して以下のコマンドを実行します。
[ec2-user@ip-10-0-0-11 ~]$ sudo /opt/cloudhsm/bin/configure-cli -a 10.0.10.242
11. CloudHSM クラスターのアクティブ化
Activate the cluster in AWS CloudHSM - AWS CloudHSM
EC2 インスタンスの所定のパスに証明書をコピーする必要があるため、以下のコマンドを実行します。
[ec2-user@ip-10-0-0-11 ~]$ sudo nano /opt/cloudhsm/etc/customerCA.crt
# customerCA.crt の内容をコピーして貼り付け
[ec2-user@ip-10-0-0-11 ~]$ cat/opt/cloudhsm/etc/customerCA.crt
-----BEGIN CERTIFICATE-----
証明書の文字列
-----END CERTIFICATE-----
以下のコマンドで CloudHSM CLI を実行します。
```bash
[ec2-user@ip-10-0-0-11 ~]$ /opt/cloudhsm/bin/cloudhsm-cli interactive
aws-cloudhsm > user list
{
"error_code": 0,
"data": {
"users": [
{
"username": "admin",
"role": "unactivated-admin",
"locked": "false",
"mfa": [],
"quorum": [],
"cluster-coverage": "full"
},
{
"username": "app_user",
"role": "internal(APPLIANCE_USER)",
"locked": "false",
"mfa": [],
"quorum": [],
"cluster-coverage": "full"
}
]
}
}
以下のコマンドで初期管理者パスワードを設定します。
aws-cloudhsm > cluster activate
Enter password:<任意のパスワード>
Confirm password:<任意のパスワード>
{
"error_code": 0,
"data": "Cluster activation successful"
}
以下のコマンドで username が admin の role が admin に変更されたことを確認します。
aws-cloudhsm > user list
{
"error_code": 0,
"data": {
"users": [
{
"username": "admin",
"role": "admin",
"locked": "false",
"mfa": [],
"cluster-coverage": "full"
},
{
"username": "app_user",
"role": "internal(APPLIANCE_USER)",
"locked": "false",
"mfa": [],
"cluster-coverage": "full"
}
]
}
}
以下のコマンドで admin としてログインします。
aws-cloudhsm > login --username admin --role admin
Enter password: <cluster activate で設定したパスワード>
{
"error_code": 0,
"data": {
"username": "admin",
"role": "admin"
}
}
以下のコマンドで kmsuser を作成します。
aws-cloudhsm > user create --username kmsuser --role crypto-user
Enter password: <任意のパスワード>
Confirm password: <任意のパスワード>
{
"error_code": 0,
"data": {
"username": "kmsuser",
"role": "crypto-user"
}
}
kmsuser は KMS のカスタムキーストアを設定するために必要なユーザーです。
Create an AWS CloudHSM key store - AWS Key Management Service
To administer your AWS CloudHSM key store, AWS KMS logs into the kmsuser crypto user (CU) account in the selected cluster.
以下のコマンドで CloudHSM CLI を終了します。
aws-cloudhsm > quit
12. クライアントと CloudHSM 間の相互 TLS の有効化 (スキップ)
Set up mutual TLS between client and AWS CloudHSM (recommended) - AWS CloudHSM
Currently this feature is exclusively available on hsm2m.medium.
今回は HSM タイプを hsm1.medium で作成したためスキップします。
13. HSM の追加
Create an AWS CloudHSM key store - AWS Key Management Service
The cluster must be configured with private subnets in at least two Availability Zones in the Region.
KMS のカスタムキーストアを設定するためには HSM を複数リージョンに作成する必要があるため、HSM を追加します。
作成済みのリージョンとは別のリージョンのサブネットを選択します。
14. KMS でカスタムキーストア作成
Create an AWS CloudHSM key store - AWS Key Management Service
KMS コンソールからカスタムキーストアを作成します。
- カスタムーキーストア名: 任意の名称
- クラスター: 手順 3 で作成した CloudHSM クラスター
- 信頼アンカー証明書: 手順 9 でダウンロードした customerCA.crt をアップロード
- kmsuser パスワード: 手順 10 で設定した kmsuser のパスワード
キーストアを CloudHSM クラスターに接続します。
接続には最大 20 分かかります。
接続済みになればカスタムキーストアの作成完了です。
15. KMS で CMK 作成
Create a symmetric encryption KMS key - AWS Key Management Service
KMS コンソールから CMK を作成します。
詳細オプションで AWS CloudHSM キーストアを選択します。
接続済みのキーストアを選択します。
任意のエイリアスを入力します。
キーの管理者および使用者を指定してキーを作成します。
作成したキーを確認すると、カスタムキーストアを使用していることがわかります。
16. EBS を CMK で暗号化
Create an Amazon EBS volume - Amazon EBS
EC2 コンソールから暗号化された EBS ボリュームを作成します。
カスタムキーストアを使用した CMK を指定できることも確認できました。
あとは通常の KMS と同じように利用できます。
AWS CloudHSM key stores - AWS Key Management Service
AWS KMS provides full console and API support for creating, using, and managing your custom key stores. You can use the KMS keys in your custom key store the same way that you use any KMS key. For example, you can use the KMS keys to generate data keys and encrypt data. You can also use the KMS keys in your custom key store with AWS services that support customer managed keys.
まとめ
今回は CloudHSM を KMS のカスタムキーストアとして使用してみました。
どなたかの参考になれば幸いです。
参考資料
- AWS CloudHSM key stores - AWS Key Management Service
- Getting started with AWS CloudHSM - AWS CloudHSM
- Create an AWS CloudHSM key store - AWS Key Management Service
- Create a symmetric encryption KMS key - AWS Key Management Service
- Create an Amazon EBS volume - Amazon EBS
- AWS CloudHSM key stores - AWS Key Management Service
Discussion