我正在尝试部署受限制的psp,它将禁止在pod中使用root用户:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: unprivilegedpolicy
spec:
privileged: false
allowPrivilegeEscalation: false
requiredDropCapabilities:
- ALL
volumes:
- 'configMap'
- 'emptyDir'
- 'projected'
- 'secret'
- 'downwardAPI'
- 'persistentVolumeClaim'
hostNetwork: false
hostIPC: false
hostPID: false
runAsUser:
rule: 'MustRunAsNonRoot'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
fsGroup:
rule: 'MustRunAs'
ranges:
- min: 1
max: 65535
readOnlyRootFilesystem: false
我已将此psp添加到ClusterRole并将其绑定到名称空间hello-world
:
Name: UnPrivilegedClusterRole
Labels: <none>
Annotations: <none>
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
podsecuritypolicies.policy [] [unprivilegedpolicy] [use]
[root@master01 ~]# kubectl describe clusterrolebindings.rbac.authorization.k8s.io HelloWorldRoleBinding
Name: HelloWorldRoleBinding
Labels: <none>
Annotations: <none>
Role:
Kind: ClusterRole
Name: UnPrivilegedClusterRole
Subjects:
Kind Name Namespace
---- ---- ---------
Group system:serviceaccounts hello-world
但是,如果我尝试使用kubectl run --name=nginx hello-world
运行ngnix容器,则该容器将以root用户身份成功运行。通过ServiceAccount部署该部署。
已启用PodSecurityPolicy准入控制器。
有人对此有解决方案吗?
答案 0 :(得分:0)
首先:
$ kubectl run --name=nginx hello-world
您未指定窗格的图像名称。正确的语法应为:
$ kubectl run --image=nginx NAME_OF_DEPLOYMENT
如上所述,命令将尝试创建部署。
您遇到的问题很可能与有关:
在具有Pod安全策略开启的新创建的Kubernetes集群上,无论您具有什么特权,都应该不能生成任何Pod。
Pod安全策略控制作为可选的(但建议使用)admission controller实现。 enabling the admission controller强制执行PodSecurityPolicies,但是在未授权任何策略的情况下执行会阻止在集群中创建任何Pod 。
准入控制器以及Pod安全策略和RBAC与正在使用的解决方案紧密相关。您应参考针对您案例的文档。
例如:
PSP
的新创建的GKE群集不会创建Pod。它将显示一条消息:Unable to validate against any pod security policy: []
警告::如果在未先定义和授权任何实际策略的情况下启用PodSecurityPolicy控制器,则没有用户,控制器或服务帐户可以创建或更新Pod。如果您使用的是现有群集,则应在启用控制器后的 之前define和authorize策略。
kubespray
的Kubernetes集群(在Provisioning上运行并在Ubuntu上运行时,pod安全策略变量设置为true)将创建一个限制性PSP
,并且它将具有一个MustRunAsNonRoot
参数在PSP
中。 NGINX
窗格还有另一个问题。 NGINX
图片将尝试以root
用户的身份在广告连播中运行。 PSP
的访问控制器配置为:
runAsUser:
rule: MustRunAsNonRoot
会根据Error: container has runAsNonRoot and image will run as root
拒绝消息PSP
。
要使用此策略运行NGINX
吊舱,您需要:
PSP
(将以root用户身份在pod中运行): runAsUser:
rule: RunAsAny
NGINX
映像,其配置方式允许以非root用户身份运行NGINX
。 以下此类广告连播的示例:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: non-root-nginx
name: non-root-nginx
spec:
securityContext:
runAsUser: 101
fsGroup: 101
containers:
- image: nginx
name: non-root-nginx
volumeMounts:
- mountPath: /var/cache/nginx
name: edir
- mountPath: /var/run
name: varun
- mountPath: /etc/nginx/conf.d/default.conf
name: default-conf
subPath: default.conf
dnsPolicy: ClusterFirst
restartPolicy: Never
volumes:
- name: edir
emptyDir: {}
- name: varun
emptyDir: {}
- name: default-conf
configMap:
name: nginx8080
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx8080
namespace: default
data:
default.conf: |+
server {
listen 8080;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}