教程:管理政策控件
本教程介绍了如何对 Certificate Authority Service 资源实施政策控制。
目标
本教程介绍了如何通过以下政策控制功能为 DNS 证书颁发配置共享证书授权机构 (CA) 池:
- 用户
prod-dns-requester
可以为*.prod.example.com
网域请求最终实体服务器 TLS 证书。 - 用户
test-dns-requester
可以为*.test.example.com
网域请求最终实体服务器 TLS 证书。 - 用户
blank-check-requester
可以从 CA 池中请求任何类型的证书。
本教程使用 CA 池的证书颁发政策、证书模板和条件 IAM 绑定来实现此场景。
准备工作
- 了解 CA Service 提供的各种政策控制。
- 了解如何创建证书模板。
- 了解可用于各种证书颁发场景的证书配置文件。
- 了解如何使用通用表达式语言 (CEL) 为证书颁发强制执行各种政策控制。
- 了解如何使用证书颁发政策。
- 了解如何配置、修改和移除 IAM 政策以创建和管理 CA 服务资源。
创建 CA 池
如需创建 CA 池,请按照以下说明操作:
如需创建使用
issuance-policy.yaml
文件的 CA 池,请使用以下gcloud
命令:gcloud
gcloud privateca pools create POOL_NAME \ --tier=ENTERPRISE
其中:
--tier
标志用于指定 CA 池的层级。如需详细了解层级,请参阅选择操作层级。
如需在新创建的 CA 池中创建包含 Google 管理资源的 CA,请使用以下
gcloud
命令:gcloud
gcloud privateca roots create CA_NAME \ --pool=POOL_NAME \ --subject="CN=Example DNS Root, O=Example LLC, C=US" \ --validity="10Y" \ --max-chain-length=1 \ --auto-enable
其中:
- POOL_NAME 是 CA 池的唯一标识符。
--subject
标志用于传递证书主题的名称。--validity
标志用于确定 CA 的有效期。默认有效期为 10 年。--max-chain-length
标志决定了 CA 允许的从属 CA 的最大深度。--auto-enable
标志以ENABLED
状态(而不是STAGED
状态)创建 CA。如需详细了解 CA 状态,请参阅 CA 状态。
为测试证书配置政策控制
发布政策变更会立即生效。我们建议您先配置测试政策控件,然后再将其用于生产环境。本部分介绍了如何配置测试政策控制措施。
对于测试和生产 DNS 模板,您都必须为服务器 TLS 证书使用相同的预定义值。创建一个 YAML 文件 leaf_server_tls_predefined_values.yaml
,并将以下最终实体服务器 TLS 配置复制到该文件中。
keyUsage:
baseKeyUsage:
digitalSignature: true
keyEncipherment: true
extendedKeyUsage:
serverAuth: true
caOptions:
isCa: false
为测试 DNS 证书配置政策控制
本部分介绍了如何设置政策控制,以允许用户 test-dns-requester
为 *.test.example.com
网域中的 DNS 请求最终实体服务器 TLS 证书。
为测试证书创建 DNS 证书模板
本部分介绍如何创建包含最终实体服务器 TLS 配置的证书模板。此证书模板将证书限制为仅使用 *.test.example.com
网域上的 DNS SAN。这些限制是使用通用表达式语言 (CEL) 表达式实现的。证书模板还会删除证书请求中指定的任何主题。
使用以下
gcloud
命令创建包含终端实体服务器 TLS 扩展的证书模板,丢弃证书请求中指定的任何subject
,并限制允许的 SAN。gcloud
gcloud privateca templates create test-server-tls-template \ --predefined-values-file ./leaf_server_tls_predefined_values.yaml \ --no-copy-subject \ --copy-sans \ --identity-cel-expression "subject_alt_names.all(san, san.type == DNS && san.value.endsWith('.test.example.com'))"
其中:
--predefined-values-file
标志用于传递 YAML 文件,该文件描述了证书模板设置的任何预定义 X.509 值。--no-copy-subject
标志用于从证书请求中丢弃所有调用方指定的主题。--copy sans
标志可确保将证书请求中的 SAN 扩展复制到已签名的证书中。--identity-cel-expression
标志用于传递 CEL 表达式,该表达式会在颁发证书之前根据证书中的身份进行评估。如需详细了解如何使用 CEL 表达式实现各种政策控制,请参阅使用 CEL。
如需详细了解如何创建证书模板,请参阅创建证书模板。
为 DNS 测试证书创建 IAM 绑定
如需允许 DNS CA 池中的用户 test-dns-requester@
请求测试服务器 TLS 证书,请在 CA 池中创建条件 IAM 绑定。仅当证书请求包含对 test-server-tls-template
模板的引用时,才能向用户 test-dns-requester@
授予 privateca.certificateRequester
角色。如需详细了解 CA Service 的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制。
创建政策 YAML 文件
test_dns_condition.yaml
,并将以下 TLS 配置复制到该文件中。title: test DNS binding description: allows user to only create DNS test certificates expression: api.getAttribute("privateca.googleapis.com/template", "") == "PROJECT_ID/-/test-server-tls-template"
IAM 条件中提供的模板名称必须与模板名称一致 。因此,如果您在
privateca.googleapis.com/template
属性,则必须 还可以在请求证书时提供项目 ID。如果您在 CEL 表达式中提供项目编号,则必须在证书请求中也提供项目编号。使用以下
gcloud
命令添加政策控件,以允许test-dns-requester@
仅从 CA 池请求正式版测试 TLS 证书。gcloud
gcloud privateca pools add-iam-policy-binding POOL_NAME \ --role='roles/privateca.certificateRequester' \ --member='user:test-dns-requester@' \ --condition-from-file=./test_dns_condition.yaml
其中:
--role
标志用于传递要分配给成员的角色名称。如需详细了解 CA 服务的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制。--member
标志用于传递要为其添加绑定的成员。condition-from-file
标志用于传递具有 CEL 条件的文件的名称。
使用以下
gcloud
添加政策控件,允许test-dns-requester@
使用“test-server-tls-template”证书模板。gcloud
gcloud privateca templates add-iam-policy-binding test-server-tls-template \ --role='roles/privateca.templateUser' \ --member='user:test-dns-requester@'
其中:
--role
标志用于传递要分配给成员的角色名称。如需详细了解 CA Service 的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制。--member
标志用于传递要为其添加绑定的成员。
如需详细了解如何配置 IAM 政策,请参阅配置 IAM 政策。
为生产证书配置政策控制
测试政策控制功能后,您就可以在生产环境中使用这些政策控制功能。
为生产 DNS 证书配置政策控制
本部分介绍了如何设置政策控制,以允许用户 prod-dns-requester
为 DNS .prod.example.com
网域请求最终实体 TLS 证书。
为正式版 DNS 证书创建证书模板
按照以下说明创建包含最终实体服务器 TLS 配置的证书模板。此证书模板会限制证书仅使用 *.prod.example.com
网域上的 DNS SAN。这些限制是使用通用表达式语言 (CEL) 表达式实现的。证书模板还会删除证书请求中指定的任何主题。
使用以下 gcloud
命令创建证书模板 prod-server-tls-template
。
gcloud
gcloud privateca templates create prod-server-tls-template \
--predefined-values-file ./leaf_server_tls_predefined_values.yaml \
--no-copy-subject \
--copy-sans \
--identity-cel-expression "subject_alt_names.all(san, san.type == DNS && san.value.endsWith('.prod.example.com'))"
其中:
--predefined-values-file
标志用于传递 YAML 文件,该文件描述了证书模板设置的任何预定义 X.509 值。--no-copy-subject
标志用于从证书请求中丢弃所有调用方指定的主题。--copy sans
标志可确保将证书请求中的 SAN 扩展复制到已签名的证书中。--identity-cel-expression
标志用于传递 CEL 表达式,该表达式会在颁发证书之前根据证书中的身份进行评估。如需详细了解 CEL 表达式,请参阅使用 CEL 表达式。
如需详细了解如何创建证书模板,请参阅创建证书模板。
如需详细了解 gcloud privateca templates create
命令,请参阅 gcloud privateca templates create。
创建生产 DNS IAM 绑定
如需允许 DNS CA 池中的用户 prod-dns-requester@
请求生产服务器 TLS 证书,请在 CA 池中创建条件 IAM 绑定。仅当证书请求包含对 prod-server-tls-template
模板的引用时,才向用户 prod-dns-requester@
授予 privateca.certificateRequester
角色。如需详细了解 IAM 角色和权限,请参阅:使用 IAM 进行访问权限控制。
创建政策 YAML 文件
prod_dns_condition.yaml
,并将以下 TLS 配置复制到该文件中。title: Production DNS binding description: allows user to only create DNS production certificates expression: api.getAttribute("privateca.googleapis.com/template", "") == "PROJECT_ID/-/prod-server-tls-template"
使用以下
gcloud
命令添加政策控件,以允许prod-dns-requester@
仅从 CA 池请求生产服务器 TLS 证书。gcloud
gcloud privateca pools add-iam-policy-binding POOL_NAME \ --role='roles/privateca.certificateRequester' \ --member='user:prod-dns-requester@' \ --condition-from-file=./prod_dns_condition.yaml
其中:
--role
标志用于传递要分配给成员的角色名称。如需详细了解 CA Service 的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制。--member
标志用于传递要为其添加绑定的成员。condition-from-file
标志用于传递具有 CEL 条件的文件的名称。
如需详细了解
gcloud privateca pools add-iam-policy-binding
命令,请参阅 gcloud privateca pools add-iam-policy-binding。添加允许
prod-dns-requester@
使用“prod-server-tls-template”的政策控件证书模板,请使用以下gcloud
命令:gcloud
gcloud privateca templates add-iam-policy-binding prod-server-tls-template \ --role='roles/privateca.templateUser' \ --member='user:prod-dns-requester@'
其中:
--role
标志用于传递要分配给成员的角色名称。如需详细了解 CA Service 的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制。--member
标志用于传递要为其添加绑定的成员。
不受限制的用户政策控件
若要允许用户 blank-check-requester@
请求任何证书而不受任何限制,请创建 IAM 绑定,但不指定任何条件,并为用户分配角色 privateca.certificateRequester
。
gcloud
gcloud privateca pools add-iam-policy-binding POOL_NAME \
--role='roles/privateca.certificateRequester' \
--member='user:blank-check-requester@example.com'
其中:
--role
标志的值决定了分配给用户的角色。如需详细了解 CA Service 的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制。--member
标志的值决定了分配了该角色的用户。
测试政策控制措施
实施证书颁发和 IAM 政策后,请务必查看并测试这些政策,以确保它们按预期运行。
检索所有政策绑定
提取在 CA 池上实现的所有 IAM 政策。如需检索 CA 池的所有 IAM 政策,请使用 gcloud privateca pools get-iam-policy
命令:
gcloud
gcloud privateca pools get-iam-policy POOL_NAME
其中:
- POOL_NAME 是 CA 池的唯一标识符。
如需详细了解 gcloud privateca pools get-iam-policy
命令,请参阅 gcloud privateca pool get-iam-policy。
生成证书
本部分介绍了如何生成通用证书以及测试和生产 DNS 证书。
生成测试 DNS 证书
如需允许用户 test-dns-requester@
从 CA 池请求测试 DNS 证书,请使用以下 gcloud
命令:
gcloud
gcloud privateca certificates create test-dns-1 \
--project=PROJECT_ID \
--issuer-location=LOCATION \
--issuer-pool=POOL_NAME \
--dns-san=foo.bar.test.example.com \
--generate-key \
--key-output-file=KEY_FILE_NAME \
--cert-output-file=test_dns_cert.pem \
--template=projects/PROJECT_ID/locations/LOCATION/certificateTemplates/test-server-tls-template
其中:
--issuer-location
标志用于设置证书的位置。如需查看完整的位置列表,请参阅位置。--issuer-pool
标志用于设置请求证书的 CA 池。--dns-san
标志用于设置一个或多个以逗号分隔的 DNS SAN。--generate-key
标志会触发在您的机器上生成新的 RSA-2048 私钥。--key-output-file
标志用于设置写入生成的私钥(采用 PEM 格式)的路径。--cert-output-file
标志用于设置生成的 PEM 编码证书链文件的写入路径(按照从最终实体到根顺序排列)。--template
标志用于设置要用于颁发此证书的证书模板的名称。指定的模板必须与颁发证书的 CA 池位于同一位置。如需详细了解证书模板 请参阅证书模板和颁发政策概览。
生成生产证书
用户 prod-dns-requester
现在可以从 CA 池请求生产 DNS 证书。--dns-san=foo.bar.prod.example.com
会将具有指定值的 DNS 类型的 SAN 添加到证书请求。
gcloud
gcloud privateca certificates create prod-dns-1 \
--project=PROJECT_ID \
--issuer-location=LOCATION \
--issuer-pool=POOL_NAME \
--dns-san=foo.bar.prod.example.com \
--generate-key \
--key-output-file=KEY_FILE_NAME \
--cert-output-file=prod_dns_cert.pem \
--template=projects/PROJECT_ID/locations/LOCATION/certificateTemplates/prod-server-tls-template
其中:
--issuer-location
标志用于设置证书的位置。如需查看完整的位置列表,请参阅位置。--issuer-pool
标志用于设置请求证书的 CA 池。--dns-san
标志用于设置一个或多个以逗号分隔的 DNS SAN。--generate-key
标志会触发在您的机器上生成新的 RSA-2048 私钥。--key-output-file
标志用于设置写入生成的私钥(采用 PEM 格式)的路径。--cert-output-file
标志用于设置生成的 PEM 编码证书链文件的写入路径(按照从最终实体到根顺序排列)。--template
标志用于设置用于颁发此证书的证书模板的名称。指定的模板必须与颁发证书的 CA 池位于同一位置。如需详细了解证书模板 请参阅证书模板和颁发政策概览。
生成通用证书
用户 blank-check-requester@
可以使用 gcloud privateca certificates create
命令从 CA 池中请求任何证书。
如需向 CA 池请求证书,您可以使用 CA Service 创建的公钥/私钥。如需详细了解如何申请证书,请参阅申请证书和查看已颁发的证书。
清理
本部分介绍了如何移除 CA 池的 IAM 政策。
移除特定 IAM 绑定
如需为 blank-check-requester
用户移除 CA 池上的 IAM 条件绑定,请使用以下 gcloud
命令:
gcloud
gcloud privateca pools remove-iam-policy-binding POOL_NAME \
--role='roles/privateca.certificateRequester' \
--member='user:blank-check-requester@'
其中:
--role
标志的值决定了分配给用户的角色。如需详细了解 CA Service 的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制。--member
标志的值决定了分配了该角色的用户。
移除特定 IAM 绑定时,您必须在 gcloud privateca pools remove-iam-policy-binding
命令中提供与 IAM 绑定相关的所有信息。一个角色和成员可能有多个具有不同条件的 IAM 绑定。请务必提供与 IAM 绑定相关的所有详细信息,以免意外删除其他绑定。
如需详细了解 gcloud privateca pools remove-iam-policy-binding
命令,请参阅 gcloud privateca pool remove-iam-policy-binding。
移除所有 IAM 条件式绑定
如需移除 IAM 绑定,您可以使用 gcloud privateca pools remove-iam-policy-binding
命令。移除 IAM 条件绑定时,您必须提供有关该绑定的所有信息。一个用户和一个角色可以有多个条件绑定。如需移除所有条件绑定,请在 gcloud
命令中使用 --all
标志。
使用以下 gcloud
命令移除 prod-code-signing-requester
用户的所有绑定。
gcloud
gcloud privateca pools remove-iam-policy-binding POOL_NAME \
--role='roles/privateca.certificateRequester' \
--member='user:prod-code-signing-requester@' \
--all
其中:
--role
标志的值决定了分配给用户的角色。如需详细了解 CA Service 的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制。--member
标志的值决定了分配了该角色的用户。