アプリケーション データの暗号化

このトピックでは、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 クイックスタートをご覧ください。

組織内で次のようにします。

  1. Secret の格納に使用する Cloud Storage バケットを含む Google Cloud プロジェクトを作成します。シークレットはオブジェクトとしてバケットに格納されます。以下の手順では、このプロジェクトを my-storage-project と呼びます。

  2. 必要に応じて、2 番目の Google Cloud プロジェクトを作成して、Secret の暗号化と復号に使用する Cloud KMS 鍵を管理します。以下の手順では、このプロジェクトは my-kms-project と呼ばれます。

    my-storage-projectmy-kms-project の両方に同じ Google Cloud プロジェクトの使用を選択できます。

  3. プロジェクトごとに、Cloud KMS API を有効にして、Cloud KMS クイックスタートの始める前にセクションの手順に従って課金を有効にします。

ユーザーの作成

Google Cloud Console でユーザーを作成してロールを付与します。詳しい手順については、Identity and Access Management クイックスタートをご覧ください。

この手順では、2 人のユーザーを作成します。key-admin は暗号鍵を管理し、key-user は鍵を使用してデータを暗号化および復号できます。

my-kms-project プロジェクトでこの手順を実行します。

  1. key-admin ユーザーを作成します。ユーザーを作成するには、my-kms-project プロジェクトで roles/resourcemanager.organizationAdmin のロールが必要です。

  2. key-adminroles/cloudkms.admin Identity and Access Management のロールを付与します。key-admin は鍵を作成して管理できます。

  3. key-user ユーザーを作成します。

  4. key-userroles/cloudkms.cryptoKeyEncrypterDecrypter IAM ロールを付与します。key-user は、鍵を使用してデータを暗号化または復号できます。

Storage バケットの作成

my-storage-project プロジェクトでこの手順を実行します。

  1. my-bucket という名前のストレージ バケットを作成します。
  2. key-user に、my-bucket ストレージ バケットの roles/storage.objectAdmin ロールを付与します。

暗号鍵の作成

この手順は、my-kms-project プロジェクトの key-admin ユーザーとして実行します。

  1. storage という名前のキーリングを作成します。キーリングの名前はプロジェクトに固有です。キーリングの名前変更や削除はできません。Google Cloud CLI を使用してキーリングを作成します。

    gcloud kms keyrings create storage \
      --location global
    
  2. 暗号化のために、storage キーリングに my-key という名前の鍵を作成します。鍵の名前はキーリングで一意になります。鍵の名前変更や削除はできませんが、その鍵バージョンは破棄できます。Google Cloud CLI を使用して鍵を作成します。初期鍵バージョンが自動的に作成され、メインのバージョンになります。

    gcloud kms keys create my-key \
     --location global \
     --keyring storage \
     --purpose encryption
    

詳細については、キーリングと鍵の作成をご覧ください。

シークレットを含むファイルの暗号化

両方のプロジェクトを使用して、key-user ユーザーとしてこの手順を実行します。

  1. ローカルマシンで、my-secret.txt という名前のファイルを作成します。このファイルには、「This is my secret」というテキストが含まれます。

    echo "This is my secret" > my-secret.txt
    
  2. 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 を使用します。

  3. 暗号化された my-secret.txt.encrypted ファイルを my-storage-project プロジェクトの my-bucket ストレージ バケットにアップロードします。gsutil コマンドを使用すると、これを行えます。

    gsutil cp my-secret.txt.encrypted gs://my-storage-bucket
    

    ストレージ バケットへオブジェクトをアップロードする詳細については、こちらをご覧ください。

  4. (省略可)ローカルマシンから平文の my-secret.txt ファイルを削除します。暗号化されていない機密データを含むファイル対して、そうすることをおすすめします。

my-storage-bucket ストレージ バケットにファイル my-secret.txt.encrypted が含まれるようになりました。このファイルは my-key 鍵を使用して暗号化されています。

シークレットを含むファイルの復号

両方のプロジェクトを使用して、key-user ユーザーとしてこれらの手順を実行します。

  1. my-bucket ストレージ バケットから my-secret.txt.encrypted ファイルをダウンロードします。gsutil コマンドを使用すると、これを行えます。

    gsutil cp gs://my-storage-bucket/my-secret.txt.encrypted .
    

    ストレージ バケットからオブジェクトをダウンロードすることの詳細については、こちらをご覧ください。

  2. less などのコマンドか、テキスト エディタを使用してファイルを表示してみます。平文のファイルではないことに注意してください。

  3. 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 を使用します。

  4. cat コマンドを使用して my-secret.txt.decrypted ファイルを読み取ります。そのコンテンツは、元の my-secret.txt のコンテンツと同一です。

    cat my-secret.txt.decrypted
    
    This is my secret.
  5. (省略可)ローカルマシンから my-secret.txt.encrypted ファイルと my-secret.txt.decrypted ファイルを削除します。

クリーンアップ

クリーンアップするには、ローカルマシンで作成したすべてのファイルを削除し、続いて [MY_KMS_PROJECT] プロジェクトと[MY_STORAGE_PROJECT] プロジェクトを削除します。

次のステップ