전공영역 공부 기록

쿠버네티스에서 권한이 제한된 개발자 계정 발급 3편

악분 2021. 8. 4. 07:07
반응형

이 챕터는 권한이 제한된 쿠버네티스 계정(serviceaccount)을 생성하는 방법을 다룹니다.

 

이전 챕터

1편: https://malwareanalysis.tistory.com/133

2편: https://malwareanalysis.tistory.com/135

3편: https://malwareanalysis.tistory.com/136

 

 

3편에서 다루는 내용

2편에서 만든 context를 사용하는 방법과 serviceaccount에 권한을 제한하는 방법을 설명합니다.

 

 

context 전환

context전환은 kubectl config use context로 쉽게 할 수 있습니다. context이름만 설정하면 되는데요!. context이름은 current-context로 확인해야 합니다.

 

 

kubectl config get-contexts

그림1 context 목록 확인

 

 

kubectl config use-context dev

그림2 context 전환

 

pod생성 시도

context를 전환하면 context에 해당하는 계정 권한을 갖습니다. 2편에서 생성한 developer 계정은 현재 어떠한 권한도 설정하지 않았습니다. 그러므로 모든 요청이 쿠버네티스 API서버에서 거부합니다. 

 

예를 들어 pod를 test namespace에서 생성을 시도하면 permission denied 오류 메세지를 볼 수 있습니다. developer계정에 권한 설정이 안되어 있기 때문입니다.

그림3 pod생성 요청 거절

 

권한 설정

쿠버네티스에서는 RBAC방법으로 계정에 권한을 설정하는 방법이 있습니다. 권한은 role이라는 쿠버네티스 리소스로 관리됩니다.

 

이번 예제에서는 pod생성, 삭제 권한만 developer계정에 설정하겠습니다.

그림4 role설정 예

 

role설정 하는 방법은 쿠버네티스 공식문서에 자세히 설명되어 있습니다.

쿠버네티스 role설정 공식문서: https://kubernetes.io/docs/reference/access-authn-authz/rbac/
  • apigroup: 쿠버네티스 리소스가 속해 있는 api group이름
  • resources: 권한 설정할 쿠버네티스 리소스
  • verbs: 권한

 

아래 예제는 test namespace에 role을 생성하는 예입니다. pod생성과 삭제 권한을 설정했습니다.

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

그림5 pod생성,삭제 권한이 있는 role

 

api group은 resources가 속한 그룹 이름입니다. 아래 명령어로 확인할 수 있습니다.

kubectl api-resources

 

api-group은 리소스마다 다릅니다. 예를 들어서 deployment는 apps그룹에 속합니다. 하지만 pod는 그룹이름이 없습니다. 

그림6 api-group이름 검색

 

권한 부여

생성한 role을 serviceaccount에 설정을 수동으로 해줘야 합니다. rolebinding을 사용해서 권한을 부여하겠습니다. 

 

kubectl --dry-run을 이용해서 rolebinding yaml파일을 생성한 후, yaml파일을 쿠버네티스에 적용하겠습니다. 아래 명령어는 test namespace에 있는 developer serviceaccount에 dev라는 role을 설정하는 예입니다.

kubectl create rolebinding --serviceaccount=test:developer --role=dev --dry-run=client -o yaml > rolebinding.yaml

 

리다이렉트를 빼면 명령어가 생성한 yaml파일을 볼 수 있습니다.

그림7 rolebinding 생성

 

kubectl create명령어로 방금 생성한 rolebinding을 실행합니다.

 kubectl create -f rolebinding.yaml

 

 

pod 생성 테스트

이제 serviecaccount에 rolebinding이 적용되었습니다. 그러므로 [그림 3]에서 실패했던 pod생성이 이제 성공합니다.

kubectl config use-context dev
kubectl run --image=nginx nginx-test

그림8 pod생성 성공

 

pod삭제 권한도 있으므로 삭제도 잘 됩니다.

kubectl delete po nginx-test

반응형