本主题介绍一种在通过网络传输数据之前,使用 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 存储分区。这些密钥将作为对象存储在存储分区中。在以下步骤中,此项目称为 my-storage-project。
(可选)创建第二个 Google Cloud 项目,以管理用于加密和解密密文的 Cloud KMS 密钥。在下面的步骤中,此项目名为 my-kms-project。
您可以选择为 my-storage-project 和 my-kms-project 使用同一 Google Cloud 项目。
针对每个项目,按照 Cloud KMS 快速入门的准备工作部分中的步骤,来启用 Cloud KMS API 并启用结算功能。
创建用户
在 Google Cloud 控制台中创建用户并为其授予角色。如需查看分步说明,请参阅 Identity and Access Management 快速入门。
此过程会创建两个用户。key-admin 管理加密密钥,key-user 可以使用这些密钥加密和解密数据。
在 my-kms-project 项目中执行此过程。
创建
key-admin
用户。要创建用户,您需要 my-kms-project 项目的roles/resourcemanager.organizationAdmin
角色。向
key-admin
授予roles/cloudkms.admin
Identity and Access Management 角色。key-admin
可以创建和管理密钥。创建
key-user
用户。授予
key-user
roles/cloudkms.cryptoKeyEncrypterDecrypter
IAM 角色。key-user
可以使用密钥来加密和解密数据。
创建存储分区
在 my-storage-project
项目中执行此过程。
- 创建一个存储分区(名为
my-bucket
)。 - 授予 key-user my-bucket 存储分区的
roles/storage.objectAdmin
角色。
创建加密密钥
以 my-kms-project 项目中的 key-admin
用户身份执行此过程。
创建一个名为 storage 的密钥环。密钥环的名称对项目具有唯一性。您无法重命名或删除密钥环。使用 Google Cloud CLI 创建密钥串。
gcloud kms keyrings create storage \ --location global
在 storage 密钥环中创建一个名为 my-key 的密钥以用于加密。密钥的名称对密钥环具有唯一性。无法重命名或删除密钥,但可以销毁其密钥版本。使用 Google Cloud CLI 创建密钥。系统会自动创建初始密钥版本,并将其作为主要版本。
gcloud kms keys create my-key \ --location global \ --keyring storage \ --purpose encryption
您可以详细了解如何创建密钥环和密钥。
对包含密钥的文件进行加密
以 key-user 用户身份使用这两个项目执行此过程。
在本地机器上,创建一个名为 my-secret.txt 的文件,其中包含文本“This is my secret”。
echo "This is my secret" > my-secret.txt
使用
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
。将已加密的 my-secret.txt.encrypted 文件上传到 my-storage-project 项目中的 my-bucket 存储分区。您可以使用以下 gcloud CLI 命令:
gcloud storage cp my-secret.txt.encrypted gs://my-storage-bucket
您可以详细了解如何上传对象到存储分区。
[可选] 从本地机器删除明文 my-secret.txt 文件。对于包含未经加密的敏感数据的文件,这是一种很好的做法。
my-storage-bucket 存储分区现在包含文件 my-secret.txt.encrypted,该文件使用 my-key 密钥加密。
对包含密钥的文件进行解密
以 key-user 用户身份使用这两个项目执行这些步骤。
从 my-bucket 存储分区下载 my-secret.txt.encrypted 文件。您可以使用以下 gcloud CLI 命令:
gcloud storage cp gs://my-storage-bucket/my-secret.txt.encrypted .
您可以详细了解如何从存储分区下载对象。
尝试使用
less
等命令或文本编辑器读取文件。请注意,该文件不是明文文件。使用用来加密 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
。使用
cat
命令读取 my-secret.txt.decrypted 文件。其内容与 my-secret.txt 的原始内容完全相同。cat my-secret.txt.decrypted
This is my secret.
[可选] 从本地机器删除 my-secret.txt.encrypted 和 my-secret.txt.decrypted 文件。
清理
要清理文件,请删除您在本地机器上创建的所有文件,然后删除 [MY_KMS_PROJECT]
和 [MY_STORAGE_PROJECT]
项目。
后续步骤
- 详细了解密钥管理。
- 了解职责分离。
- 了解如何授予、更改和撤消对资源的访问权限。
- 了解如何创建服务账号。