|
本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。 |
|
这是尚未发布的文档。 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进行检查,而不仅仅是issuer和subject。如果处理 GitHub Actions,您应使用此kind。 -
genericIssuer:对于使用 Sigstore 的无密钥工作流进行的签名,用户需要自行验证证书issuer和subject。它接受一个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)字段值必须以签名验证中定义的值为前缀。
-
|
|
例如,此配置意味着策略必须由 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