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