Kubernetes RBAC 角色允许仅从 Cron 作业创建作业
Kuberentes RBAC rule to allow creating Jobs only from a CronJob
是否可以创建一个 kubernetes RBAC 规则,允许从现有的 CronJob 创建作业,但阻止以任何其他方式创建作业?
我们希望紧紧锁定我们的集群,以避免不受 CICD 管理的任意部署 - 但我们还需要促进 CronJobs 的手动测试,或重新运行取消计划外的失败作业。我希望开发人员能够 运行 像这样的命令:
kubectl create job --from=cronjob/my-job my-job-test-run-1
但不能运行类似的东西:
kubectl create job my-evil-job -f evil-job.yaml
这可能吗?
在这种情况下为了成功执行这条命令:
kubectl create job --from=cronjob/<cronjob_name>
User/ServiceAccount 应该有适当的 RBAC 规则(下面提供的输出中至少有两个,创建 Jobs
并获得 CronJobs
.
在第一个示例中,我授予了创建 Jobs
和获取 CronJobs
的权限,并且我能够创建 Job
和 Job --from CronJob
user@minikube:~$ cat test_role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: job
rules:
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create"]
- apiGroups: ["batch"]
resources: ["cronjobs"]
verbs: ["get"]
user@minikube:~$ kubectl create job --image=inginx testjob20
job.batch/testjob20 created
user@minikube:~$ kubectl create job --from=cronjobs/hello testjob21
job.batch/testjob21 created
但是如果我只授予访问权限以创建 Job
而没有获取 CronJob
,我可以创建 Job
但不能创建 Job --from CronJob
user@minikube:~$ cat test_role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: job
rules:
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create"]
user@minikube:~$ kubectl create job --image=nginx testjob3
job.batch/testjob3 created
user@minikube:~$ kubectl create job --from=cronjobs/hello testjob4
Error from server (Forbidden): cronjobs.batch "hello" is forbidden: User "system:serviceaccount:default:t1" cannot get resource "cronjobs" in API group "batch" in the namespace "default"
当我删除创建 Jobs
的权限时,我无法创建 Job
以及 Job --from CronJob
user@minikube:~$ cat test_role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: job
rules:
- apiGroups: ["batch"]
resources: ["cronjobs"]
verbs: ["get"]
user@minikube:~$ kubectl create job --image=inginx testjob10
error: failed to create job: jobs.batch is forbidden: User "system:serviceaccount:default:t1" cannot create resource "jobs" in API group "batch" in the namespace "default"
user@minikube:~$ kubectl create job --from=cronjobs/hello testjob11
error: failed to create job: jobs.batch is forbidden: User "system:serviceaccount:default:t1" cannot create resource "jobs" in API group "batch" in the namespace "default"
如您所见,如果 User/ServiceAccount 在这种情况下没有两种权限,则无法创建(Job
或 Job --from CronJob
),因此无法仅使用创建此类限制RABC 规则。
一个可能的解决方案是将此权限拆分为两个不同的 User/ServiceAccount 用于两个不同的任务(第一个用户可以创建 Jobs
+ 获取 CronJobs
,第二个用户没有权限创建 Jobs
).
另一种可能性是尝试将 k8s admission Controller 与 f.e 一起使用。 Open Policy agent
是否可以创建一个 kubernetes RBAC 规则,允许从现有的 CronJob 创建作业,但阻止以任何其他方式创建作业?
我们希望紧紧锁定我们的集群,以避免不受 CICD 管理的任意部署 - 但我们还需要促进 CronJobs 的手动测试,或重新运行取消计划外的失败作业。我希望开发人员能够 运行 像这样的命令:
kubectl create job --from=cronjob/my-job my-job-test-run-1
但不能运行类似的东西:
kubectl create job my-evil-job -f evil-job.yaml
这可能吗?
在这种情况下为了成功执行这条命令:
kubectl create job --from=cronjob/<cronjob_name>
User/ServiceAccount 应该有适当的 RBAC 规则(下面提供的输出中至少有两个,创建 Jobs
并获得 CronJobs
.
在第一个示例中,我授予了创建 Jobs
和获取 CronJobs
的权限,并且我能够创建 Job
和 Job --from CronJob
user@minikube:~$ cat test_role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: job
rules:
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create"]
- apiGroups: ["batch"]
resources: ["cronjobs"]
verbs: ["get"]
user@minikube:~$ kubectl create job --image=inginx testjob20
job.batch/testjob20 created
user@minikube:~$ kubectl create job --from=cronjobs/hello testjob21
job.batch/testjob21 created
但是如果我只授予访问权限以创建 Job
而没有获取 CronJob
,我可以创建 Job
但不能创建 Job --from CronJob
user@minikube:~$ cat test_role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: job
rules:
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create"]
user@minikube:~$ kubectl create job --image=nginx testjob3
job.batch/testjob3 created
user@minikube:~$ kubectl create job --from=cronjobs/hello testjob4
Error from server (Forbidden): cronjobs.batch "hello" is forbidden: User "system:serviceaccount:default:t1" cannot get resource "cronjobs" in API group "batch" in the namespace "default"
当我删除创建 Jobs
的权限时,我无法创建 Job
以及 Job --from CronJob
user@minikube:~$ cat test_role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: job
rules:
- apiGroups: ["batch"]
resources: ["cronjobs"]
verbs: ["get"]
user@minikube:~$ kubectl create job --image=inginx testjob10
error: failed to create job: jobs.batch is forbidden: User "system:serviceaccount:default:t1" cannot create resource "jobs" in API group "batch" in the namespace "default"
user@minikube:~$ kubectl create job --from=cronjobs/hello testjob11
error: failed to create job: jobs.batch is forbidden: User "system:serviceaccount:default:t1" cannot create resource "jobs" in API group "batch" in the namespace "default"
如您所见,如果 User/ServiceAccount 在这种情况下没有两种权限,则无法创建(Job
或 Job --from CronJob
),因此无法仅使用创建此类限制RABC 规则。
一个可能的解决方案是将此权限拆分为两个不同的 User/ServiceAccount 用于两个不同的任务(第一个用户可以创建 Jobs
+ 获取 CronJobs
,第二个用户没有权限创建 Jobs
).
另一种可能性是尝试将 k8s admission Controller 与 f.e 一起使用。 Open Policy agent