Kubernetes:我的 PodSecurityPolicy 不工作或配置错误
Kubernetes: My PodSecurityPolicy is not working or misconfigured
我正在尝试限制所有 pods 除了来自 运行 特权模式的少数人。
所以我创建了两个 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 安全策略的集群角色 "restricted" 并将该角色绑定到集群中的所有服务帐户
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
现在我用 "privileged" 模式部署一个 pod。但它正在部署。创建的 pod 注释指示 psp "privileged" 在 pod 创建期间已验证。这是为什么 ?受限制的 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: privileged
Kubernetes 版本:v1.14.5
我在这里遗漏了什么吗?感谢任何帮助。
张贴我自己的问题的答案。希望它能帮助某人
我所有的 PodSecurityPolicy 配置都是正确的。问题是,我试图自己部署一个 pod,而不是通过 Deployment/Replicaset/Daemonset 等任何控制器管理器。
大多数 Kubernetes pods 不是由用户直接创建的。相反,它们通常是通过控制器管理器作为 Deployment、ReplicaSet 或其他模板化控制器的一部分间接创建的。
对于自己部署的pod,pod是由kubectl创建的,不是controller manager创建的。
在 Kubernetes 中有一个名为 "cluster-admin" 的超级用户角色。在我的例子中,kubectl 是 运行 超级用户角色 "cluster-admin"。这个 "cluster-admin" 角色可以访问所有 pod 安全策略。因为,要将 pod 安全策略关联到角色,我们需要使用 'use' 动词并在 'apiGroups'
中将 'resources' 设置为 'podsecuritypolicy'
在集群管理员角色中 '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.yaml
由于我已经创建了两个 pod 安全策略,一个用于限制,一个用于权限,因此 cluster-admin 角色可以访问这两个策略。因此,上面的 pod 将使用 kubectl 正常启动,因为 cluster-admin 角色可以访问特权策略(privileged: false 也可以,因为 admin 角色也可以访问限制策略)。只有当 pod 由 kubectl 而不是 kube control managers 直接创建或者 pod 可以通过 serviceaccount
访问 "cluster-admin" 角色时才会发生这种情况
对于由Deployment/Replicaset等创建的pod..首先kubectl将控制权传递给controller manager,然后controller会在验证权限后尝试部署pod(serviceaccount, pods安全政策)
在下面的部署文件中,pod 正在尝试 运行 使用特权模式。在我的例子中,此部署将失败,因为我已经将 "restricted" 策略设置为集群中所有服务帐户的默认策略。因此,没有 pod 能够 运行 使用特权模式。如果 pod 需要 运行 特权模式,允许该 pod 的服务帐户使用 "privileged" 策略
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: true
我正在尝试限制所有 pods 除了来自 运行 特权模式的少数人。
所以我创建了两个 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 安全策略的集群角色 "restricted" 并将该角色绑定到集群中的所有服务帐户
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
现在我用 "privileged" 模式部署一个 pod。但它正在部署。创建的 pod 注释指示 psp "privileged" 在 pod 创建期间已验证。这是为什么 ?受限制的 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: privileged
Kubernetes 版本:v1.14.5
我在这里遗漏了什么吗?感谢任何帮助。
张贴我自己的问题的答案。希望它能帮助某人
我所有的 PodSecurityPolicy 配置都是正确的。问题是,我试图自己部署一个 pod,而不是通过 Deployment/Replicaset/Daemonset 等任何控制器管理器。 大多数 Kubernetes pods 不是由用户直接创建的。相反,它们通常是通过控制器管理器作为 Deployment、ReplicaSet 或其他模板化控制器的一部分间接创建的。
对于自己部署的pod,pod是由kubectl创建的,不是controller manager创建的。
在 Kubernetes 中有一个名为 "cluster-admin" 的超级用户角色。在我的例子中,kubectl 是 运行 超级用户角色 "cluster-admin"。这个 "cluster-admin" 角色可以访问所有 pod 安全策略。因为,要将 pod 安全策略关联到角色,我们需要使用 'use' 动词并在 'apiGroups'
中将 'resources' 设置为 'podsecuritypolicy'在集群管理员角色中 '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.yaml
由于我已经创建了两个 pod 安全策略,一个用于限制,一个用于权限,因此 cluster-admin 角色可以访问这两个策略。因此,上面的 pod 将使用 kubectl 正常启动,因为 cluster-admin 角色可以访问特权策略(privileged: false 也可以,因为 admin 角色也可以访问限制策略)。只有当 pod 由 kubectl 而不是 kube control managers 直接创建或者 pod 可以通过 serviceaccount
对于由Deployment/Replicaset等创建的pod..首先kubectl将控制权传递给controller manager,然后controller会在验证权限后尝试部署pod(serviceaccount, pods安全政策)
在下面的部署文件中,pod 正在尝试 运行 使用特权模式。在我的例子中,此部署将失败,因为我已经将 "restricted" 策略设置为集群中所有服务帐户的默认策略。因此,没有 pod 能够 运行 使用特权模式。如果 pod 需要 运行 特权模式,允许该 pod 的服务帐户使用 "privileged" 策略
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: true