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

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

测试集群操作符

作为Kubernetes集群操作符,您需要对想要使用的SUSE Security Admission Controller策略进行测试。

您可能会有以下问题:

  • 正确的策略设置是什么,以获得所需的验证/变更结果?

  • 当我:

    • 将策略升级到新版本时,如何确保一切按预期工作?

    • 添加/更改Kubernetes资源时,如何确保一切按预期工作?

    • 更改策略的配置参数时,如何确保一切按预期工作?

    • 等等?

Admission Controller有一个工具,https://github.com/kubewarden/kwctl[kwctl],允许在Kubernetes外部测试策略。

要使用`kwctl`,您需要使用以下输入调用它:

  1. 要运行的策略的WebAssembly二进制文件URI。 Admission Controller策略可以从以下位置加载:

    • 本地文件系统`file://`

    • HTTP(s)服务器`https://`

    • OCI注册表`registry://`。

  2. 要测试的准入请求对象。 您需要使用`--request-path`参数提供它。 通过将`--request-path`设置为`-来使用`stdin

  3. 通过`--settings-json`标志以内联JSON的形式设置运行时策略。 或者是一个JSON或YAML文件,通过`--settings-path`从文件系统加载。

在测试`kwctl`之后,将`ValidationResponse`对象打印到标准输出。

您可以下载`kwctl`的预构建二进制文件 在这里

一个测试示例

本节描述如何使用不同的配置和验证请求对象测试 psp-apparmor 策略。

创建`AdmissionReview`请求

您需要创建包含`AdmissionReview`对象的文件以测试该策略。

您可以创建一个名为`pod-req-no-specific-apparmor-profile.json`的文件,内容如下:

pod-req-no-specific-apparmor-profile.json
{
  "uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
  "kind": {
    "kind": "Pod",
    "version": "v1"
  },
  "object": {
    "metadata": {
      "name": "no-apparmor"
    },
    "spec": {
      "containers": [
        {
          "image": "nginx",
          "name": "nginx"
        }
      ]
    }
  },
  "operation": "CREATE",
  "requestKind": {"version": "v1", "kind": "Pod"},
  "userInfo": {
    "username": "alice",
    "uid": "alice-uid",
    "groups": ["system:authenticated"]
  }
}

该请求尝试创建一个未指定任何AppArmor控制文件的Pod。 这是因为它没有`annotation`带有`container.apparmor.security.beta.kubernetes.io/<container-name>`键的。

您可以创建一个名为`pod-req-apparmor-unconfined.json`的文件,内容如下:

pod-req-apparmor-unconfined.json
{
  "uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
  "kind": {
    "kind": "Pod",
    "version": "v1"
  },
  "object": {
    "metadata": {
      "name": "privileged-pod",
      "annotations": {
        "container.apparmor.security.beta.kubernetes.io/nginx": "unconfined"
      }
    },
    "spec": {
      "containers": [
        {
          "image": "nginx",
          "name": "nginx"
        }
      ]
    }
  },
  "operation": "CREATE",
  "requestKind": {"version": "v1", "kind": "Pod"},
  "userInfo": {
    "username": "alice",
    "uid": "alice-uid",
    "groups": ["system:authenticated"]
  }
}

该请求尝试创建一个名为`nginx`的Pod,其中容器使用`unconfined` AppArmor控制文件运行。 这仅用于教程目的。 以`unconfined`模式运行是一种不良的安全实践。

现在您可以创建一个名为 `pod-req-apparmor-custom.json`的文件,内容如下:

pod-req-apparmor-custom.json
{
  "uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
  "kind": {
    "kind": "Pod",
    "version": "v1"
  },
  "object": {
    "metadata": {
      "name": "privileged-pod",
      "annotations": {
        "container.apparmor.security.beta.kubernetes.io/nginx": "localhost/nginx-custom"
      }
    },
    "spec": {
      "containers": [
        {
          "image": "nginx",
          "name": "nginx"
        }
      ]
    }
  },
  "operation": "CREATE",
  "requestKind": {"version": "v1", "kind": "Pod"},
  "userInfo": {
    "username": "alice",
    "uid": "alice-uid",
    "groups": ["system:authenticated"]
  }
}

这些都是简化的`AdmissionReview`对象。 仅使用与我们测试该策略相关的字段。

测试该策略

现在您可以使用`kwctl`来测试创建一个不指定AppArmor控制文件的Pod:

$ kwctl run \
    --request-path pod-req-no-specific-apparmor-profile.json \
    registry://ghcr.io/kubewarden/policies/psp-apparmor:v0.1.4 \
    | jq

该策略接受请求并生成如下输出:

{
  "uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
  "allowed": true
}

该策略拒绝创建带有`unconfined` AppArmor控制文件的Pod:

$ kwctl run \
    --request-path pod-req-apparmor-unconfined.json \
    registry://ghcr.io/kubewarden/policies/psp-apparmor:v0.1.4 \
    | jq
{
  "uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
  "allowed": false,
  "status": {
    "message": "These AppArmor profiles are not allowed: [\"unconfined\"]"
  }
}

在这两次您运行策略时*没有*提供任何设置。 正如https://github.com/kubewarden/psp-apparmor#configuration[策略文档]所述,这会导致禁止使用非默认控制文件。

使用自定义`nginx`控制文件的Pod也会被策略拒绝:

$ kwctl run \
    --request-path pod-req-apparmor-custom.json \
    registry://ghcr.io/kubewarden/policies/psp-apparmor:v0.1.4 \
    | jq
{
  "uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
  "allowed": false,
  "status": {
    "message": "These AppArmor profiles are not allowed: [\"localhost/nginx-custom\"]"
  }
}

您可以更改默认行为,允许使用选定的AppArmor控制文件:

$ kwctl run \
    --request-path pod-req-apparmor-custom.json \
    --settings-json '{"allowed_profiles": ["runtime/default", "localhost/nginx-custom"]}' \
    registry://ghcr.io/kubewarden/policies/psp-apparmor:v0.1.4 \
    | jq

现在请求成功:

{
  "uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
  "allowed": true
}

自动化

您可以使用https://github.com/bats-core/bats-core[bats]自动化所有这些步骤。

您可以编写一系列测试,并将它们的执行集成到现有的CI和CD管道中。

这些命令可以被“包装”成一个`bats`测试:

一个batstest
@test "all is good" {
  run kwctl run \
    --request-path pod-req-no-specific-apparmor-profile.json \
    registry://ghcr.io/kubewarden/policies/psp-apparmor:v0.1.4

  # this prints the output when one the checks below fails
  echo "output = ${output}"

  # request accepted
  [ $(expr "$output" : '.*"allowed":true.*') -ne 0 ]
}

@test "reject" {
  run kwctl run \
    --request-path pod-req-apparmor-custom.json \
    registry://ghcr.io/kubewarden/policies/psp-apparmor:v0.1.4

  # this prints the output when one the checks below fails
  echo "output = ${output}"

  # request rejected
  [ $(expr "$output" : '.*"allowed":false.*') -ne 0 ]
}

如果`bats`代码在文件`e2e.bats`中,您可以运行测试如下:

$ bats e2e.bats
 ✓ all is good
 ✓ reject

2 tests, 0 failures

部分有更多关于为您的策略编写端到端测试的信息。