使用动态密钥访问存储区
在本教程中,您将学习如何使用 IBM Cloud® Secrets Manager 来创建和租赁可用于访问 Cloud Object Storage中的存储区的 IAM 凭证。
作为企业开发者,您可能正在寻找提高应用程序私钥安全性的方法。 在管理 API 密钥时,您希望能够动态地创建凭证,以便仅当需要这些凭证时才存在这些凭证。 您还希望将 API 密钥租赁给团队中的其他人,并确保在指定的持续时间之后自动撤销该 API 密钥。
通过 Secrets Manager,您可以创建可用于访问受保护资源的 动态密钥这是一个唯一值,例如密码或 API 密钥,它是动态创建的,并租赁给需要访问受保护资源的应用程序。 动态私钥到达其租赁结束后,将撤销对受保护资源的访问权,并自动删除该私钥。,例如存储在 Cloud Object Storage 存储区中的部署日志。 例如,请考虑以下情况。
- 作为管理员用户,您希望创建一个动态私钥,供团队用于访问帐户中的 Cloud Object Storage 存储区。 您将发送请求以在 Secrets Manager中创建 IAM 凭证。
- Secrets Manager 创建私钥,并根据定义的 IAM 访问策略对其进行验证。
- 稍后,开发者想要访问存储区的内容。 开发者发送请求以检索 IAM 凭证的值。
- Secrets Manager 验证请求并生成开发者可用于向 Cloud Object Storage认证的一次性 API 密钥。 API 密钥到达其租赁结束后,将自动撤销该 API 密钥。
准备工作
开始之前,请确保您具有 管理员 平台访问权,以便您可以供应服务,创建访问组以及为其他人定制访问策略。 您还需要以下先决条件:
-
jq
可帮助您对 JSON 数据进行切片和过滤。 在本教程中使用jq
来抓取和使用存储的环境变量。
设置环境
要使用 Secrets Manager 和 Cloud Object Storage,您需要在 IBM Cloud 帐户中创建这两个服务的实例。 您还需要配置许可权,以便可以对这两个服务运行操作。
在此步骤中,您通过创建访问组,服务标识和 IBM Cloud API 密钥来设置访问环境。 在教程结束时,如果不再需要这两个实例,那么可以轻松除去它们。
您的 IBM Cloud 帐户中只能有一个 Secrets Manager 服务实例。
创建 Secrets Manager 和 Cloud Object Storage 实例
首先在 IBM Cloud 帐户中创建 Secrets Manager 和 Cloud Object Storage 的测试实例。
-
在命令行上,通过 IBM Cloud CLI 登录到 IBM Cloud。
ibmcloud login
如果登录失败,请运行
ibmcloud login --sso
命令重试。 使用联合标识登录时需要--sso
参数。 如果使用此选项,请转至 CLI 输出中列出的链接以生成一次性密码。 -
选择要创建Secrets Manager服务实例的账户、区域和资源组。
在本教程中,您将与达拉斯区域进行交互。 如果您已登录到其他区域,请确保通过运行以下命令将达拉斯设置为目标区域。
ibmcloud target -r us-south -g default
-
创建Cloud Object Storage实例。
ibmcloud resource service-instance-create test-cos-instance-tutorial cloud-object-storage lite us-south
-
创建Secrets Manager实例。
ibmcloud resource service-instance-create test-sm-instance-tutorial secrets-manager lite us-south
Secrets Manager 的供应过程需要 5-15 分钟才能完成。
-
导出具有两个服务实例的标识的环境变量。
export COS_INSTANCE_ID=`ibmcloud resource service-instance "test-cos-instance-tutorial" --output json | jq -r ".[].guid"`; echo $COS_INSTANCE_ID
export SM_INSTANCE_ID=`ibmcloud resource service-instance "test-sm-instance-tutorial" --output json | jq -r ".[].guid"`; echo $SM_INSTANCE_ID
-
(可选) 通过单击 IBM Cloud 控制台中的 菜单 图标
> 资源列表,验证是否已成功创建服务。
设置访问许可权
接下来,定义您需要能够对 Secrets Manager 和 Cloud Object Storage 服务运行操作的访问层次结构。
-
在 IBM Cloud 帐户中创建测试访问组。
通过创建访问组,您可以将访问权分配给需要访问 Secrets Manager 和 Cloud Object Storage 实例的一组用户和服务标识。 从命令行运行以下命令以创建名为
test-cos-admin-group
的新访问组。export ACCESS_GROUP_ID=`ibmcloud iam access-group-create test-storage-admin-group -d "An access group for testing Secrets Manager and Cloud Object Storage." --output json | jq -r ".id"`; echo $ACCESS_GROUP_ID
-
设置账户凭证
创建服务标识并将其设置为环境变量。
export SERVICE_ID=`ibmcloud iam service-id-create test-service-id-secrets --description "A service ID for testing Secrets Manager." --output json | jq -r ".id"`; echo $SERVICE_ID
分配服务标识许可权以创建和管理其他服务标识。
ibmcloud iam service-policy-create $SERVICE_ID --roles Operator --service-name "IAM Identity Service"
分配服务标识许可权以查看和更新帐户中的访问组。
ibmcloud iam access-group-policy-create $SERVICE_ID --roles Editor --service-name "IAM Access Groups"
将服务 ID 添加到访问组。
ibmcloud iam access-group-service-id-add test-secrets-admin-group $SERVICE_ID
为您的服务 ID 创建一个 "IBM CloudAPI 密钥。
export IBM_CLOUD_API_KEY=`ibmcloud iam service-api-key-create test-storage-read-write $SERVICE_ID --description "An API key for testing Secrets Manager and Cloud Object Storage." --output json | jq -r ".apikey"`
稍后使用此 API 密钥来启用 Secrets Manager IAM 密钥引擎。
准备您的Cloud Object Storage实例
接下来,在 Cloud Object Storage 实例中创建存储区并设置访问权。
-
在实例中创建测试存储区。
- 在 IBM Cloud 控制台中,转至 资源列表。
- 从存储服务列表中,选择 test-cos-instance-tutorial。
- 在 Cloud Object Storage UI 中,单击 创建存储区。
- 在
us-south
区域中创建存储区。 - 复制水桶的 ID。
-
分配对新的 Cloud Object Storage 存储区的读写访问权。
- 转至 管理> 访问权 (IAM)> 访问组。
- 从组列表中,选择 test-storage-admin-group。
- 单击“访问”选项卡。
- 单击分配访问权。
- 从服务列表中,选择 Cloud Object Storage,然后单击 下一步。
- 在“资源”部分中,选择 特定资源。
- 在“属性类型”字段中,选择 服务实例。
- 从服务实例列表中,选择 test-cos-instance-tutorial,然后单击 下一步。
- 分配 读取者,内容读取者,对象读取者和 对象写入者 服务访问角色。
- 查看您的选择,然后单击添加。
- 单击分配。
-
将对象上载到存储区。
您可以从本地系统拖放任何文件或文件夹。 例如,您可以使用以下样本文本创建并上载名为
sample.txt
的文件。A quick brown fox jumped over the lazy dog.
准备 Secrets Manager 实例
最后,配置 Secrets Manager 实例以开始使用动态私钥。
-
从命令行验证您是否可以访问 Secrets Manager CLI 插件。
ibmcloud secrets-manager --help
没有插件吗? 要安装 Secrets Manager CLI 插件,请运行
ibmcloud plugin install secrets-manager
。 -
为实例创建私钥组。
私钥组 是一种组织和控制团队中有权访问实例中特定私钥的人员的方法。 要从 IBM Cloud CLI 创建私钥组,请运行
ibmcloud secrets-manager secret-group-create
命令。export SECRET_GROUP_ID=`ibmcloud secrets-manager secret-group-create --name cloud-object-storage-writers --description "Read and write to Cloud Object storage buckets" --service-url https://${instance-id}.${region}.secrets-manager.appdomain.cloud --output json | jq -r '.id'`; echo $SECRET_GROUP_ID
请确保将
instance_id
和region
更新为您的内容。使用 Windows™
cmd.exe
) 还是PowerShell? 如果在命令行上传递 JSON 内容时迂到错误,那么可能需要调整字符串以满足特定于操作系统的报价转义需求。 有关更多信息,请参阅 在 IBM Cloud CLI 中对字符串使用引号。 -
为实例启用 IAM 密钥引擎。
私钥引擎是 Secrets Manager 中的组件,用于处理不同类型的私钥的操作。 这些引擎充当这些秘密的后端。 通过启用 IAM 私钥引擎,您可以动态地为服务标识创建 API 密钥,然后根据指定的租赁持续时间将其租赁给用户。
要从 IBM Cloud CLI 配置 IAM 密钥引擎,请运行
ibmcloud secrets-manager config-update
命令。请确保首先创建 IAM Service 标识和 API 密钥 具有必需的访问策略。 在以下命令中使用生成的 API 密钥。
ibmcloud secrets-manager configuration-create --config-type iam_credentials_configuration --iam-credentials-apikey $IBM_CLOUD_API_KEY
成功! 现在,您可以 创建 IAM 凭证,可用于动态生成服务标识和 API 密钥。 继续下一步。
创建 IAM 凭证
IAM 凭证是可用于按需访问 IBM Cloud 资源 (例如 Cloud Object Storage 存储区) 的动态私钥。 一组 IAM 凭证由服务标识和每次读取或访问受保护资源时生成的 API 密钥组成。 您可以在 IAM 凭证创建时为其定义生存时间 (TTL) 或租赁持续时间,以便缩短私钥存在的时间量。
要从 IBM Cloud CLI 创建 IAM 凭证,请运行 ibmcloud secrets-manager secret-create
命令。
export SECRET_ID=`ibmcloud secrets-manager secret-create --secret-name test-iam-credentials --secret-description "Extended description for my secret.",--am-credentials-access_groups $ACCESS_GROUP_ID" --secret_group_id $SECRET_GROUP_ID --iam-credentials-ttl 2h --secret-labels "storage, us-south" --output json --service-url https://${instance-id}.${region}.secrets-manager.appdomain.cloud | jq -r '.id`
请确保将 instance_id
和 region
更新为您的内容。
您还可以使用 Secrets Manager UI 来创建 IAM 凭证。 有关更多信息,请参阅 创建 IAM 凭证。
生成 API 密钥
创建 IAM 凭证后,具有较低特权的用户可以在访问存储区时检索私钥。
要从 IBM Cloud CLI 检索 IAM 凭证,可以运行 ibmcloud secrets-manager secret
命令。
-
检索 IAM 凭证私钥的内容。
ibmcloud secrets-manager secret --id $SECRET_ID --output json
以下 JSON 片段显示了示例响应。
{ "metadata": { "collection_type": "application/vnd.ibm.secrets-manager.secret+json", "collection_total": 1 }, "resources": [ { "access_groups": [ "AccessGroupId-e7e1a364-c5b9-4027-b4fe-083454499a20" ], "api_key": "pVTL3W7o1uqIWSE8sSh8ebNhRN4-d1D0W9GcPVgwcLUr", "created_by": "iam-ServiceId-222b47ab-b08e-4619-b68f-8014a2c3acb8", "creation_date": "2020-12-15T14:31:42Z", "crn": "crn:v1:bluemix:public:secrets-manager:us-south:a/a5ebf2570dcaedf18d7ed78e216c263a:f1bc94a6-64aa-4c55-b00f-f6cd70e4b2ce:secret:cb7a2502-8ede-47d6-b5b6-1b7af6b6f563", "description": "Extended description for my secret.", "labels": [ "storage", "us-south" ], "last_update_date": "2020-12-15T14:31:42Z", "name": "test-iam-credentials", "secret_group_id": "432b91f1-ff6d-4b47-9f06-82debc236d90", "secret_type": "IAM_CREDENTIALS", "service_id": "ServiceId-0576925a-9651-4f3e-b8c7-ce1332324aa4", "state": 1, "state_description": "Active", "ttl": 900 } ] }
响应主体显示为私钥生成的一次性
api_key
和service_id
值。ttl
值指示凭证有效的时间长度 (以秒计)。 -
使用新生成的 API 密钥导出环境变量。
复制在上一步中生成的
api_key
值,并将其设置为环境变量。export API_key="<api_key>"
使用 API 密钥生成访问令牌
通过使用在上一步中检索的 API 密钥,可以生成 IAM 访问令牌。 令牌仅在您最初为 IAM 凭证定义的持续时间内有效。
您可以通过调用 IAM 身份服务 API来交换 IAM 访问令牌的 API 密钥。 要生成 IAM 令牌,请从命令行运行以下 cURL 命令。
export IAM_TOKEN=`curl -X POST \
"https://iam.cloud.ibm.com/identity/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Accept: application/json" \
-d "grant_type=urn%3Aibm%3Aparams%3Aoauth%3Agrant-type%3Aapikey&apikey=$API_KEY" | jq -r ".access_token"`; echo $IAM_TOKEN
成功! 现在,您具有可用于访问 Cloud Object Storage 存储区的有效 IAM 令牌。 继续下一步。
访问存储区
作为具有较少特权的用户,您现在可以使用在上一步中生成的访问令牌来读写 Cloud Object Storage 存储区。 IAM 凭证的租赁持续时间到期后,将自动撤销其关联的 API 密钥。
在命令行上,运行以下 cURL 请求以列出 Cloud Object Storage 实例中的存储区。
curl -X GET \
"https://s3.us-south.cloud-object-storage.appdomain.cloud" \
-H "Authorization: Bearer $IAM_TOKEN" \
-H "ibm-service-instance-id: $COS_INSTANCE_ID" \
-H "Accept: application/json"
下面的 XML 代码段显示了一个响应示例。
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>cccbd89c-6eb0-4aed-8ffb-899d39bc022e</ID>
<DisplayName>cccbd89c-6eb0-4aed-8ffb-899d39bc022e</DisplayName>
</Owner>
<Buckets>
<Bucket>
<Name>test-secrets-tutorial</Name>
<CreationDate>2020-12-14T21:40:55.739Z</CreationDate>
</Bucket>
</Buckets>
</ListAllMyBucketsResult>
要查看 test-secrets-tutorial
存储区的内容,可以运行以下命令。
curl -X GET \
"https://s3.us-south.cloud-object-storage.appdomain.cloud/test-secrets-tutorial" \
-H "Authorization: Bearer $IAM_TOKEN" \
-H "ibm-service-instance-id: $COS_INSTANCE_ID" \
-H "Accept: application/json"
下面的 XML 代码段显示了一个响应示例。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>test-secrets-tutorial</Name>
<Prefix></Prefix>
<Marker></Marker>
<MaxKeys>1000</MaxKeys>
<Delimiter></Delimiter>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>sample.txt</Key>
<LastModified>2020-12-14T21:49:29.502Z</LastModified>
<ETag>"df756a3769fcab0a261880957590c768"</ETag>
<Size>42</Size>
<Owner>
<ID>cccbd89c-6eb0-4aed-8ffb-899d39bc022e</ID>
<DisplayName>cccbd89c-6eb0-4aed-8ffb-899d39bc022e</DisplayName>
</Owner>
<StorageClass>STANDARD</StorageClass>
</Contents>
</ListBucketResult>
最后,要读取存储区中的对象,可以运行以下命令。
curl -X GET \
"https://s3.us-south.cloud-object-storage.appdomain.cloud/test-secrets-tutorial/sample.txt" \
-H "Authorization: Bearer $IAM_TOKEN" \
-H "ibm-service-instance-id: $COS_INSTANCE_ID" \
-H "Accept: application/json"
将 sample.txt
替换为您上载到存储区的文件的名称。 以下屏幕显示了示例响应。
A quick brown fox jumps over the lazy dog.
(可选) 清除资源
如果您不再需要在本教程中创建的资源,那么可以完成以下步骤以从帐户中除去这些资源。
-
删除测试 Cloud Object Storage 实例。
ibmcloud resource service-instance-delete test-cos-instance-tutorial
-
删除测试 Secrets Manager 实例。
ibmcloud resource service-instance-delete test-sm-instance-tutorial
-
删除测试访问组。
ibmcloud resource access-group-delete $ACCESS_GROUP
-
删除测试服务标识。
ibmcloud resource service-id-delete $SERVICE_ID
后续步骤
太棒了! 在本教程中,您学习了如何设置 Secrets Manager 以使用动态私钥访问 Cloud Object Storage 存储区。 请查看更多资源,以帮助您开始使用 Secrets Manager。
- 了解有关 私钥类型 的更多信息。
- 使用 密钥组 设计访问策略。
- 了解有关 Secrets Manager API的更多信息。