Cloud KMS 是一项云托管式密钥管理服务,让您能够使用与本地部署时相同的方式为自己的云服务管理加密密钥。它支持使用各种密钥类型和来源(包括 Cloud HSM,用于硬件支持的密钥)进行加密、解密、签名和验证。
在本教程中,您将学习如何使用 Cloud 安全和隐私 API 的高级功能,包括:
- 设置安全的 Cloud Storage 存储桶
- 使用 Cloud KMS 管理密钥和已加密数据
- 查看 Cloud Storage 审核日志
您将使用安然语料库 (Enron Corpus) 中的节选数据,对其进行加密,并将其加载到 Cloud Storage 中。
您将学习
- 如何使用密钥管理服务 (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 图标:
预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:
这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。除非另有说明,否则请在此 shell 中运行所有命令。
如需存储本教程的数据,请创建一个 Cloud Storage 存储分区。由于 Cloud Storage 存储分区名称必须是全局唯一的,因此请在存储分区名称前添加项目 ID 作为前缀:
$ export BUCKET_NAME=${GOOGLE_CLOUD_PROJECT}_enron_emails
然后,创建存储分区:
$ gsutil mb gs://${BUCKET_NAME}
安然语料库是一个大型数据库,包含安然公司 (Enron Corporation) 158 名员工生成的 60 多万封电子邮件。这些数据已被复制到名为 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}"
启用最多可能需要一分钟。该命令完成后会报告成功。
创建 Cloud KMS 密钥环。在 Cloud KMS 中,密钥环是加密密钥的逻辑集合。密钥环包含有关密钥的元数据,例如其位置。在 global
区域中创建一个名为 my-keyring
的密钥环:
$ gcloud kms keyrings create "my-keyring" \ --location "global"
现在,在刚刚创建的密钥环中创建一个用途为 encryption
的 CryptoKey,并将其命名为 enron-emails
。
$ gcloud kms keys create "enron-emails" \ --location "global" \ --keyring "my-keyring" \ --purpose "encryption"
打开加密密钥网页界面,然后查看新创建的资源。您可以在主菜单中的 IAM 和管理下找到此选项。
您可以在 Cloud 控制台中查看和管理密钥环和加密密钥。
使用 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 控制台中的 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 活动界面,您应该会看到对密钥环进行的创建和所有修改操作。
您已成功使用 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 Logs 查看密钥和密钥环的所有活动
后续步骤
- 使用 Cloud KMS 加密数据库(例如 BigQuery)中的列
- 为 Cloud KMS 密钥设置自动轮替时间表
了解详情
- 详细了解如何轮替加密密钥
- 阅读信封加密
- 了解 Cloud Storage 存储分区的服务器端加密
- 在 Stack Overflow 上使用 google-cloud-kms 标记发布问题并查找答案
许可
此作品已获得 Creative Commons Attribution 2.0 通用许可授权。