本页介绍了一种在通过网络传输数据之前,使用 Cloud Key Management Service 直接在客户端上加密应用数据的方法。
在此示例中,加密的数据会传输到 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
角色可授予此权限。
设置
我们建议使用两个项目和两个用户,以确保职责分离。如果您按照本指南中的步骤操作,则管理加密密钥的用户和服务与使用这些密钥的用户和服务不同。一个项目包含并管理密钥,另一个项目将加密数据存储在 Cloud Storage 存储分区中,并根据需要对数据进行解密。
创建项目
在 Google Cloud 控制台中创建项目。如需查看分步说明,请参阅 Identity and Access Management 快速入门。
在贵组织中创建以下项目:
创建 Google Cloud 项目,以包含用于存储密文的 Cloud Storage 存储桶。这些密钥将作为对象存储在存储桶中。此项目称为 STORAGE_PROJECT_ID。
创建第二个 Google Cloud 项目,以管理用于加密和解密密文的 Cloud KMS 密钥。此项目称为 KEY_PROJECT_ID。
针对每个项目,按照 Cloud KMS 快速入门的准备工作部分中的步骤,来启用 Cloud KMS API 并启用结算功能。
创建用户
在 Google Cloud 控制台中创建用户并为其授予角色。如需查看分步说明,请参阅 Identity and Access Management 快速入门。
此过程会创建两个用户。密钥管理员管理加密密钥,密钥用户可以使用这些密钥加密和解密数据。
在 KEY_PROJECT_ID 项目中执行此过程。
创建关键管理员账号。
向关键管理员授予
roles/cloudkms.admin
Identity and Access Management 角色。借助此角色,密钥管理员可以创建和管理密钥。创建关键用户账号。
向关键用户授予
roles/cloudkms.cryptoKeyEncrypterDecrypter
IAM 角色。具有此角色的用户可以加密和解密数据。
创建存储桶
在 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
:您要保护的 Secret(以纯文本形式提供),例如this is a secret
。PATH_TO_SECRET
:您要创建 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
:您创建 Secret 的路径。PATH_TO_ENCRYPTED_SECRET
:您要保存加密 Secret 的路径,例如secret.txt.encrypted
。
如需详细了解如何加密数据,请参阅加密数据快速入门。
如需进行原始对称加密,请改用
raw-encrypt
。将加密的 Secret 文件上传到存储桶。您可以使用以下 gcloud CLI 命令:
gcloud storage cp PATH_TO_ENCRYPTED_SECRET gs://STORAGE_BUCKET
您可以详细了解如何上传对象到存储分区。
可选:从本地机器中删除明文 Secret 文件 (
PATH_TO_SECRET
)。对于包含未经加密的敏感数据的文件,这是一种很好的做法。
STORAGE_BUCKET
存储桶现在包含加密的 Secret 文件,该文件使用 KEY_NAME
加密密钥加密。
对包含密钥的文件进行解密
以密钥用户账号执行这些步骤,并在两个项目中工作。
从存储桶下载加密的 Secret 文件。您可以使用以下 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 的路径,例如secret.txt.encrypted
。PATH_TO_DECRYPTED_SECRET
:您要保存已解密 Secret 的路径,例如secret_decrypted.txt
。
如需详细了解如何解密数据,请参阅加密数据快速入门。
如需进行原始对称加密,请改用
raw-decrypt
。现在,您可以使用
cat
或文本编辑器读取 Secret 的解密明文。其内容与PATH_TO_SECRET
的原始内容完全相同。可选:从本地机器删除
PATH_TO_ENCRYPTED_SECRET
和PATH_TO_DECRYPTED_SECRET
文件。
清理
如需清理文件,请删除您在本地机器上创建的所有文件,然后删除 KEY_PROJECT_ID
和 STORAGE_PROJECT_ID
项目。
后续步骤
- 详细了解密钥管理。
- 了解职责分离。
- 了解如何授予、更改和撤消对资源的访问权限。
- 了解如何创建服务账号。