このトピックでは、Tink と Cloud Key Management Service(Cloud KMS)を使用してデータをローカルに暗号化し、Cloud Storage にアップロードする方法について説明します。Tink は、Google の暗号担当者とセキュリティ エンジニアが作成したオープンソースの暗号化ライブラリです。
概要
クライアント側の暗号化は、クラウドにデータを送信する前に実行する暗号化です。クライアントサイド暗号化を使用する場合、クラウドに送信する前に暗号鍵を作成して管理し、データを暗号化する必要があります。
このトピックでは、Cloud KMS の暗号鍵を使用して、Tink でクライアントサイドのエンベロープ暗号化を実装します。
このチュートリアルの Terraform ベースのブループリント バージョンは、kms-solutions GitHub リポジトリにあります。
始める前に
- 暗号化用の対称 Cloud KMS 暗号鍵を作成します。鍵の URI をメモします。後で必要になります。
- Cloud KMS で使用する Tink をインストールします。
- Cloud Storage でバケットを作成し、暗号化されたデータをアップロードします。
必要なロール
Tink で Cloud KMS 鍵を使用するために必要な権限がサービス アカウントにあることを確認するには、鍵に対する Cloud KMS CryptoKey の暗号化 / 復号(roles/cloudkms.cryptoKeyEncrypterDecrypter
)IAM ロールをサービス アカウントに付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセス権の管理をご覧ください。
管理者は、カスタムロールや他の事前定義ロールを使用して、必要な権限をサービス アカウントに付与することもできます。
Tink を使用したエンベロープ暗号化
エンベロープ暗号化では、Cloud KMS 鍵は鍵暗号鍵(KEK)として機能します。つまり、実際のデータの暗号化に使用されるデータ暗号鍵(DEK)の暗号化に使用されます。
Cloud KMS で KEK を作成した後、各メッセージを暗号化するには、次のことを行う必要があります。
- データ暗号鍵(DEK)をローカルで作成します。
- この DEK をローカルで使用してメッセージを暗号化します。
- Cloud KMS を呼び出し KEK を使用して DEK を暗号化(ラップ)します。
- 暗号化されたデータとラップされた DEK を保管します。
Tink を使用する場合、このエンベロープ暗号化プロセスを最初から実装する必要はありません。
エンベロープ暗号化に Tink を使用するには、鍵の URI と認証情報を Tink に指定します。鍵の URI は Cloud KMS の KEK を参照し、認証情報によって Tink で KEK を使用できます。Tink は、DEK を生成し、データの暗号化と DEK のラップを行います。そして、暗号化したデータとラップした DEK を含む単一の暗号テキストを返します。
Tinkは、Python、Java、C ++、およびGoで、認証付き暗号化(AEAD)プリミティブを使用したエンベロープ暗号化をサポートしています。
Tink と Cloud KMS を接続する
Tink によって生成された DEK を Cloud KMS の KEK で暗号化するには、KEK の URI を取得する必要があります。Cloud KMS では、KEK URI の形式は次のとおりです。
gcp-kms://projects/<PROJECT>/locations/<LOCATION>/keyRings/
<KEY RING>/cryptoKeys/<KEY NAME>/cryptoKeyVersions/<VERSION>
鍵へのパスを取得する方法については、Cloud KMS リソース ID の取得をご覧ください。
Tink を初期化してデータを暗号化します。
Tink は、プリミティブ(基盤となるアルゴリズムの詳細を管理する暗号構成要素)を使用しているため、タスクを安全に実行できます。各プリミティブは、特定のタスクを処理する API を提供します。ここでは AEAD を使用しているため、Tink AEAD プリミティブを使用します。
Python
Python
Cloud KMS 用のクライアント ライブラリをインストールして使用する方法については、Cloud KMS クライアント ライブラリをご覧ください。
Cloud KMS に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Java
Java
Cloud KMS 用のクライアント ライブラリをインストールして使用する方法については、Cloud KMS クライアント ライブラリをご覧ください。
Cloud KMS に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。
Tink でサポートされているプリミティブとインターフェースの詳細については、Tink のスタートガイド ページをご覧ください。
次のステップ
- Tink について学習する。
- Cloud SQL でクライアントサイド暗号化を使用する方法を確認する。