機密コンピューティングをサポートする Elastic Compute Service (ECS) インスタンスでは、機密コンピューティングアプリケーションによって実行されるデータは、レジスタとメモリの暗号化技術によって保護されます。ただし、プログラムコードとコードによって処理されるデータは、通常、クラウドディスクに暗号化されずに保存されます。この場合、Linux Unified Key Setup (LUKS) や BitLocker などのメカニズムを使用して、インスタンス内のクラウドディスク上のデータを暗号化できます。これにより、データがインスタンスのセキュリティ境界から流出する前に Alibaba Cloud とは独立して暗号化され、クラウドディスクの暗号鍵を自分で管理できます。このトピックでは、セキュリティを強化するために、機密コンピューティング対応 ECS インスタンスに接続されたクラウドディスクを暗号化する方法について説明します。このトピックでは、機密コンピューティング対応 ECS インスタンスに接続された暗号化クラウドディスクを機密クラウドディスクと呼びます。
機密コンピューティング非対応の ECS インスタンスでクラウドディスクを暗号化するには、Alibaba Cloud Elastic Block Storage (EBS) が提供する ディスク暗号化 機能を使用することをお勧めします。
暗号化の概要
暗号化の仕組み
機密クラウドディスクは、Linux の LUKS2 技術に基づいて、ブロックストレージレベルのデータ暗号化と保護を提供します。機密コンピューティング対応 ECS インスタンスに接続されたクラウドディスクに基づいて機密クラウドディスクを作成するには、次の操作を実行します。
初期化: 初期化するブロックデバイス(基盤となるクラウドディスクのパーティション)を特定します。このトピックでは、ブロックデバイスをボリュームと呼びます。Cryptpilot ツールを使用して、選択したボリュームを初期化し、後続の手順で機密データをボリュームに保存します。
重要初期化中に、ブロックデバイス上の元のデータは消去されます。誤操作を防ぐために、慎重に進んでください。
オープン: Cryptpilot を使用して、初期化されたボリュームを開きます。ECS インスタンス上に新しい仮想ブロックデバイスが作成されます。仮想ブロックデバイスに書き込まれたデータは暗号化され、基盤となるクラウドディスクに暗号文として保存されます。暗号化されたデータが仮想ブロックデバイスから読み取られると、自動的に復号化されます。暗号化と復号化は Linux カーネル内で行われ、プレーンテキストの漏洩を効果的に防ぐことができます。
暗号化アルゴリズム
機密クラウドディスクの暗号化では、鍵暗号鍵 (KEK) とマスターキー (デバイス固有キー) を使用します。
初期化中に、安全な乱数アルゴリズムを使用してマスターキーが生成されます。このキーはデータの暗号化に直接使用され、業界標準の 256 ビット高度暗号化標準 (AES) 暗号化アルゴリズムを使用します。マスターキーのシークレットとしてパスフレーズを指定できます。初期化では、キー派生アルゴリズムを使用してシークレットに基づいて KEK が生成され、KEK を使用してマスターキーが暗号化されます。
ボリュームを開くと、指定されたシークレットから KEK が生成され、ボリューム内のデータの暗号化と復号化に使用されます。このようにして、機密データを復号化できます。暗号化と復号化は、機密コンピューティング対応 ECS インスタンスの AES ハードウェアベースの暗号化機能を使用して高速化できます。これにより、暗号化によるパフォーマンスオーバーヘッドが軽減されます。
シークレットの保存方法
機密クラウドディスクは、シークレットを保存するために次の方法をサポートしています。ボリュームを開くために必要なシークレット情報を事前に構成することをお勧めします。これにより、関連付けられた ECS インスタンスの起動時にシークレット情報を入力する必要がなくなります。
ワンタイムパスワード (OTP): ボリュームを開くと、安全な一時シークレットが自動的に生成されてボリュームが初期化されます。ボリュームを個別に初期化する必要はありません。
重要ボリュームを開くたびに異なるシークレットが生成されます。OTP は、一時データディスクまたはスワップ領域のシナリオに最適です。ECS インスタンスのシャットダウン後に永続化が必要な機密データをこのタイプのボリュームに保存することはできません。
Key Management Service (KMS): シークレットを Alibaba Cloud KMS に保存します。ECS インスタンスで KMS アクセス情報を構成する必要があります。ボリュームが開かれると、ECS インスタンスは Alibaba Cloud KMS に自動的にアクセスして、ボリューム内のデータの暗号化と復号化に使用されるシークレットを取得します。この方法は、永続化が必要な機密データに最適です。
整合性サポート
機密データへの不正アクセスや開示を防ぐことに加えて、大規模言語モデル (LLM) の重みやトレーニングデータセットの保存など、特定のシナリオでは、攻撃者が機密データを改ざんするのを防ぐ必要があります。機密クラウドディスクは、関連データ付き認証暗号化 (AEAD) 暗号化モードを使用してデータ整合性サポートを提供します。
考慮事項
Trust Domain Extensions (TDX) 機密コンピューティングまたは異種機密コンピューティングをサポートする ECS インスタンスに接続されたデータディスクのみ暗号化できます。
クラウドディスクのロールバックは、データの整合性や機密性を損ないません。したがって、機密クラウドディスクソリューションはこのような攻撃を識別できません。この問題を解決するには、セキュリティ要件に基づいてアプリケーションレベルでデータバージョンを確認することをお勧めします。
手順
ステップ 1: 環境を準備する
機密コンピューティング対応 ECS インスタンスを作成します。
機密コンピューティング対応 ECS インスタンスに接続します。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。
Cryptpilot をインストールします。
sudo yum install -y cryptpilot
Cryptpilot のバージョンを確認します。
cryptpilot --version
ステップ 2: クラウドディスクを作成して接続する
既存のクラウドディスクを暗号化すると、ディスク上の元のデータが消去されます。操作を実行するために新しいデータディスクを作成することをお勧めします。
データディスクを初期化するときは、パーティションとファイルシステムのみを作成し、ディスクにファイルシステムをマウントしないでください。ファイルシステムをディスクにマウントする前に、データディスクを暗号化します。
ECS インスタンスのディスクとパーティション情報を表示します。
lsblk
次のコマンド出力は、2 つのクラウドディスクが ECS インスタンスに接続されていることを示しています。
/dev/nvme0n1
: システムディスク。/dev/nvme1n1
: 作成されたデータディスク。2 つの空のパーティション/dev/nvme1n1p1
と/dev/nvme1n1p2
があります。
ステップ 3: Ext4 ファイルシステムを使用してボリュームを作成する
一時ボリュームを閉じると、ボリューム内の機密データが消去されます。一時ボリュームは、一時データディスクまたはスワップ領域のシナリオに最適です。
永続ボリュームは、閉じられた後も機密データを保持します。永続ボリュームは、永続化が必要な機密データに最適です。
Ext4 ファイルシステムを使用して一時ボリュームを作成する
/etc/cryptpilot/volumes/data0.toml
ファイルを作成して構成します。説明構成ファイルはTom's Obvious Minimal Language (TOML) 形式です。その名前は
.toml
サフィックスを使用し、ボリューム名とは異なる場合があります。ビジネス要件に基づいて、構成ファイルの次の構成を変更します。
sudo bash -c 'cat > /etc/cryptpilot/volumes/data0.toml << EOF # ボリュームの構成。 dev = "/dev/nvme1n1p1" # 使用するブロックデバイス(クラウドディスクの空のパーティション)を指定します。この例では、/dev/nvme1n1p1 を使用します。 volume = "data0" # ボリューム名を指定します。この例では、data0 を使用します。 auto_open = false # システム起動時にボリュームを自動的に開くかどうかを指定します。true は、システム起動時にボリュームが自動的に開かれることを意味し、false は手動で開く必要があることを意味します。 makefs = "ext4" # 作成するファイルシステムのタイプを指定します。この例では、Ext4 を使用します。 integrity = true # データ整合性サポートを有効にするかどうかを指定します。true は、データ整合性サポートが有効になっていることを意味し、false は無効になっていることを意味します。 # シークレットの構成。 [encrypt.otp] # シークレットの保存方法を指定します。この例では、OTP を使用します。 EOF'
ボリュームの状態を表示します。
sudo cryptpilot show
data0
ボリュームの構成情報を表示できます。Initialized 列: OTP が使用されているため、ボリュームを初期化する必要がないことを示します。
Opened 列: ボリュームが開かれていないことを示します。
ボリュームを開き、ボリュームの状態を表示します。
ボリュームを開きます。
sudo cryptpilot open data0
ボリュームの状態を表示します。
sudo cryptpilot show
次のコマンド出力では、Opened 列に True と表示され、ボリュームが開かれていることを示します。
ボリュームに対応する仮想ブロックデバイスを確認します。
sudo file -Ls /dev/mapper/data0
ボリュームが開かれると、
/dev/mapper/<ボリューム名>
ディレクトリに仮想ブロックデバイスが作成されます。
ボリュームのファイルシステムをマウントし、マウント結果を表示します。
data0
ボリュームを/mnt/
ディレクトリにマウントします。sudo mkdir -p /mnt/data0 sudo mount -t ext4 /dev/mapper/data0 /mnt/data0
マウント結果を表示します。
mount | grep data0 ls -la /mnt/data0/
次のコマンド出力は、ボリュームがマウントされ、空の Ext4 ファイルシステムが含まれていることを示しています。
ボリュームを閉じます。
重要この例では、OTP を使用します。ボリュームを閉じると、ボリュームに保存されているすべての機密データが失われます。
ボリュームを閉じる前に、ボリュームからデータを読み取り、ボリュームにデータを書き込むビジネスプロセスを停止し、ボリュームのファイルシステムをアンマウントして、ボリュームが使用されていないことを確認します。
ボリュームのファイルシステムをアンマウントします。
sudo umount /mnt/data0
ボリュームを閉じます。
sudo cryptpilot close data0
ボリュームの状態を表示します。
cryptpilot show
次のコマンド出力は、ボリュームが閉じられていることを示しています。
Ext4 ファイルシステムを使用して永続ボリュームを作成する
次のコマンドを実行して、安全な環境でボリュームの暗号化のために Base64 でエンコードされたシークレットをランダムに生成します。
sudo yum install -y coreutils head -c 256 /dev/urandom | base64 -w 0
生成されたシークレットを保存します。
Alibaba Cloud KMS インスタンスと汎用シークレットを作成します。
- 説明
セキュリティ要件に基づいて、KMS インスタンスの [鍵管理タイプ] を選択できます。この例では、[ソフトウェア鍵管理] を選択します。
KMS インスタンスは、ECS インスタンスと同じ Virtual Private Cloud (VPC) に存在する必要があります。
[シークレット名]: インスタンスに基づいて汎用シークレット名を入力します。この例では、
confidential_cloud_disk_passphrase
が使用されています。[シークレット値]: [プレーンテキスト] を選択し、前の手順で生成した Base64 でエンコードされたシークレットを入力します。
[CMK]: 前の手順で作成したソフトウェア保護キーを選択します。
アプリケーションアクセスポイント (AAP) を作成する と KMS インスタンスの認証局 (CA) 証明書を取得する。
次の情報を必ず取得してください。
アプリケーションアクセスシークレット (ClientKeyContent): デフォルトでは、この情報は clientKey_****.json 形式の名前のファイルに保存されます。
パスワード (ClientKeyPassword): デフォルトでは、この情報は clientKey_****_Password.txt 形式の名前のファイルに保存されます。
KMS インスタンスの CA 証明書: デフォルトでは、CA 証明書は PrivateKmsCA_kst-******.pem 形式の名前のファイルにダウンロードされます。
/etc/cryptpilot/volumes/data1.toml
ファイルを作成して構成します。/etc/cryptpilot/volumes/data1.toml
ファイルを作成します。ファイルを構成します。
説明構成ファイルはTOML 形式です。その名前は
.toml
サフィックスを使用し、ボリューム名とは異なる場合があります。必要に応じて、構成ファイルの次の構成を変更します。
# ボリュームの構成。 dev = "/dev/nvme1n1p2" # 使用するブロックデバイス(クラウドディスクの空のパーティション)を指定します。この例では、/dev/nvme1n1p2 を使用します。 volume = "data1" # ボリューム名を指定します。この例では、data1 を使用します。 auto_open = false # システム起動時にボリュームを自動的に開くかどうかを指定します。true は、システム起動時にボリュームが自動的に開かれることを意味し、false は手動で開く必要があることを意味します。 makefs = "ext4" # 作成するファイルシステムのタイプを指定します。この例では、Ext4 を使用します。 integrity = true # データ整合性サポートを有効にするかどうかを指定します。true は、データ整合性サポートが有効になっていることを意味し、false は無効になっていることを意味します。 # シークレットの構成。 [encrypt.kms] # シークレットの保存方法を指定します。この例では、KMS を使用します。 secret_name = "confidential_cloud_disk_passphrase" # KMS インスタンスに保存されている汎用シークレットの名前。この例では、confidential_cloud_disk_passphrase を使用します。 # アプリケーションアクセスシークレット (ClientKeyContent) ファイルの内容。clientKey_****.json という名前です。 client_key = ''' { "KeyId": "KAAP.b183152a-c3bf-43ae-9399-a101607b****", "PrivateKeyData": "MIIJ0wIBAzCCCZ8GCSqGSIb3DQE****" } ''' client_key_password = "258372e962f5204ce648bc66243f****" # パスワード (ClientKeyPassword) ファイルの内容。clientKey_****_Password.txt という名前です。 kms_instance_id = "kst-bjj67d004a85ykq80****" # KMS インスタンスの ID。 # KMS インスタンスの CA 証明書ファイルの内容。ファイル名は PrivateKmsCA_kst-******.pem 形式です。 kms_cert_pem = """ -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIJALTKwWAjvbMiMA0GCSqGSIb3DQEBCwUAMH**** -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID3zCCAsegAwIBAgIJAO8qnQyTy8/kMA0GCSqGSIb3DQEBCwUAMH**** -----END CERTIFICATE----- """
ボリュームの状態を表示します。
sudo cryptpilot show
data0
ボリュームの構成情報を表示できます。Initialized 列: ボリュームが初期化されていないことを示します。
Opened 列: ボリュームが開かれていないことを示します。
ボリュームを初期化し、ボリュームの状態を表示します。
ボリュームを初期化します。
sudo cryptpilot init data1
ボリュームの状態を表示します。
sudo cryptpilot show
次のコマンド出力では、Initialized 列に True と表示され、ボリュームが初期化されていることを示します。
ボリュームを開き、ボリュームの状態を表示します。
ボリュームを開きます。
sudo cryptpilot open data1
ボリュームの状態を表示します。
sudo cryptpilot show
次のコマンド出力では、Opened 列に True と表示され、ボリュームが開かれていることを示します。
ボリュームに対応する仮想ブロックデバイスを確認します。
sudo file -Ls /dev/mapper/data1
ボリュームが開かれると、
/dev/mapper/<ボリューム名>
ディレクトリに仮想ブロックデバイスが作成されます。
ボリュームのファイルシステムをマウントし、ファイルシステムにデータを書き込みます。
data1
ボリュームを/mnt/
ディレクトリにマウントし、/mnt/data1/data.txt
ファイルを作成して機密データを表します。sudo mkdir -p /mnt/data1 sudo mount -t ext4 /dev/mapper/data1 /mnt/data1 echo "secret data" | sudo tee /mnt/data1/data.txt > /dev/null
ボリュームを閉じて再度開き、ボリュームに書き込んだデータを確認します。
重要この例では、KMS ストレージメソッドを使用します。ボリュームを閉じても、ボリュームに保存されている機密データは失われません。
ボリュームを閉じる前に、ボリュームからデータを読み取り、ボリュームにデータを書き込むビジネスプロセスを停止し、ボリュームのファイルシステムをアンマウントして、ボリュームが使用されていないことを確認します。
ボリュームのファイルシステムをアンマウントし、ボリュームを閉じます。
sudo umount /mnt/data1 sudo cryptpilot close data1
ボリュームを再度開き、ボリュームのファイルシステムをマウントし、ボリューム内のファイルにアクセスします。
sudo cryptpilot open data1 sudo mount -t ext4 /dev/mapper/data1 /mnt/data1 cat /mnt/data1/data.txt
以前に書き込まれたデータがまだ存在することがわかります。これは、ボリュームの永続ストレージ機能を検証します。
ステップ 4: インスタンスの起動時にボリュームが自動的に開かれるように ECS インスタンスを構成する
ボリュームの構成ファイルを修正します。
インスタンスの起動時にボリュームを自動的に開くには、構成ファイルの
auto_open
フィールドの値をtrue
に変更します。(オプション) 永続ボリュームの場合、
sudo cryptpilot init <ボリューム名>
コマンドを実行してボリュームを手動で初期化してから、インスタンスの起動時にボリュームが自動的に開かれるように ECS インスタンスを構成する必要があります。Cryptpilot を起動し、システム起動時に自動的に実行するように構成します。
重要ボリュームの自動オープンCryptpilot の構成を変更するたびに、Cryptpilot を起動し、システム起動時に自動的に実行するように構成して、[ボリュームの自動オープン] 機能が有効になるようにする必要があります。
sudo systemctl enable --now cryptpilot.service
ボリュームの状態を表示します。
sudo cryptpilot show
次のコマンド出力は、ボリュームが自動的に開かれたことを示しています。
Cryptpilot の構成
デフォルトでは、Cryptpilot の以下の構成ファイルは /etc/cryptpilot/
ディレクトリに保存されます。
グローバル構成: デフォルトパスは
/etc/cryptpilot/global.toml
です。# cryptpilot ブートサービスに関連する構成。 [boot] # initrd ステージとシステムステージで cryptpilot ブートサービスを実行するときに詳細なログを表示する場合、このオプションを有効にします。 verbose = false
ボリューム構成: デフォルトパスは
/etc/cryptpilot/volumes/
です。各ボリュームは構成ファイルに対応しています。シークレットストレージタイプ: OTP
# 復号化されたデータを含む結果のボリュームの名前。`/dev/mapper/` 以下に設定されます。 volume = "data0" # 基盤となる暗号化デバイスへのパス。 dev = "/dev/nvme1n1p1" # 起動時に LUKS2 デバイスを開いてマッピングを設定するかどうか。デフォルト値は false です。 auto_open = true # ボリュームに初期化するファイルシステム。許可される値は ["swap", "ext4", "xfs", "vfat"] です。指定されていない場合、またはデバイスが「空」でない場合、つまり署名が含まれている場合、操作はスキップされます。 makefs = "ext4" # データ整合性サポートを有効にするかどうか。デフォルト値は false です。整合性はリプレイ (ロールバック) 攻撃を防ぐことはできません。 integrity = true # ワンタイムパスワード (一時ボリューム) [encrypt.otp]
シークレットストレージタイプ: KMS
# 復号化されたデータを含む結果のボリュームの名前。`/dev/mapper/` 以下に設定されます。 volume = "data0" # 基盤となる暗号化デバイスへのパス。 dev = "/dev/nvme1n1p1" # 起動時に LUKS2 デバイスを開いてマッピングを設定するかどうか。デフォルト値は false です。 auto_open = true # ボリュームに初期化するファイルシステム。許可される値は ["swap", "ext4", "xfs", "vfat"] です。指定されていない場合、またはデバイスが「空」でない場合、つまり署名が含まれている場合、操作はスキップされます。 makefs = "ext4" # データ整合性サポートを有効にするかどうか。デフォルト値は false です。整合性はリプレイ (ロールバック) 攻撃を防ぐことはできません。 integrity = true # Alibaba Cloud KMS [encrypt.kms] # KMS インスタンスの ID kms_instance_id = "kst-XXXXXXXXX" # KMS インスタンスのシークレットストアの名前。 secret_name = "XXXXXXXXX" # clientKey_****.json ファイルの内容。 client_key = ''' { "KeyId": "KAAP.XXXXXXXXX", "PrivateKeyData": "XXXXXXXXX" }''' # clientKey_****_Password.txt ファイルの内容。 client_key_password = "XXXXXXXXX" # KMS の CA 証明書 (PrivateKmsCA_kst-******.pem ファイルの内容)。 kms_cert_pem = """ -----BEGIN CERTIFICATE----- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -----END CERTIFICATE----- """