GKE AppArmor 配置文件不受限制,即使该节点已定义它并且可以正常工作

GKE AppArmor profile is unconfined eventhough the node has it defined and working

我正在尝试加载我使用 GKE 和以下一些说明创建的 apparmor 配置文件。

要应用创建的应用装甲配置文件,我遵循了以下说明:

https://cloud.google.com/container-optimized-os/docs/how-to/secure-apparmor#creating_a_custom_security_profile

这只是应用于节点的 apparmor 解析器,以及一些后续说明以在节点重新启动期间应用相同的配置文件创建。 基本上就是运行下面一行:

/sbin/apparmor_parser --replace --write-cache /etc/apparmor.d/no_raw_net

并测试具有此配置文件的容器是否按预期受到保护。

作为第二步,我在 pod 的环境变量中定义了一个带有 apparmor 配置文件名称的环境变量。如此处所述:

https://cloud.google.com/migrate/anthos/docs/troubleshooting/app-armor-profile

基本上就是这样定义pod:

spec:
  containers:
  - image: gcr.io/my-project/my-container:v1.0.0
    name: my-container
    env:
    - name: HC_APPARMOR_PROFILE
      value: "apparmor-profile-name"
    securityContext:
      privileged: true

host 内部的 apparmor 配置文件按预期工作。但是我不能提供这个配置文件。

还尝试删除在 gke 的文档中定义为 true 的 pod 的安全上下文部分。

最后但同样重要的是,我尝试使用 k8s pod 注释,这是 k8s 的一个功能,可以为给定容器设置配置文件,如下所述:

https://kubernetes.io/docs/tutorials/security/apparmor/

有了这个 pod 看起来像这样:

apiVersion: v1
kind: Pod
metadata:
  name: hello-apparmor-2
  annotations:
    container.apparmor.security.beta.kubernetes.io/hello: localhost/k8s-apparmor-example-allow-write
spec:
  containers:
  - name: hello
    image: busybox
    command: [ "sh", "-c", "echo 'Hello AppArmor!' && sleep 1h" ]

但也没有好运应用给定的配置文件。

还尝试将用户数据配置应用为节点实例的 cloud-init 的自定义元数据,因此它也可以将我创建的配置文件添加到 app armor,并仔细检查创建问题不是问题,但集群 matadata 的版本禁用 post 创建集群,并且不允许使用用户数据创建新的集群节点,因为用户数据是为容器优化 os 将由 google.

定义的用户数据

无论我做什么,我总是以当前容器的无限制配置文件或“cri-containerd.apparmor.d(强制)”结束,这取决于安全上下文是否设置为真...

关于如何向 GKE 中的 pod 提供给定配置文件,您有什么建议吗?

如果我对问题的理解正确,那么您似乎将配置文件的文件名与配置文件名称混在一起了。

annotations:
    container.apparmor.security.beta.kubernetes.io/<container-name>: localhost/<profile-name>

这里,<profile-name>是配置文件的名称,它与配置文件的文件名不同。例如:在下面的示例中,文件名是 no_raw_net 并且 配置文件名称是 no-ping.

cat > /etc/apparmor.d/no_raw_net <<EOF
#include <tunables/global>

profile no-ping flags=(attach_disconnected,mediate_deleted) {
  #include <abstractions/base>

  network inet tcp,
  network inet udp,
  network inet icmp,

  deny network raw,
  deny network packet,
  file,
  mount,
}
EOF

如前所述,我错过了我命名事物的方式,但除此之外,我还想提及另一种选择:https://github.com/kubernetes-sigs/security-profiles-operator 与一些允许与 apparmor、seccomp 集成的 kubernetes CRD 一起使用, 和 SELinux。

在撰写本文时,AppArmor 之类的一些实现看起来仍处于 WIP 中,我希望这项计划能够向前推进。