このトピックでは、Cloud Key Management Service を使用して、アプリケーション データをネットワーク経由で送信する前に、クライアント上で直接に暗号化する 1 つの方法を説明します。
この例では、暗号化されたデータは Google Cloud に送信され、Cloud Storage バケットに保存されます。Cloud Storage は、このプロセス全体を自動化する顧客管理の暗号鍵を使用したサーバー側での自動暗号化もサポートしています。Google Cloud に送信する前にアプリケーション データを保護するには、Tink ライブラリを使用することをおすすめします。
Tink ライブラリは、複数言語のクロス プラットフォーム ライブラリであり、一般的な暗号化タスク用のシンプルで不正使用されない API を提供します。このライブラリを使用して、Google Cloud データストアに入る前にデータを暗号化できます。Java、Python、C++、Go、Objective-C などの言語、およびオブジェクト ストレージ サービスとリレーショナル データベース サービスの両方をサポートしています。
この手順では、ファイルをバケットにアップロードする前に、Cloud KMS を使用して暗号化します。次に、同じデータをダウンロードして復号し、クライアント上で読めるようにします。
これらの手順に沿って操作すると、鍵とすべての暗号オペレーションは Google Cloud 内に残り、復号には Cloud KMS を使用する必要があります。未加工の対称暗号化では、データをオンプレミスでローカルに暗号化または復号することも、最初に復号することなく、暗号化されたデータを異なるライブラリやサービス プロバイダ間で移動することもできます。
始める前に
Google Cloud 組織内で、新しいプロジェクトの作成、課金の有効化、ユーザーの作成、これらのプロジェクト内で権限を管理するには、そのための権限が必要です。roles/resourcemanager.organizationAdmin
ロールを使用すると、この権限が付与されます。
設定
2 つのプロジェクトと 2 人のユーザーを使用して職務分担を確保することをおすすめします。ここで説明する手順に従うと、暗号鍵を管理するユーザーとサービスは、それらを使用するユーザーとサービスとは区別されます。一方のプロジェクトでは鍵が格納、管理され、もう一方のプロジェクトでは暗号化されたデータが Cloud Storage バケットに保存され、必要に応じて復号されます。
プロジェクトの作成
Google Cloud Console でプロジェクトを作成します。詳しい手順については、Identity and Access Management クイックスタートをご覧ください。
組織内で次のようにします。
Secret の格納に使用する Cloud Storage バケットを含む Google Cloud プロジェクトを作成します。シークレットはオブジェクトとしてバケットに格納されます。以下の手順では、このプロジェクトを my-storage-project と呼びます。
必要に応じて、2 番目の Google Cloud プロジェクトを作成して、Secret の暗号化と復号に使用する Cloud KMS 鍵を管理します。以下の手順では、このプロジェクトは my-kms-project と呼ばれます。
my-storage-project と my-kms-project の両方に同じ Google Cloud プロジェクトの使用を選択できます。
プロジェクトごとに、Cloud KMS API を有効にして、Cloud KMS クイックスタートの始める前にセクションの手順に従って課金を有効にします。
ユーザーの作成
Google Cloud Console でユーザーを作成してロールを付与します。詳しい手順については、Identity and Access Management クイックスタートをご覧ください。
この手順では、2 人のユーザーを作成します。key-admin は暗号鍵を管理し、key-user は鍵を使用してデータを暗号化および復号できます。
my-kms-project プロジェクトでこの手順を実行します。
key-admin
ユーザーを作成します。ユーザーを作成するには、my-kms-project プロジェクトでroles/resourcemanager.organizationAdmin
のロールが必要です。key-admin
にroles/cloudkms.admin
Identity and Access Management のロールを付与します。key-admin
は鍵を作成して管理できます。key-user
ユーザーを作成します。key-user
にroles/cloudkms.cryptoKeyEncrypterDecrypter
IAM ロールを付与します。key-user
は、鍵を使用してデータを暗号化または復号できます。
Storage バケットの作成
my-storage-project
プロジェクトでこの手順を実行します。
my-bucket
という名前のストレージ バケットを作成します。- key-user に、my-bucket ストレージ バケットの
roles/storage.objectAdmin
ロールを付与します。
暗号鍵の作成
この手順は、my-kms-project プロジェクトの key-admin
ユーザーとして実行します。
storage という名前のキーリングを作成します。キーリングの名前はプロジェクトに固有です。キーリングの名前変更や削除はできません。Google Cloud CLI を使用してキーリングを作成します。
gcloud kms keyrings create storage \ --location global
暗号化のために、storage キーリングに my-key という名前の鍵を作成します。鍵の名前はキーリングで一意になります。鍵の名前変更や削除はできませんが、その鍵バージョンは破棄できます。Google Cloud CLI を使用して鍵を作成します。初期鍵バージョンが自動的に作成され、メインのバージョンになります。
gcloud kms keys create my-key \ --location global \ --keyring storage \ --purpose encryption
詳細については、キーリングと鍵の作成をご覧ください。
シークレットを含むファイルの暗号化
両方のプロジェクトを使用して、key-user ユーザーとしてこの手順を実行します。
ローカルマシンで、my-secret.txt という名前のファイルを作成します。このファイルには、「This is my secret」というテキストが含まれます。
echo "This is my secret" > my-secret.txt
my-kms-project
プロジェクトの my-key 鍵を使用して my-secret.txt を暗号化します。暗号化されたファイルを mysecret.txt.encrypted に書き込みます。gcloud kms encrypt \ --location global \ --keyring storage \ --key my-key \ --plaintext-file my-secret.txt \ --ciphertext-file my-secret.txt.encrypted
データの暗号化の詳細については、データの暗号化のクイックスタートをご覧ください。
未加工の対称暗号化の場合は、代わりに
raw-encrypt
を使用します。暗号化された my-secret.txt.encrypted ファイルを my-storage-project プロジェクトの my-bucket ストレージ バケットにアップロードします。次の gcloud CLI コマンドを使用できます。
gcloud storage cp my-secret.txt.encrypted gs://my-storage-bucket
ストレージ バケットへオブジェクトをアップロードする詳細については、こちらをご覧ください。
(省略可)ローカルマシンから平文の my-secret.txt ファイルを削除します。暗号化されていない機密データを含むファイル対して、そうすることをおすすめします。
my-storage-bucket ストレージ バケットにファイル my-secret.txt.encrypted が含まれるようになりました。このファイルは my-key 鍵を使用して暗号化されています。
シークレットを含むファイルの復号
両方のプロジェクトを使用して、key-user ユーザーとしてこれらの手順を実行します。
my-bucket ストレージ バケットから my-secret.txt.encrypted ファイルをダウンロードします。次の gcloud CLI コマンドを使用できます。
gcloud storage cp gs://my-storage-bucket/my-secret.txt.encrypted .
ストレージ バケットからオブジェクトをダウンロードすることの詳細については、こちらをご覧ください。
less
などのコマンドか、テキスト エディタを使用してファイルを表示してみます。平文のファイルではないことに注意してください。my-secret.txt の暗号化に使用した同じ鍵で、my-secret.txt.encrypted を復号し、復号したデータを my-secret.txt.decrypted という名前の新しい平文ファイルに保存します。
gcloud kms decrypt --location global \ --keyring storage \ --key my-key \ --ciphertext-file my-secret.txt.encrypted \ --plaintext-file my-secret.txt.decrypted
データの復号の詳細については、データの暗号化のクイックスタートをご覧ください。
未加工の対称暗号化の場合は、代わりに
raw-decrypt
を使用します。cat
コマンドを使用して my-secret.txt.decrypted ファイルを読み取ります。そのコンテンツは、元の my-secret.txt のコンテンツと同一です。cat my-secret.txt.decrypted
This is my secret.
(省略可)ローカルマシンから my-secret.txt.encrypted ファイルと my-secret.txt.decrypted ファイルを削除します。
クリーンアップ
クリーンアップするには、ローカルマシンで作成したすべてのファイルを削除し、続いて [MY_KMS_PROJECT]
プロジェクトと[MY_STORAGE_PROJECT]
プロジェクトを削除します。
次のステップ
- シークレット管理の詳細を読む。
- 職掌分散について学習する。
- リソースへのアクセス権の付与、変更、取り消しについて確認する。
- サービス アカウントの作成について学習する。