GKE AppArmor 配置文件不受限制,即使该节点已定义它并且可以正常工作
GKE AppArmor profile is unconfined eventhough the node has it defined and working
我正在尝试加载我使用 GKE 和以下一些说明创建的 apparmor 配置文件。
要应用创建的应用装甲配置文件,我遵循了以下说明:
这只是应用于节点的 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 中,我希望这项计划能够向前推进。
我正在尝试加载我使用 GKE 和以下一些说明创建的 apparmor 配置文件。
要应用创建的应用装甲配置文件,我遵循了以下说明:
这只是应用于节点的 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 中,我希望这项计划能够向前推进。