我试图限制所有pod在特权模式下运行,除了少数几个。
因此我创建了两个Pod安全策略:一个允许运行特权容器,另一个用于限制特权容器。
[root@master01 vagrant]# kubectl get psp
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES
privileged true RunAsAny RunAsAny RunAsAny RunAsAny false *
restricted false RunAsAny RunAsAny RunAsAny RunAsAny false *已创建可使用pod安全策略“受限”的集群角色,并将该角色绑定到集群中的所有serviceaccount
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: psp-restricted
rules:
- apiGroups: ['policy']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames:
- restricted
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: psp-restricted
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: psp-restricted
subjects:
- kind: Group
name: system:serviceaccounts
apiGroup: rbac.authorization.k8s.io现在我使用“特权”模式部署一个pod。但它正在被部署。创建的pod注释指示在pod创建期间验证了psp "privileged“。为什么会这样呢?受限制的PSP应该经过验证,对吗?
apiVersion: v1
kind: Pod
metadata:
name: psp-test-pod
namespace: default
spec:
serviceAccountName: default
containers:
- name: pause
image: k8s.gcr.io/pause
securityContext:
privileged: true[root@master01 vagrant]# kubectl create -f pod.yaml
pod/psp-test-pod created[root@master01 vagrant]# kubectl get pod psp-test-pod -o yaml |grep kubernetes.io/psp
kubernetes.io/psp: privilegedKubernetes版本: v1.14.5
我是不是漏掉了什么?任何帮助都是非常感谢的。
发布于 2019-09-25 15:45:45
发布我自己问题的答案。希望它能帮助到某些人
我的所有PodSecurityPolicy配置都正确。问题是,我试图自己部署一个pod,而不是通过任何控制器管理器,如Deployment/Replicaset/Daemonset等。大多数Kubernetes pods不是用户直接创建的。相反,它们通常是通过控制器管理器间接创建为部署、ReplicaSet或其他模板化控制器的一部分。
在pod自己部署的情况下,pod是由kubectl创建的,而不是由控制器管理器创建的。
在Kubernetes中,有一个名为"cluster-admin“的超级用户角色。在我的例子中,kubectl以超级用户角色"cluster-admin“运行。此"cluster-admin“角色有权访问所有pod安全策略。因为,要将pod安全策略与角色相关联,我们需要使用“use”动词,并在“apiGroups”中将“resources”设置为“podsecuritypolicy”。
在cluster-admin角色中,'resources‘*包括'podsecuritypolicies’和'verbs‘*包括'use’。因此,所有策略也将在cluster-admin角色上强制执行。
[root@master01 vagrant]# kubectl get clusterrole cluster-admin -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: cluster-admin
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'
- nonResourceURLs:
- '*'
verbs:
- '*'pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: psp-test-pod
namespace: default
spec:
serviceAccountName: default
containers:
- name: pause
image: k8s.gcr.io/pause
securityContext:
privileged: true我使用命令kubectl create -f pod.yaml部署了上面的集群,因为我已经创建了两个pod安全策略,一个用于限制,一个用于特权,pod.yaml -admin角色可以访问这两个策略。因此,上面的pod可以使用kubectl正常启动,因为cluster-admin角色可以访问特权策略( privileged: false也可以,因为admin角色也可以访问限制策略)。仅当pod由kubectl而不是kube控制管理器直接创建,或者pod具有通过serviceaccount访问"cluster-admin“角色的权限时,才会出现这种情况
在部署/复制集etc..first kubectl创建的pod将控制权传递给控制器管理器的情况下,控制器将在验证权限(服务帐户、pod安全策略)后尝试部署pod
在下面的部署文件中,pod尝试以特权模式运行。在我的例子中,这个部署将会失败,因为我已经将“受限”策略设置为集群中所有serviceaccount的默认策略。因此,任何pod都不能以特权模式运行。如果pod需要在特权模式下运行,允许该pod的serviceaccount使用特权策略
apiVersion: apps/v1
kind: Deployment
metadata:
name: pause-deploy-privileged
namespace: kube-system
labels:
app: pause
spec:
replicas: 1
selector:
matchLabels:
app: pause
template:
metadata:
labels:
app: pause
spec:
serviceAccountName: default
containers:
- name: pause
image: k8s.gcr.io/pause
securityContext:
privileged: truehttps://stackoverflow.com/questions/58063224
复制相似问题