管理政策控制措施

本教程介绍了如何对 Certificate Authority Service 资源实施政策控制。

目标

本教程介绍了如何配置共享证书授权机构 (CA) 池,以便通过以下政策控制措施颁发 DNS 证书:

  • 用户 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 --location=LOCATION --tier=ENTERPRISE
    

    其中:

    • LOCATION 是您要创建 CA 池的位置。如需查看位置的完整列表,请参阅位置
    • --tier 标志用于指定 CA 池的层级。如需详细了解层级,请参阅选择运营层级
  2. 如需在新建的 CA 池中创建具有 Google 管理的资源的 CA,请使用以下 gcloud 命令:

    gcloud

    gcloud privateca roots create CA_NAME \
        --pool=POOL_NAME \
        --location=LOCATION \
        --subject="CN=Example DNS Root, O=Example LLC, C=US" \
        --validity="10Y" \
        --max-chain-length=1 \
        --auto-enable
    

    其中:

    • POOL_NAME 是 CA 池的唯一标识符。
    • LOCATION 是您要创建 CA 池的位置。如需查看位置的完整列表,请参阅位置
    • --subject 标志用于传递证书主题的名称。
    • --validity 标志用于确定 CA 的有效期。默认有效期为 10 年。
    • --max-chain-length 标志用于确定 CA 下允许的下级 CA 的最大深度。
    • --auto-enable 标志会在 ENABLED 状态下创建 CA,而不是在 STAGED 状态下创建。如需详细了解 CA 状态,请参阅 CA 状态

为测试证书配置政策控制

这些签发政策变更会立即生效。建议您先配置测试政策控件,然后再将其用于生产环境。本部分介绍了如何配置测试政策控件。

对于测试 DNS 模板和生产 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 服务的 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 \
        --location=LOCATION \
        --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 条件的文件的名称。
  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 服务的 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 进行访问权限控制

  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 \
        --location=LOCATION \
        --role='roles/privateca.certificateRequester' \
        --member='user:prod-dns-requester@' \
        --condition-from-file=./prod_dns_condition.yaml
    

    其中:

    • --role 标志用于传递要分配给成员的角色名称。如需详细了解 CA 服务的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制
    • --member 标志用于传递要添加绑定的成员。
    • condition-from-file 标志用于传递包含 CEL 条件的文件的名称。

    如需详细了解 gcloud privateca pools add-iam-policy-binding 命令,请参阅 gcloud privateca pools 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 服务的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制
    • --member 标志用于传递要添加绑定的成员。

不受限制的用户政策控制

如需允许用户 blank-check-requester@ 在不受任何限制的情况下请求任何证书,请创建一个没有任何条件限制的 IAM 绑定,向该用户授予角色 privateca.certificateRequester

gcloud

gcloud privateca pools add-iam-policy-binding POOL_NAME \
    --location=LOCATION \
    --role='roles/privateca.certificateRequester' \
    --member='user:blank-check-requester@example.com'

其中:

  • --role 标志的值决定了分配给用户的角色。如需详细了解 CA 服务的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制
  • --member 标志的值决定了分配角色的用户。

替换以下内容:

  • POOL_NAME:CA 池的唯一标识符。
  • LOCATION:CA 池的位置。如需查看位置的完整列表,请参阅位置

测试政策控制措施

实施证书颁发和 IAM 政策后,请务必检查并测试这些政策,确保它们按预期运行。

检索所有政策绑定

获取在 CA 池上实现的所有 IAM 政策。 如需检索 CA 池的所有 IAM 政策,请使用 gcloud privateca pools get-iam-policy 命令:

gcloud

gcloud privateca pools get-iam-policy POOL_NAME --location=LOCATION

替换以下内容:

  • POOL_NAME:CA 池的唯一标识符。
  • LOCATION:CA 池的位置。如需查看位置的完整列表,请参阅位置

如需详细了解 gcloud privateca pools get-iam-policy 命令,请参阅 gcloud privateca pools 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

其中:

  • --dns-san 标志用于设置一个或多个以逗号分隔的 DNS SAN。
  • --generate-key 标志会触发在您的机器上生成新的 RSA-2048 私钥。
  • --key-output-file 标志用于设置写入生成的私钥(采用 PEM 格式)的路径。
  • --cert-output-file 标志用于设置写入生成的 PEM 编码证书链文件(从实体到根)的路径。
  • --template 标志用于设置您要用于颁发相应证书的证书模板的名称。指定的模板必须与发证 CA 池位于同一位置。如需详细了解证书模板,请参阅证书模板和签发政策概览

替换以下内容:

  • PROJECT_ID:项目的唯一标识符。
  • LOCATION:请求证书的 CA 池的位置。如需查看位置的完整列表,请参阅位置
  • POOL_NAME: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 \
    --location=LOCATION \
    --role='roles/privateca.certificateRequester' \
    --member='user:blank-check-requester@'

其中:

  • --role 标志的值决定了分配给用户的角色。如需详细了解 CA 服务的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制
  • --member 标志的值决定了分配角色的用户。

移除特定 IAM 绑定时,您必须在 gcloud privateca pools remove-iam-policy-binding 命令中提供与该 IAM 绑定相关的所有信息。一个角色和成员可能具有多个具有不同条件的 IAM 绑定。请务必提供与 IAM 绑定相关的所有详细信息,以免意外删除其他绑定。

如需详细了解 gcloud privateca pools remove-iam-policy-binding 命令,请参阅 gcloud privateca pools 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 \
    --location=LOCATION \
    --role='roles/privateca.certificateRequester' \
    --member='user:prod-code-signing-requester@' \
    --all

其中:

  • --role 标志的值决定了分配给用户的角色。如需详细了解 CA 服务的 IAM 角色和权限,请参阅使用 IAM 进行访问权限控制
  • --member 标志的值决定了分配角色的用户。