7.6. 管理 seccomp 配置集
创建和管理 seccomp 配置集,并将它们绑定到工作负载。
Security Profiles Operator 仅支持 Red Hat Enterprise Linux CoreOS (RHCOS) worker 节点。不支持 Red Hat Enterprise Linux (RHEL) 节点。
7.6.1. 创建 seccomp 配置集 复制链接链接已复制到粘贴板!
使用 SeccompProfile
对象来创建配置集。
seccompProfile
对象可以限制容器内的系统调用,限制应用程序的访问。
流程
运行以下命令来创建项目:
oc new-project my-namespace
$ oc new-project my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
SeccompProfile
对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
seccomp 配置集将保存在 /var/lib/kubelet/seccomp/operator/<namespace>/<name>.json
中。
init
容器创建 Security Profiles Operator 的根目录,以便在没有 root
组或用户 ID 权限的情况下运行 Operator。会创建一个符合链接,从无根配置存储 /var/lib/openshift-security-profiles
到 kubelet root /var/lib/kubelet/seccomp/operator
中的默认 seccomp
root 路径。
7.6.2. 将 seccomp 配置集应用到 pod 复制链接链接已复制到粘贴板!
创建 pod 以应用其中一个创建的配置集。
流程
创建定义
securityContext
的 pod 对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,查看
seccompProfile.localhostProfile
属性的配置集路径:oc -n my-namespace get seccompprofile profile1 --output wide
$ oc -n my-namespace get seccompprofile profile1 --output wide
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Installed 14s operator/my-namespace/profile1.json
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Installed 14s operator/my-namespace/profile1.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,查看 localhost 配置集的路径:
oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'
$ oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
operator/my-namespace/profile1.json
operator/my-namespace/profile1.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
localhostProfile
输出应用到补丁文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将配置集应用到任何其他工作负载,如
Deployment
对象:oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=merge
$ oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
deployment.apps/myapp patched
deployment.apps/myapp patched
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
运行以下命令确认配置集是否已正确应用:
oc -n my-namespace get deployment myapp --output=jsonpath='{.spec.template.spec.securityContext}' | jq .
$ oc -n my-namespace get deployment myapp --output=jsonpath='{.spec.template.spec.securityContext}' | jq .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.2.1. 使用 ProfileBindings 将工作负载绑定到配置集 复制链接链接已复制到粘贴板!
您可以使用 ProfileBinding
资源将安全配置集绑定到容器的 SecurityContext
。
流程
要将使用
quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
镜像的 pod 绑定到示例SeccompProfile
配置集,请在与 pod 和SeccompProfile
对象相同的命名空间中创建一个ProfileBinding
对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要使用
image: "*"
通配符属性,将所有新 pod 与给定命名空间中的默认安全配置集绑定。运行以下命令,使用
enable-binding=true
标记命名空间:oc label ns my-namespace spo.x-k8s.io/enable-binding=true
$ oc label ns my-namespace spo.x-k8s.io/enable-binding=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 定义名为
test-pod.yaml
的 pod:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 pod:
oc create -f test-pod.yaml
$ oc create -f test-pod.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果 pod 已存在,您必须重新创建 pod 才能使绑定正常工作。
验证
运行以下命令确认 pod 会继承
ProfileBinding
:oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'
$ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
{"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}
{"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.3. 从工作负载记录配置集 复制链接链接已复制到粘贴板!
Security Profiles Operator 可以使用 ProfileRecording
对象记录系统调用,从而更轻松地为应用程序创建基准配置集。
当使用日志增强器来记录 seccomp 配置集时,请验证日志增强功能是否已启用。如需更多信息,请参阅附加资源。
具有 privileged: true
安全上下文保留的容器可防止基于日志的记录。特权容器不受到 seccomp 策略的影响,基于日志的记录利用特殊的 seccomp 配置集来记录事件。
流程
运行以下命令来创建项目:
oc new-project my-namespace
$ oc new-project my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,使用
enable-recording=true
标记命名空间:oc label ns my-namespace spo.x-k8s.io/enable-recording=true
$ oc label ns my-namespace spo.x-k8s.io/enable-recording=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建包含
recorder: logs
变量的ProfileRecording
对象:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个工作负载来记录:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令确认 pod 处于
Running
状态:oc -n my-namespace get pods
$ oc -n my-namespace get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 0 18s
NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 0 18s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确认增强器表示它接收这些容器的审计日志:
oc -n openshift-security-profiles logs --since=1m --selector name=spod -c log-enricher
$ oc -n openshift-security-profiles logs --since=1m --selector name=spod -c log-enricher
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
I0523 14:19:08.747313 430694 enricher.go:445] log-enricher "msg"="audit" "container"="redis" "executable"="/usr/local/bin/redis-server" "namespace"="my-namespace" "node"="xiyuan-23-5g2q9-worker-eastus2-6rpgf" "pid"=656802 "pod"="my-pod" "syscallID"=0 "syscallName"="read" "timestamp"="1684851548.745:207179" "type"="seccomp"
I0523 14:19:08.747313 430694 enricher.go:445] log-enricher "msg"="audit" "container"="redis" "executable"="/usr/local/bin/redis-server" "namespace"="my-namespace" "node"="xiyuan-23-5g2q9-worker-eastus2-6rpgf" "pid"=656802 "pod"="my-pod" "syscallID"=0 "syscallName"="read" "timestamp"="1684851548.745:207179" "type"="seccomp"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
删除 pod:
oc -n my-namepace delete pod my-pod
$ oc -n my-namepace delete pod my-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确认 Security Profiles Operator 协调两个 seccomp 配置集:
oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
$ oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow seccompprofile 的输出示例
NAME STATUS AGE test-recording-nginx Installed 2m48s test-recording-redis Installed 2m48s
NAME STATUS AGE test-recording-nginx Installed 2m48s test-recording-redis Installed 2m48s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.3.1. 每个容器配置集实例合并 复制链接链接已复制到粘贴板!
默认情况下,每个容器实例记录都记录到单独的配置文件中。Security Profiles Operator 可将每个容器配置集合并到一个配置集中。当使用 ReplicaSet
或 Deployment
对象部署应用程序时,合并配置集很有用。
流程
编辑
ProfileRecording
对象使其包含mergeStrategy: containers
变量:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令标记命名空间:
oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite=true
$ oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用以下 YAML 创建工作负载:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要记录单个配置集,请运行以下命令删除部署:
oc delete deployment nginx-deploy -n my-namespace
$ oc delete deployment nginx-deploy -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要合并配置集,请运行以下命令删除配置集记录:
oc delete profilerecording test-recording -n my-namespace
$ oc delete profilerecording test-recording -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要启动合并操作并生成结果配置集,请运行以下命令:
oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
$ oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow seccompprofiles 的输出示例
NAME STATUS AGE test-recording-nginx-record Installed 55s
NAME STATUS AGE test-recording-nginx-record Installed 55s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要查看任何容器使用的权限,请运行以下命令:
oc get seccompprofiles test-recording-nginx-record -o yaml
$ oc get seccompprofiles test-recording-nginx-record -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow