如何通过SecurityContextConstraints实现OpenShift容器访问主机/proc目录
OpenShift 4.13:通过自定义SCC实现主机/proc只读访问(无需特权容器)
1. 定义自定义SecurityContextConstraints
创建host-proc-scc.yaml文件,配置仅允许挂载主机/proc且只读,同时最小化容器权限:
apiVersion: security.openshift.io/v1 kind: SecurityContextConstraints metadata: name: host-proc-access allowHostPaths: - pathPrefix: "/proc" readOnly: true allowPrivilegeEscalation: false allowedCapabilities: [] defaultAddCapabilities: [] fsGroup: type: RunAsAny priority: 10 readOnlyRootFilesystem: false requiredDropCapabilities: - ALL runAsUser: type: RunAsAny seLinuxContext: type: MustRunAs supplementalGroups: type: RunAsAny users: [] volumes: - configMap - downwardAPI - emptyDir - hostPath - secret
应用该配置:
oc apply -f host-proc-scc.yaml
2. 配置服务账户并绑定SCC
在DaemonSet所在命名空间创建专用服务账户,将自定义SCC授权给它:
# 替换my-namespace为你的实际命名空间 oc create sa host-proc-sa -n my-namespace oc adm policy add-scc-to-user host-proc-access -z host-proc-sa -n my-namespace
3. 调整DaemonSet配置
修改DaemonSet的YAML,指定服务账户,添加主机/proc挂载,同时关闭特权模式:
apiVersion: apps/v1 kind: DaemonSet metadata: name: my-daemonset namespace: my-namespace spec: selector: matchLabels: app: my-daemon template: metadata: labels: app: my-daemon spec: serviceAccountName: host-proc-sa containers: - name: my-container image: your-image:tag volumeMounts: - name: host-proc mountPath: /host/proc readOnly: true securityContext: privileged: false allowPrivilegeEscalation: false volumes: - name: host-proc hostPath: path: /proc type: Directory
应用DaemonSet配置:
oc apply -f your-daemonset.yaml
4. 验证权限与访问
进入容器检查主机/proc的访问情况,同时确认容器未处于特权模式:
# 替换pod-name为实际Pod名称 oc exec -n my-namespace <pod-name> -- ls /host/proc # 查看容器运行用户与权限状态 oc exec -n my-namespace <pod-name> -- id
安全优化建议
- 若不需要容器以root用户运行,可将SCC中
runAsUser.type改为MustRunAsNonRoot,并确保镜像支持非root运行 - 严格控制SCC的授权范围,仅将其绑定到需要访问主机/proc的服务账户
- 保持主机
/proc挂载为只读,杜绝容器修改主机系统参数的可能
内容的提问来源于stack exchange,提问作者Kavin Kumar
相关产品推荐
相关产品推荐

