Linkerd 控制平面带有自己的最低特权 Pod Security Policy 和相关的 RBAC 资源。仅当启用 PodSecurityPolicy
admission controller 时,才会强制执行此 Pod 安全策略。
要查看控制平面的 Pod 安全策略的定义,请运行:
kubectl describe psp -l linkerd.io/control-plane-ns=linkerd
调整上述标签的值以匹配您的控制平面的命名空间。
请注意,为了最小化攻击面,除了 NET_ADMIN
和 NET_RAW
功能外, 所有 Linux 功能都从控制平面的 Pod 安全策略中删除。这些功能为 proxy-init
init 容器提供了运行时特权 来重写 pod 的 iptable
。请注意,将这些功能添加到 Pod 安全策略不会使容器成为特权容器。控制平面的 Pod 安全策略使用 allowPrivilegeEscalation: false
策略防止容器 privileged
。要了解 NET_ADMIN
和 NET_RAW
功能的完整含义,请参阅 Linux 功能 manual。
如果您的环境不允许运行具有升级 Linux 功能的容器, 则可以使用不需要 NET_ADMIN
和 NET_RAW
功能 的 CNI plugin 安装 Linkerd。
Linkerd 没有为数据平面提供任何默认的 Pod 安全策略, 因为这些策略会根据您的应用程序的安全要求而有所不同。Linkerd 代理 sidecar 容器的安全上下文要求与 控制平面的 Pod 安全策略中定义的要求非常相似。
例如,以下 Pod 安全策略和 RBAC 将与注入的 emojivoto
demo 应用程序一起使用:
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: linkerd-emojivoto-data-plane spec: allowPrivilegeEscalation: false fsGroup: ranges: - max: 65535 min: 10001 rule: MustRunAs readOnlyRootFilesystem: true allowedCapabilities: - NET_ADMIN - NET_RAW - NET_BIND_SERVICE requiredDropCapabilities: - ALL runAsUser: rule: RunAsAny seLinux: rule: RunAsAny supplementalGroups: ranges: - max: 65535 min: 10001 rule: MustRunAs volumes: - configMap - emptyDir - projected - secret - downwardAPI - persistentVolumeClaim --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: emojivoto-psp namespace: emojivoto rules: - apiGroups: ['policy','extensions'] resources: ['podsecuritypolicies'] verbs: ['use'] resourceNames: ['linkerd-emojivoto-data-plane'] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: emojivoto-psp namespace: emojivoto roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: emojivoto-psp subjects: - kind: ServiceAccount name: default namespace: emojivoto - kind: ServiceAccount name: emoji namespace: emojivoto - kind: ServiceAccount name: voting namespace: emojivoto - kind: ServiceAccount name: web namespace: emojivoto
请注意,Linkerd 代理在没有 Linkerd CNI 的情况下运行时 只需要 NET_ADMIN
和 NET_RAW
功能,并且它使用 UID 2102
运行。