7.7. 高级安全配置集 Operator 任务
使用高级任务来启用指标、配置 Webhook 或限制系统调用。
7.7.1. 限制 seccomp 配置集中允许的 syscalls
默认情况下,Security Profiles Operator 不限制 seccomp
配置集中的 syscalls
。您可以在 spod
配置中定义允许的 syscalls
列表。
流程
要定义
allowedSyscalls
列表,请运行以下命令来调整spec
参数:$ oc -n openshift-security-profiles patch spod spod --type merge \ -p '{"spec":{"allowedSyscalls": ["exit", "exit_group", "futex", "nanosleep"]}}'
Operator 将仅安装 seccomp
配置集,该配置集在允许列表中定义了 syscalls
的子集。所有不符合这个规则集的配置集都会被拒绝。
当在 spod
配置中修改了允许的 syscalls
列表时,Operator 将识别已安装的不合规的配置集,并自动删除它们。
7.7.2. 容器运行时的基本系统调用
您可以使用 baseProfileName
属性为给定运行时指定最少需要 syscalls
来启动一个容器。
流程
编辑
SeccompProfile
kind 对象,并将baseProfileName: runc-v1.0.0
添加到spec
字段中:apiVersion: security-profiles-operator.x-k8s.io/v1beta1 kind: SeccompProfile metadata: namespace: my-namespace name: example-name spec: defaultAction: SCMP_ACT_ERRNO baseProfileName: runc-v1.0.0 syscalls: - action: SCMP_ACT_ALLOW names: - exit_group
7.7.3. 在 spod 守护进程中启用内存优化
在 spod
守护进程内运行的控制器会在启用配置集记录时监视集群中的所有 pod。这会导致大型集群中的内存用量很高,从而导致 spod
守护进程内存不足或崩溃。
为防止崩溃,spod
守护进程只能配置为仅加载标记为配置集记录的 pod。
默认情况下不启用 SPO 内存优化。
流程
运行以下命令来启用内存优化:
$ oc -n openshift-security-profiles patch spod spod --type=merge -p '{"spec":{"enableMemoryOptimization":true}}'
要记录 pod 的安全配置集,pod 必须使用
spo.x-k8s.io/enable-recording: "true"
标记:apiVersion: v1 kind: Pod metadata: name: my-recording-pod labels: spo.x-k8s.io/enable-recording: "true" # ...
7.7.4. 自定义守护进程资源要求
可以使用 spod
配置中的字段 daemonResourceRequirements
来调整守护进程容器的默认资源要求。
流程
要指定守护进程容器的内存和 cpu 请求和限值,请运行以下命令:
$ oc -n openshift-security-profiles patch spod spod --type merge -p \ '{"spec":{"daemonResourceRequirements": { \ "requests": {"memory": "256Mi", "cpu": "250m"}, \ "limits": {"memory": "512Mi", "cpu": "500m"}}}}'
7.7.5. 为 spod 守护进程 pod 设置自定义优先级类名称
spod
守护进程 pod 的默认优先级类名称设置为 system-node-critical
。通过在 priorityClassName
字段中设置值,可以在 spod
配置中配置自定义优先级类名称。
流程
运行以下命令来配置优先级类名称:
$ oc -n openshift-security-profiles patch spod spod --type=merge -p '{"spec":{"priorityClassName":"my-priority-class"}}'
输出示例
securityprofilesoperatordaemon.openshift-security-profiles.x-k8s.io/spod patched
7.7.6. 使用指标
openshift-security-profiles
命名空间提供指标端点,这些端点由 kube-rbac-proxy 容器进行保护。所有指标都由 openshift-security-profiles
命名空间中的 metrics
服务公开。
Security Profiles Operator 包含一个集群角色和对应的绑定 spo-metrics-client
,用于从集群中检索指标。有两个指标路径可用:
-
metrics.openshift-security-profiles/metrics
: 用于控制器运行时指标 -
metrics.openshift-security-profiles/metrics-spod
: 用于 Operator 守护进程指标
流程
要查看 metrics 服务的状态,请运行以下命令:
$ oc get svc/metrics -n openshift-security-profiles
输出示例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE metrics ClusterIP 10.0.0.228 <none> 443/TCP 43s
要检索指标,请运行以下命令使用
openshift-security-profiles
命名空间中的默认ServiceAccount
令牌查询服务端点:$ oc run --rm -i --restart=Never --image=registry.fedoraproject.org/fedora-minimal:latest \ -n openshift-security-profiles metrics-test -- bash -c \ 'curl -ks -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://metrics.openshift-security-profiles/metrics-spod'
输出示例
# HELP security_profiles_operator_seccomp_profile_total Counter about seccomp profile operations. # TYPE security_profiles_operator_seccomp_profile_total counter security_profiles_operator_seccomp_profile_total{operation="delete"} 1 security_profiles_operator_seccomp_profile_total{operation="update"} 2
要从不同的命名空间中检索指标,请运行以下命令将
ServiceAccount
链接到spo-metrics-client
ClusterRoleBinding
:$ oc get clusterrolebinding spo-metrics-client -o wide
输出示例
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS spo-metrics-client ClusterRole/spo-metrics-client 35m openshift-security-profiles/default
7.7.6.1. controller-runtime 指标
controller-runtime metrics
和 DaemonSet 端点 metrics-spod
提供了一组默认的指标。守护进程提供了其他指标,该指标始终以 security_profiles_operator_
前缀。
指标键 | 可能的标签 | 类型 | 用途 |
---|---|---|---|
|
| 计数 | seccomp 配置集操作的数量。 |
|
| 计数 | seccomp 配置集审计操作的数量。需要启用日志增强。 |
|
| 计数 | seccomp 配置集 bpf 操作的数量。需要启用 bpf 记录器。 |
|
| 计数 | seccomp 配置集数量。 |
|
| 计数 | SELinux 配置集操作的数量。 |
|
| 计数 | SELinux 配置集审核操作的数量。需要启用日志增强。 |
|
| 计数 | SELinux 配置集的数量错误。 |
7.7.7. 使用日志增强
Security Profiles Operator 包含一个日志功能,它默认是禁用的。日志增强容器以 privileged
权限运行,以便从本地节点读取审计日志。日志增强在主机 PID 命名空间 hostPID
中运行。
日志增强必须具有读取主机进程的权限。
流程
运行以下命令修补
spod
配置以启用日志增强:$ oc -n openshift-security-profiles patch spod spod \ --type=merge -p '{"spec":{"enableLogEnricher":true}}'
输出示例
securityprofilesoperatordaemon.security-profiles-operator.x-k8s.io/spod patched
注意Security Profiles Operator 将自动重新部署
spod
守护进程集。运行以下命令来查看审计日志:
$ oc -n openshift-security-profiles logs -f ds/spod log-enricher
输出示例
I0623 12:51:04.257814 1854764 deleg.go:130] setup "msg"="starting component: log-enricher" "buildDate"="1980-01-01T00:00:00Z" "compiler"="gc" "gitCommit"="unknown" "gitTreeState"="clean" "goVersion"="go1.16.2" "platform"="linux/amd64" "version"="0.4.0-dev" I0623 12:51:04.257890 1854764 enricher.go:44] log-enricher "msg"="Starting log-enricher on node: 127.0.0.1" I0623 12:51:04.257898 1854764 enricher.go:46] log-enricher "msg"="Connecting to local GRPC server" I0623 12:51:04.258061 1854764 enricher.go:69] log-enricher "msg"="Reading from file /var/log/audit/audit.log" 2021/06/23 12:51:04 Seeked /var/log/audit/audit.log - &{Offset:0 Whence:2}
7.7.7.1. 使用日志功能跟踪应用程序
您可以使用 Security Profiles Operator 日志增强来跟踪应用程序。
流程
要跟踪应用程序,请创建一个
SeccompProfile
日志记录配置集:apiVersion: security-profiles-operator.x-k8s.io/v1beta1 kind: SeccompProfile metadata: name: log namespace: default spec: defaultAction: SCMP_ACT_LOG
创建 pod 对象以使用配置集:
apiVersion: v1 kind: Pod metadata: name: log-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: Localhost localhostProfile: operator/default/log.json containers: - name: log-container image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21 securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]
运行以下命令检查日志增强的输出:
$ oc -n openshift-security-profiles logs -f ds/spod log-enricher
例 7.1. 输出示例
… I0623 12:59:11.479869 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=3 "syscallName"="close" "timestamp"="1624453150.205:1061" "type"="seccomp" I0623 12:59:11.487323 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=157 "syscallName"="prctl" "timestamp"="1624453150.205:1062" "type"="seccomp" I0623 12:59:11.492157 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=157 "syscallName"="prctl" "timestamp"="1624453150.205:1063" "type"="seccomp" … I0623 12:59:20.258523 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=12 "syscallName"="brk" "timestamp"="1624453150.235:2873" "type"="seccomp" I0623 12:59:20.263349 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=21 "syscallName"="access" "timestamp"="1624453150.235:2874" "type"="seccomp" I0623 12:59:20.354091 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=257 "syscallName"="openat" "timestamp"="1624453150.235:2875" "type"="seccomp" I0623 12:59:20.358844 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=5 "syscallName"="fstat" "timestamp"="1624453150.235:2876" "type"="seccomp" I0623 12:59:20.363510 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=9 "syscallName"="mmap" "timestamp"="1624453150.235:2877" "type"="seccomp" I0623 12:59:20.454127 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=3 "syscallName"="close" "timestamp"="1624453150.235:2878" "type"="seccomp" I0623 12:59:20.458654 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=257 "syscallName"="openat" "timestamp"="1624453150.235:2879" "type"="seccomp" …
7.7.8. 配置 Webhook
配置集绑定和配置集记录对象可以使用 Webhook。配置集绑定和记录对象配置是 MutatingWebhookConfiguration
CR,由 Security Profiles Operator 管理。
要更改 webhook 配置,spod
CR 会公开一个 webhookOptions
字段,允许修改 failurePolicy
、namespaceSelector
和 objectSelector
变量。这可让您将 webhook 设置为 "soft-fail",或将它们限制为命名空间的子集,以便即使 Webhook 失败,其他命名空间或资源不受影响。
流程
通过创建以下补丁文件,将
record.spo.io
Webhook 配置设置为仅记录带有spo-record=true
标签的 pod:spec: webhookOptions: - name: recording.spo.io objectSelector: matchExpressions: - key: spo-record operator: In values: - "true"
运行以下命令来修补
spod/spod
实例:$ oc -n openshift-security-profiles patch spod \ spod -p $(cat /tmp/spod-wh.patch) --type=merge
要查看生成的
MutatingWebhookConfiguration
对象,请运行以下命令:$ oc get MutatingWebhookConfiguration \ spo-mutating-webhook-configuration -oyaml