本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

这是尚未发布的文档。 Admission Controller 1.34-dev.

验证配置格式

简介

您可以使用 verification-config 格式:

  • policy-server 来验证策略模块的溯源

  • verify-image-signatures 策略来验证集群镜像的溯源

有关更多信息,请参阅 安全供应链

格式

该配置有 2 个根密钥:

  • allOf:您应满足此处列出的所有验证信息,以验证容器镜像为已签名。

  • anyOf:您必须满足至少 anyOf.minimumMatches 项列出的所有验证信息,才能接受容器镜像为已签名。

这两个根密钥接受类型为 kind 的密钥数组。根据不同用例接受的密钥的完整列表如下:

  • pubKey:对于使用传统公钥/私钥密码学进行的签名。

  • githubAction:对于在 GitHub Actions 中使用 Sigstore 的无密钥工作流进行的签名。Admission Controller 将此信息与由 GitHub 的 OpenID Connect 创建的 x509 证书扩展 workflow_repository 进行检查,而不仅仅是 issuersubject。如果处理 GitHub Actions,您应使用此 kind

  • genericIssuer:对于使用 Sigstore 的无密钥工作流进行的签名,用户需要自行验证证书 issuersubject。它接受一个 subject,可以是:

    • equal:此处传递的值必须与签名证书中的 subject 完全匹配。

    • urlPrefix:此处传递的值后缀为 / 以防止拼写欺骗,且必须是签名证书中 subject 的前缀。

`kind`键接受一个可选的`annotations`键,包含必须在签名中存在的键值列表。

示例

这是一个使用Sigstore工作流验证签名的配置示例:

---
apiVersion: v1

allOf:
  - kind: githubAction
    owner: kubewarden   # mandatory
    repo: policy-server # optional
    annotations:  # optional
      env: prod

anyOf: # at least `+anyOf.minimumMatches+` are required to match
  minimumMatches: 2 # default is 1
  signatures:
  - kind: pubKey
    owner: alice # optional
    key: | # mandatory
         -----BEGIN PUBLIC KEY-----
         MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQiTy5S+2JFvVlhUwWPLziM7iTM2j
         byLgh2IjpNQN0Uio/9pZOTP/CsJmXoUNshfpTUHd3OxgHgz/6adtf2nBwQ==
         -----END PUBLIC KEY-----
    annotations:  # optional
      env: prod
  - kind: genericIssuer
    issuer: https://github.com/login/oauth
    subject:
      equal: alice@example.com
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      equal: https://github.com/bob/app-example/.github/workflows/release.yml@refs/heads/main
    annotations:  # optional
      env: prod
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      urlPrefix: https://github.com/bob # <- it will be post-fixed with `+/+` for security reasons

签名配置参考

您可以验证文件中包含的签名要求。展开以查看示例:

签名要求文件
apiVersion: v1

allOf:
  - kind: githubAction
    owner: kubewarden   # mandatory
    annotations:
      env: prod

anyOf: # at least `+anyOf.minimumMatches+` are required to match
  minimumMatches: 2 # default is 1
  signatures:
  - kind: pubKey
    owner: flavio # optional
    key: .... # mandatory
    annotations:  # optional
      env: prod
      foo: bar
  - kind: pubKey
    owner: victor # optional
    key: .... # mandatory
  - kind: genericIssuer
    issuer: https://github.com/login/oauth
    subject:
      equal: alice@example.com
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      equal: https://github.com/flavio/policy-secure-pod-images/.github/workflows/release.yml@refs/heads/main
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      urlPrefix: https://github.com/flavio/
  - kind: genericIssuer
    issuer: https://token.actions.githubusercontent.com
    subject:
      urlPrefix: https://github.com/kubewarden # <- it will be post-fixed with `+/+` for security reasons
  - kind: githubAction
    owner: flavio   # mandatory
    repo: policy1 # optional
  - kind: pubKey
    owner: alice # optional
    key: .... # mandatory

签名验证

之前的配置包含两个部分,allOf`和`anyOf

  • allOf:只有在所有签名要求有效时,您才信任该策略。

  • anyOf:如果`minimumMatches`标准有效,您就信任该策略。

在示例中,minimumMatches`字段为2。因此,您需要满足至少两个签名要求。`minimumMatches`字段的默认值为`1

对于签名验证,您需要满足来自`allOf`的所有签名要求*和*来自`anyOf`的最小数量。

公钥验证

要检查策略是否具有正确的公钥签名,您需要指定密钥数据和密钥的所有者。在此示例中,您将`kind`设置为`pubKey`,并且`key`具有公钥。所有者字段是可选的,但可以帮助澄清谁拥有该密钥。

  - kind: pubKey
    owner: bob # optional
    key: |
      -----BEGIN PUBLIC KEY-----
      MBFKHFDGHKIJH0CAQYIKoZIzj0DAQcDQgAEX0HFTtCfTtPmkx5p1RbDE6HJSGAVD
      BVDF6SKFSF87AASUspkQsN3FO4iyWodCy5j3o0CdIJD/KJHDJFHDFIu6sA==
      -----END PUBLIC KEY-----

无密钥签名验证

以无密钥模式签名的策略没有您可以验证的公钥。您仍然可以利用签名过程中所采用的 OpenID Connect (OIDC) 数据来验证策略。为此,有必要将签名验证定义为 genericIssuer

可以验证签名中的信息:

  • issuer(必需):这与 Fulcio 生成的证书中的 Issuer 属性匹配。这显示了用于签署策略的 OIDC。

  • subject:用于匹配 Fulcio 证书中 Subject 属性的字段。Subject(Fulcio)字段包含用于对 OIDC 提供者进行身份验证的用户。验证字段 subject 可以有两个子字段之一:

    • equal:证书中的 Subject(Fulcio)必须等于签名验证中的值;

    • urlPrefix:证书的 Subject(Fulcio)字段值必须以签名验证中定义的值为前缀。

cosign verifykwctl inspect 都可以显示有关无密钥签名的信息。

例如,此配置意味着策略必须由 Alice 使用 GitHub OIDC 签署的无密钥签名:

- kind: genericIssuer
  issuer: https://github.com/login/oauth
  subject:
    equal: alice@example.com

此配置需要在 GitHub Actions 中签署策略,来自 GitHub 用户 flavio 拥有的储存库:

- kind: genericIssuer
  issuer: https://token.actions.githubusercontent.com
  subject:
    urlPrefix: https://github.com/flavio

GitHub Actions 签名验证

“kind”,githubAction 用于验证在 GitHub Actions 中签署的策略。 您也可以使用 genericIssuer kind 来完成此操作。为了简化签名要求过程,请为 githubAction 使用两个额外字段:

  • owner(必需):要信任的用户或组织的 GitHub ID。

  • repo:要信任的储存库名称。

例如,最后的代码片段,使用`genericIssuer`,可以重写为:

- kind: githubAction
  owner: flavio

签名注释验证

所有签名类型都可以有其他可选的验证字段,annotations。 这些字段是在签署过程中添加的键/值数据。

使用Admission Controller,您可以验证策略签名是否来自受信任的用户*和*并具有特定的注释。

下一个验证检查策略的两个条件:

  • 它是用特定的密钥签署的

  • 它具有生产环境注释。

- kind: pubKey
  key: |
    -----BEGIN PUBLIC KEY-----
    MBFKHFDGHKIJH0CAQYIKoZIzj0DAQcDQgAEX0HFTtCfTtPmkx5p1RbDE6HJSGAVD
    BVDF6SKFSF87AASUspkQsN3FO4iyWodCy5j3o0CdIJD/KJHDJFHDFIu6sA==
    -----END PUBLIC KEY-----
  annotations:
    environment: production

使用签名验证配置文件检查策略OCI工件。

您可以使用验证配置文件测试策略是否通过验证。使用`--verification-config-path`标志的`kwctl verify`命令。

$ cat signatures_requirements.yaml
apiVersion: v1
allOf:
  - kind: pubKey
    key: |
      -----BEGIN PUBLIC KEY-----
      MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5Q+cN1Jj2S7N05J4AXnqwP2DyzSg
      Mc+raYce2Wthrd30MSgFtoh5ADAkCd/nML2Nx8UD9KBuASRb0gG5jXqgMQ==
      -----END PUBLIC KEY-----

$ kwctl verify --verification-config-path signatures_requirements.yaml ghcr.io/kubewarden/policies/user-group-psp:latest
2022-03-29T17:34:37.847169Z  INFO kwctl::verify: Policy successfully verified

最后这个例子测试给定策略是否来自Admission Controller组织:

$ cat kubewarden_signatures.yaml
apiVersion: v1
allOf:
  - kind: githubAction
    owner: kubewarden

$ kwctl verify --verification-config-path kubewarden_signatures.yaml ghcr.io/kubewarden/policies/user-group-psp:latest
2022-03-29T18:07:39.062292Z  INFO kwctl::verify: Policy successfully verified