[따배쿠/멤버십] 13-1. 인증과 권한 관리 - 인증편
인증과 권한 관리에는
- API 접근제어
- 인증(user, ServiceAccount)
- 권한관리(Role/RoleBindong, ClusterRole/ClusterRoleBinding)
가 있다.
먼저 쿠버네티스의 API 접근제어부터 알아보자
api 요청에는 User/Group과 Service Account가 필요하다.
쿠버네티스 admin User(인증서를 가지고 있음)가 kubectl get nodes 등의 명령을 요청한다.
그럼 api는 User가 가지고 있는 인증서와 Service Account의 토큰을 보고 Authentication 한다.
인증을 받았다면 그 권한이 어디까지인지 확인해야 한다. 이를 Authorization 이라하고
요청이 적절한지 Admission Control 한다.
Human User는 클러스터 외부에서 쿠버네티스를 조작하는 사용자이고 그 묶음들을 그룹으로 관리할 수 있다.
Ingress 컨트롤러 파드는 다른 파드들과는 다르게 ingress 컨트롤러 자체가 시스템에서 동작중인 서비스들에 접근할 수 있다. 이는 외부에서 들어오는 접속을 동작중인 서비스와 연결시키기 위함이다. 이러한 파드를 실행할때는 serviceaccount를 만들어주고 그 serviceaccount에 특별한 권한(서비스 목록보기, 서비스 실행시키기, 서비스 삭제하기 등)을 할당해준다.
즉 serviceaccount는 파드가 쿠버네티스 api를 다룰 때 사용하는 계정이다.
kubernetes-admin 유저는 쿠버네티스의 전체 api를 컨트롤할 수 있는 마치 루트와 같은 유저이다.
admin은 너무 막강한 권한을 가졌기에 아무나 사용하지 못하도록 다른 사용자들은 제한된 권한을 할당받은 user를
이용해야 한다.
현재 디폴트 네임스페이스에서 사용중인 유저는 kubectl config view로 볼 수 있고 kubernetes-admin user의 인증서는
cat ~/.kube/config 로 볼 수 있다.
새 normal user 생성은 방법은 다음과 같다.
https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#normal-user
openssl genrsa -out myuser.key 2048로 프라이빗 키를 만들고
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser"로 인증서 요청파일을 만든다.
vi csr-myuser.yaml 로 yaml파일을 작성한다.
내용은 아래와 같다.
request에는 인증서 내용을 입력해야 한다.
인증서 정보를 보려면 cat myuser.csr | base64 | tr -d "\n"로 인코딩하면 된다.
이 내용을 csr-myuser.yaml의 request에 붙여넣는다.
이제 kubectl apply -f csr-myuser.yaml로 쿠버네티스에 우리가 만든 인증서를 등록해보자
그럼 우리가 만든 csr이 아직 pending 상태이다.
따라서 kubectl certificate approve myuser 으로 csr 승인 요청을 한다.
kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt 으로 인증서를 저장한다.
파드가 실행될 때 특정한 serviceaccount를 지정하지 않으면 namespace에 default라는 serviceaccount가 할당된다.
kubectl get serviceaccounts로 serviceaccount 정보를 보자
그럼 default라는 serviceaccount가 진짜 있는걸 볼 수 있다.
kubectl run testpod --image=nginx로 nginx 파드를 실행시키고
kubectl get pods testpod -o yaml로 확인해보면 serviceaccount가 default이다.
이제 kubectl create serviceaccount pod-viewer 로 pod-viewer 라는 serviceaccount를 생성해보자
kubectl get pods testpod -o yaml > testpod.yaml로 testpod의 내용을 testpod.yaml파일에 저장한다.
그리고 kubectl delete pod testpod로 파드를 종료시킨다.
vi testpod.yaml로 불필요한 내용은 지우고 아래와 같이 수정한다.
kubectl create -f testpod.yaml 로 testpod를 실행시키고
다시 kubectl get pods -o yaml 로 보면 serviceaccount가 pod-viewer 인걸 확인할 수 있다.