教程:管理政策控件

本教程介绍了如何对 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 池

如需创建 CA 池,请按照以下说明操作:

  1. 如需创建使用 issuance-policy.yaml 文件的 CA 池,请使用以下 gcloud 命令:

    gcloud

    gcloud privateca pools create POOL_NAME \
        --tier=ENTERPRISE
    

    其中:

    • --tier 标志用于指定 CA 池的层级。如需详细了解层级,请参阅选择操作层级
  2. 如需在新创建的 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) 表达式实现的。证书模板还会丢弃证书请求中指定的任何主题。

  1. 使用以下 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 进行访问权限控制

  1. 创建 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 条件中提供的模板名称必须与证书请求中的模板名称一致。因此,如果您要在 CEL 表达式的 privateca.googleapis.com/template 属性中提供项目 ID,则还必须在请求证书时提供项目 ID。如果您在 CEL 表达式中提供项目编号,则还必须在证书请求中提供项目编号。

  2. 使用以下 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 Service 的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制
    • --member 标志用于传递要为其添加绑定的成员。
    • condition-from-file 标志用于传递符合 CEL 条件的文件的名称。
  3. 使用以下 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 template create

创建生产 DNS IAM 绑定

如需允许 DNS CA 池中的用户 prod-dns-requester@ 请求生产服务器 TLS 证书,请在 CA 池上创建条件 IAM 绑定。仅当证书请求包含对 prod-server-tls-template 模板的引用时,才能向用户 prod-dns-requester@ 授予 privateca.certificateRequester 角色。如需详细了解 IAM 角色和权限,请参阅:使用 IAM 进行访问权限控制

  1. 创建 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"
    
  2. 使用以下 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 privatecapool add-iam-policy-binding

  3. 如需添加允许 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 privatecapool 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 clusters 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 标志的值决定了分配了角色的用户。