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

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

組織内に次のプロジェクトを作成します。

  1. Secret の格納に使用する Cloud Storage バケットを含む プロジェクトを作成します。 Google Cloud シークレットはオブジェクトとしてバケットに格納されます。このプロジェクトは STORAGE_PROJECT_ID と呼ばれます。

  2. 2 つ目のプロジェクトを作成して、Secret の暗号化と復号に使用する Cloud KMS 鍵を管理します。 Google Cloud このプロジェクトは KEY_PROJECT_ID と呼ばれます。

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

ユーザーの作成

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

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

KEY_PROJECT_ID プロジェクトでこの手順を実行します。

  1. 鍵管理者アカウントを作成します。

  2. 鍵管理者に roles/cloudkms.admin Identity and Access Management のロールを付与します。このロールにより、鍵管理者は鍵を作成して管理できます。

  3. キーユーザー アカウントを作成します。

  4. キーユーザーに roles/cloudkms.cryptoKeyEncrypterDecrypter IAM ロールを付与します。このロールにより、鍵ユーザーはデータを暗号化および復号できます。

Storage バケットを作成する

STORAGE_PROJECT_ID プロジェクトでこの手順を実行します。

  1. STORAGE_BUCKET という名前のストレージ バケットを作成します。
  2. STORAGE_BUCKET ストレージ バケットに対する roles/storage.objectAdmin ロールをキーユーザー アカウントに付与します。

暗号鍵の作成

この手順は、KEY_PROJECT_ID プロジェクトの鍵管理者ユーザーとして実行します。

  1. キーリングを作成します。キーリングの名前はプロジェクト内で一意にする必要があります。キーリングの名前変更や削除はできません。Google Cloud CLI を使用してキーリングを作成します。

    gcloud kms keyrings create KEY_RING \
      --location LOCATION
    

    次のように置き換えます。

    • KEY_RING: ストレージ キーリングに使用する名前(例: storage)。
    • LOCATION: キーリングを作成するロケーション。これは、Cloud Storage バケットを作成するロケーションに地理的に近い場所にする必要があります。
  2. キーリングに暗号鍵を作成します。鍵の名前はキーリング内で一意である必要があります。鍵の名前変更や削除はできませんが、その鍵バージョンは破棄できます。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 に設定します。

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

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

この手順は、両方のプロジェクトでキーユーザー アカウントとして実行します。

  1. ローカルマシンにシークレットを保存します。

    echo "SECRET_TEXT" > PATH_TO_SECRET
    

    次のように置き換えます。

    • SECRET_TEXT: 保護するシークレット(プレーンテキスト)。例: this is a secret
    • PATH_TO_SECRET: シークレットを作成するパス(例: secret.txt)。
  2. 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 を使用します。

  3. 暗号化されたシークレット ファイルをストレージ バケットにアップロードします。次の gcloud CLI コマンドを使用できます。

    gcloud storage cp PATH_TO_ENCRYPTED_SECRET gs://STORAGE_BUCKET
    

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

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

STORAGE_BUCKET ストレージ バケットに、KEY_NAME 暗号鍵を使用して暗号化された暗号化されたシークレット ファイルが含まれるようになりました。

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

両方のプロジェクトで、キーユーザー アカウントとして次の手順を実行します。

  1. 暗号化されたシークレット ファイルをストレージ バケットからダウンロードします。次の gcloud CLI コマンドを使用できます。

    gcloud storage cp gs://STORAGE_BUCKET/PATH_TO_ENCRYPTED_SECRET .
    

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

  2. 暗号化に使用したのと同じ鍵を使用してファイルを復号します。

    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 のコンテンツと同一です。

  3. 省略可: ローカルマシンから PATH_TO_ENCRYPTED_SECRET ファイルと PATH_TO_DECRYPTED_SECRET ファイルを削除します。

クリーンアップ

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

次のステップ