Cloud KMS 是一项云托管的密钥管理服务,可让您使用与内部部署时相同的方式为云服务管理加密密钥。它支持使用各种密钥类型和来源(包括适用于硬件支持的密钥的 Cloud HSM)进行加密、解密、签名和验证。
在本教程中,您将学习如何使用 Cloud Security API 和 Privacy API 的高级功能,包括:
- 设置安全的 Cloud Storage 存储分区
- 使用 Cloud KMS 管理密钥和加密数据
- 查看 Cloud Storage 审核日志
您将从 Enron 语料库获取删节的数据,对数据进行加密,并将其加载到 Cloud Storage 中。
您将学习
- 如何使用 Key Management Service (KMS) 加密和管理加密密钥
您只会以法律允许的方式(包括但不限于关于数据或软件的导入或导出的法律、隐私权或当地法律)使用
- Cloud KMS
- Cloud Storage
- Cloud SDK
自定进度的环境设置
如果您还没有 Google 帐号(Gmail 或 Google Apps),则必须创建一个。登录 Google Cloud Platform Console (console.cloud.google.com) 并创建一个新项目:
请记住项目 ID,它在所有 Google Cloud 项目中都是唯一名称(很抱歉,上述名称已被占用,您无法使用!)。它稍后将在此 Codelab 中被称为 PROJECT_ID
。
接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Google Cloud 资源。
在此 Codelab 中运行仅花费几美元,但是如果您决定使用更多资源或继续让它们运行,费用可能更高(请参阅本文档末尾的“清理”部分)。
Google Cloud Platform 的新用户有资格获享 $300 免费试用。
启动 Cloud Shell
在此 Codelab 中,您将使用 Cloud Shell,这是一个在 Google Cloud 上运行的免费虚拟环境。在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:
预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:
这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并在 Google Cloud 上运行,大大增强了网络性能和身份验证。除非另有说明,否则请从此 shell 运行所有命令。
如需存储本教程中的数据,请创建一个 Cloud Storage 存储分区。由于 Cloud Storage 存储分区名称必须是全局唯一的,因此请在存储分区名称前添加您的项目 ID 前缀:
$ export BUCKET_NAME=${GOOGLE_CLOUD_PROJECT}_enron_emails
然后创建存储分区:
$ gsutil mb gs://${BUCKET_NAME}
Enron 语料库是由 Enron Corporation 的 158 名员工生成的大型数据库,其中包含超过 600000 封电子邮件。这些数据已复制到名为 gs://enron_emails/
的 Cloud Storage 存储分区中。
在本地下载一个电子邮件文件:
$ gsutil cp gs://enron_emails/allen-p/inbox/1. . # <-- don't forget the dot!
检查下载的文件,以验证它实际上是电子邮件:
$ tail 1.
该电子邮件将包含如下信息:
Attached is the Delta position for 1/18... # ...
除了电子邮件地址之外,该存储分区还包含图片。本教程使用明文电子邮件和图片。
您必须先在项目中启用该服务,然后才能使用 Cloud KMS。每个项目只需执行一次。如需启用 Cloud KMS 服务,请运行以下命令:
$ gcloud services enable cloudkms.googleapis.com \ --project "${GOOGLE_CLOUD_PROJECT}"
最多可能需要 1 分钟才能启用。该命令将在运行完成后报告成功。
创建 Cloud KMS 密钥环。在 Cloud KMS 中,密钥环是加密密钥的逻辑集合。密钥环包含有关键(例如它们的位置)的元数据。在 global
区域中创建名为 my-keyring
的密钥环:
$ gcloud kms keyrings create "my-keyring" \ --location "global"
现在,在您刚刚创建的密钥环中创建名为 enron-emails
且用途为 encryption
的加密密钥。
$ gcloud kms keys create "enron-emails" \ --location "global" \ --keyring "my-keyring" \ --purpose "encryption"
打开加密密钥网页界面并查看新创建的资源。可在主菜单的 IAM 和管理下找到此目录。
您可以在 Cloud Console 中查看和管理密钥环和加密密钥。
使用 Cloud KMS 对我们之前下载的电子邮件的内容进行加密。本教程使用的是 gcloud
命令行工具,但您也可以使用 Cloud KMS API 加密数据。
$ gcloud kms encrypt \ --location "global" \ --keyring "my-keyring" \ --key "enron-emails" \ --plaintext-file ./1. \ --ciphertext-file ./1.enc
这将在磁盘 1.enc
中创建一个新文件,其中包含加密文件内容。现在,数据已通过 Cloud KMS 加密,接下来,请将加密的文件上传至 Cloud Storage 存储分区。
$ gsutil cp ./1.enc gs://${BUCKET_NAME}
Cloud KMS 已与 Google Cloud Identity and Access Management (IAM) 集成。Cloud KMS IAM 角色主要分为两类:
- 拥有管理密钥的权限
- 拥有使用密钥的权限
例如,roles/cloudkms.admin
角色允许持有人创建密钥环、加密密钥、设置 IAM 政策以及执行与管理相关的操作。roles/cloudkms.cryptoKeyEncrypterDecrypter
会向持有者授予加密和解密数据,但不包括管理权限。
IAM 角色由其父级资源继承。如果有人在 Google Cloud 项目中拥有 roles/cloudkms.admin
角色,则他们是该项目中所有密钥的管理员。如果他们对密钥环拥有 roles/cloudkms.admin
权限,则表示他们是该密钥环中所有密钥的管理员。如果他们对单个加密密钥拥有 roles/cloudkms.admin
权限,则他们只是该密钥的管理员。
在本练习中,请使用您的身份:
$ export MY_IDENTITY=you@gmail.com # or you@example.com
使用 gcloud
命令行工具为身份分配在上面创建的密钥环中的 Cloud KMS 资源的权限:
$ gcloud kms keyrings add-iam-policy-binding "my-keyring" \ --location "global" \ --member "user:${MY_IDENTITY}" \ --role "roles/cloudkms.admin"
roles/cloudkms.admin
角色不包含仅用于使用按键的权限。如需为您的身份授予使用 enron-emails
加密密钥加密和解密数据的权限,请执行以下操作:
$ gcloud kms keys add-iam-policy-binding "enron-emails" \ --location "global" \ --keyring "my-keyring" \ --member "user:${MY_IDENTITY}" \ --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"
请注意,第一个命令会为密钥环授予 roles/cloudkms.admin
角色,该角色将包含任何子级加密密钥资源。第二个命令可授予 roles/cloudkms.cryptoKeyEncrypterDecrypter
,但仅适用于 enron-emails
加密密钥。
您还可以在 Cloud Console 的 Cloud KMS 界面中查看和分配角色。
除了加密单个文件之外,您还可以使用一些脚本来加密文件集合。此示例会流式传输 allen-p 的所有电子邮件,对电子邮件进行加密,并将生成的加密值上传到 Cloud Storage 存储分区:
DIR="gs://enron_emails/allen-p" for file in $(gsutil ls ${DIR}/**); do ENC_NAME="$(basename ${file}).enc" gsutil cat ${file} \ | \ gcloud kms encrypt \ --location "global" \ --keyring "my-keyring" \ --key "enron-emails" \ --plaintext-file - \ --ciphertext-file - \ | \ gsutil -q cp - gs://${BUCKET_NAME}/${ENC_NAME} echo "Copied ${ENC_NAME}" done
这将遍历示例 Cloud Storage 存储分区中给定目录中的所有文件,使用 Cloud KMS 对其加密,然后将其上传到您的 Google Cloud Storage。
脚本执行完成后,您可以在 Cloud Storage 界面中查看加密文件。您应会看到类似下图的界面:
Cloud Audit Logging 包含两个日志流(管理员活动日志和数据访问日志),这些日志流由 Google Cloud 服务生成,可帮助您回答“谁在 Google Cloud Platform 项目中执行了什么操作、在哪里执行了什么操作以及何时执行了什么操作”这一问题。
要查看 KMS 中任何资源的活动,请点击密钥环并选择查看活动。系统随即会将您转到 Cloud Activity 界面,您可以在其中看到对密钥环的创建和所有修改。
您已成功使用 Cloud KMS 加密数据并将加密数据存储在 Cloud Storage 中。
清理
释放本教程中创建的资源。删除之前创建的 Cloud Storage 存储分区:
$ gsutil rm -r gs://${BUCKET_NAME}
无法删除 Cloud KMS 资源。不过,您可以销毁密钥材料,使其不能再使用:
$ gcloud kms keys versions destroy "1" \ --location "global" \ --key "enron-emails" \ --keyring "my-keyring"
我们介绍了
- 使用 Cloud IAM 管理 Cloud KMS 权限
- 使用 Cloud KMS 加密数据
- 使用 Cloud Storage 存储加密数据
- 使用 Cloud Audit Logging 查看密钥和密钥环的所有活动
后续步骤
- 使用 Cloud KMS 加密 BigQuery 等数据库中的某列
- 为您的 Cloud KMS 密钥设置自动轮替时间表
了解详情
- 详细了解如何轮替加密密钥
- 了解信封加密
- 了解 Cloud Storage 存储分区的服务器端加密
- 在 Stackoverflow 上的 google-cloud-kms 标记下发布问题并查找答案
许可
此作品已获得 Creative Commons Attribution 2.0 通用许可授权。