开始使用 Cloud KMS

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) 并创建一个新项目:

2016-02-10 12:45:26 的屏幕截图.png

请记住项目 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 密钥设置自动轮替时间表

了解详情

许可

此作品已获得 Creative Commons Attribution 2.0 通用许可授权。