본문 바로가기

kubernetes

[kubernetes] Authorization, cluster role

authorization, 말그대로 권한이나 허가이다.

 

서버에 여러 component가 있고, 여러 user가 존재한다. 그런데 관리자가 아닌 일반 사용자가 node를 삭제하는등 component를 마음대로 조작해버리면 문제가 발생할 수 있다.

 

따라서 user에 따라 kubernetes 접근에 제한적 기능은 주고싶을 때 kuberenets는 권한을 부여할 수 있는 기능을 제공한다.

 


4가지 Authorization이 있다.

 

1. Node

 

2. ABAC(Attribute-Based Access Control)

 

3. RBAC(Rule-Based Access Control)

 

4. webhook

 

간단하게 뭔지 살펴보고, 제일 자주 사용한다는 3번을 좀 더 살펴보자.

 

1. Node

 

지난번에 kubelet에 cert를 발급할 때 node를 special group으로 묶는다고 했다. 노드는 시스템의 특권을 부여하여 kubelet이 api operation (read, write)를 할 수 있는 권한이다.

 

2.ABAC

 

json format으로, user or group에 permission attribute를 설정한다.

--> 개별 유저 or group마다 권한을 설정해주어야 하므로 관리하기가 까다롭다.

--> 새로운 유저가 들어와 수정하게 되면, kube-api를 재시작해야 한다. (정보를 update 해야한다..)

 

example) 

{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user": "alice", "namespace": "*", "resource": "*", "apiGroup": "*"}}

 

3. RBAC

 

ABAC와 다르게 rule을 먼저 만들어두고, user나 group을 mapping하는 방법이다.

--> rule 수정이 필요한 경우 kube-api를 재시작하지않고 reflect만 해주면 된다.

 

example)

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

 

4. webhook

 

http 콜백으로, 어떤 event가 발생할 때 http post가 발생한다.(간단한 notification) 주로 써드파티 모듈을 함께 사용한다. 

 

 

flags for authorization module

 

  • --authorization-mode=ABAC Attribute-Based Access Control (ABAC) mode allows you to configure policies using local files.
  • --authorization-mode=RBAC Role-based access control (RBAC) mode allows you to create and store policies using the Kubernetes API.
  • --authorization-mode=Webhook WebHook is an HTTP callback mode that allows you to manage authorization using a remote REST endpoint.
  • --authorization-mode=Node Node authorization is a special-purpose authorization mode that specifically authorizes API requests made by kubelets.
  • --authorization-mode=AlwaysDeny This flag blocks all requests. Use this flag only for testing.
  • --authorization-mode=AlwaysAllow This flag allows all requests. Use this flag only if you do not require authorization for your API requests.

 

** kube-api configuration에서 flag를 확인할 수 있다. 이 때 --authorization-mode=Node,RBAC,webhook 과 같이 multiple mode를 지원한다.

=> 명시된 순서대로 request handle

(Node request - deny 시, RBAC request - allow 시, webhook 무시)


제일 자주사용하는 RBAC를 좀 더 살펴보자

 

다시 RBAC를 살펴보면. rule을 먼저 만들어두고, user를 mapping하는 방법이다. 총 2개의 yaml 파일을 만들어보자.

 

1. role

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

위에서 보았던 role이다. rules에 array value로 접근하고자하는 resource와 허용하는 kubelet command를 사용하게 된다. 예시에서는 role은 pods의 get, watch, list 정도만 가능한 "pod-reader"라는 role이다.

 

** role은 항상 특정한 namespace을 명시하게 된다. (특정 namespace에 대한 rule을 설정해 주는 것)

 

2. rolebinding

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
	name: devuser-deveplopers-binding
subjects:
    - kind: User
      name: dev-user
      apiGroup: rbac.authorization.k8s.io
roleRef:
    kind: Role
    name: pod-reader
    apiGroup: rbac.authorization.k8s.io

이 pod-reader라는 role을 dev-user와 mapping, 즉 binding 해주는 rolebinding yaml 파일이다.

 

해당 yaml을 apply하여 default namespace에 특정 user(dev-user)에게 pod-reader role을 부여하게 된다.

 

** rolebinding은 같은 namespace의 role을 참조할 수 있다.

 

 

이 때 권한이 잘 부여되었는지 확인할 때에는

 

>> kubectl auth can-i get pods
yes

>> kubectl auth can-i create pods
no

이런식으로 kubectl의 auth can-i command를 이용해서 권한을 확인할 수 있다.

 

 

*** resource, verb 뿐만 아니라. rules의 resourcenames attribute로 특정 component에만 권한을 부여할 수 있다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
  resourceNames: ["podA", "podB"]

 

clusterrole을 살펴보자. 언뜻 role과 비슷해보이지만, clusterrole은 namespace가 없이, cluster-wide하게 작동하는 role이다. 언제사용하냐..?

  1. define permissions on namespaced resources and be granted within individual namespace(s)
  2. define permissions on namespaced resources and be granted across all namespaces
  3. define permissions on cluster-scoped resources

공식 홈페이지에서도 cluster-wide 하게 define할 떄 사용하라고 한다. 예시를 한 번 보자.

 

1. clusterroles

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  # "namespace" omitted since ClusterRoles are not namespaced
  name: secret-reader
rules:
- apiGroups: [""]
  #
  # at the HTTP level, the name of the resource for accessing Secret
  # objects is "secrets"
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

특정 namespace에 상관없이, cluster 단위에서 secrets resource의 get, watch list를 허가해주는 role이다.

 

2. clusterbinding

apiVersion: rbac.authorization.k8s.io/v1
# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
kind: ClusterRoleBinding
metadata:
  name: read-secrets-global
subjects:
- kind: Group
  name: manager # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: secret-reader
  apiGroup: rbac.authorization.k8s.io

위의 role을 cluster 단위에서 binding 시켜주는 clusterrolebinding이다. 아까 rolebinding과는 달리 모든 namespace에서 manager라는 user는 secret-reader role을 수행할 수 있다.

 

 

**출처

kubernetes 공식 authorization overview: kubernetes.io/docs/reference/access-authn-authz/authorization/

 

1. node authorization: kubernetes.io/docs/reference/access-authn-authz/node/

2. ABAC: kubernetes.io/docs/reference/access-authn-authz/abac/

3. RBAC: kubernetes.io/docs/reference/access-authn-authz/rbac/

4. webhook: kubernetes.io/docs/reference/access-authn-authz/webhook/

 

 

'kubernetes' 카테고리의 다른 글

[Kubernetes] kubeconfig  (0) 2021.02.18
TLS basic  (0) 2021.02.16