教程:管理政策控制措施

本教程介绍了如何对 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 \
        --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 模板和生产 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 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 \
        --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

  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 \
  --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 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

其中:

  • --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 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 \
    --role='roles/privateca.certificateRequester' \
    --member='user:prod-code-signing-requester@' \
    --all

其中:

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