DevOps/Kubernetes

[ 쿠버네티스 입문: 90가지 예제로 배우는 컨테이너 관리 자동화 표준 ] Chapter13. 인증과 권한 관리

noahkim_ 2021. 7. 21. 23:14

13.1 인증

 

사용자가 쿠버네티스의 API에 접근하려면 인증이 필요함.

외부에서 접속시 TLS 인증이 적용되어있음.

접속하려면 kube-apiserver에 있는 인증서와 클라이언트에 있는 인증서 사이의 검증을 통과해야함.

-> 인증되지 않은 클라이언트가 kube-apiserver에 접속하지 못하게 하려는 것

 

쿠버네티스는 접속시에 사용자 계정과 서비스 계정으로 인증을 요청함.

 

사용자 계정은 별도의 외부 인증 시스템에 있는 사용자 정보를 연결해 사용함

서비스 계정은 쿠버네티스가 직접 관리하는 사용자 계정이며 시크릿이 할당되어있어 비밀번호 역할을 함

 

  1. kubectl의 config 파일에 있는 TLS 인증 정보 구조 확인하기

Kube-apiserver와 통신할 때 기본 인증 방법으로 TLS를 사용함.
TLS는 통신할 때 오가는 패킷을 암호화함.

TLS는 서버뿐만 아니라 클라이언트가 유효한지도 검증함. 

 

~/.kube/config 파일에 인증 정보가 있음 (kubectl 명령시 적용됨)

 

‘ Kubectl config view ‘ : 클러스터에 있는 컨피그 

‘ kubectl config --kubeconfig=/root/my-kube-config use-context research ’ : current-context 설정하기

 

 

  • Clusters
     .cluster.insecure-skip : 인증서가 공인 기관이 인증서인지 검증하는 과정을 건너뜀
     .cluster.server : 외부에서 쿠버네티스 API에 접속할 주소 설정
     .name : 클러스터의 이름을 설정함

  • Contexts
     .context.cluster : 접근할 클러스터를 설정
     .context.user : 클러스터에 접근할 사용자 그룹
     .context.namespace : 특정 네임스페이스 설정가능
     .name : 컨텍스트의 이름

  • Current-context : contexts 필드가 여러 개 있을 때 무엇을 선택해서 클러스터에 접근할 지 결정함
  • Users
     .name : 사용자 그룹의 이름을 설정함
     .user.client-certificate-data : 클라이언트 인증에 필요한 해시값을 설정함
     .user.client-key-data : 클라이언트의 키 해시값

 

  2. 서비스 계정 토큰을 이용해 인증하기 

 

config파일의 user필드를 서비스 계정으로 대체해서 사용하도록 변경함

 

‘ Kubectl get serviceaccount ’ : 서비스 게정 확인

 

Config 파일에 contexts.context.user을 users.name과 연결시켜주고

users[].user. 값에 secret: 넣어줌

 

13.2 권한 관리

 

클러스터의 API에 접근하려면 먼저 접근할 수 있는 사용자인지 인증을 거쳐야 함.

인증 후에는 사용자가 접근하려는 API를 사용할 권한이 있는지 확인한 후 API를 사용할 수 있음.

 

  • ABAC: 속성 기반의 권한 관리

사용자, 그룹, 요청 경로, 요청 동사를 속성으로 사용하고 권한 설정 내용을 파일로 관리

 

  • RBAC : 역할 기반 권한 관리

사용자와 역할을 별개로 선언한 후 두 가지를 조합해서 사용자에게 권한을 부여

kubectl이나 API를 이용해서 관리 가능

 

 

특정 API나 자원 사용 권한들을 명시해둔 규칙의 집합

 

롤이 속한 네임스페이스에만 적용됨.

추가로 네임스페이스에 한정되지 않은 자원과 API들의 사용 권한을 설정할 수 있음. (+엔드포인트)

 

‘kubectl create role developer --namespace=default --verb=list,create --resource=pods’ 

  • apiVersion : 쿠버네티스의 RBAC 권한 관리 기능을 뜻하는 “rbac.authorization.k8s.io/v1” 를 설정
  • Metadata.namespace : 이 롤이 속한 기본 네임스페이스 설정
  • Metadata.name : 롤의 이름
  • Rules : 이 롤이 갖는 권한의 규칙
     .apiGroups : 롤이 사용할 API그룹
     .resources : 어떤 자원에 접근할 수 있는지 명시
     .resourceNames : 해당 자원이 허가되는 자원의 특정 이름 명시
     .verbs : 어떤 동작을 할 수 있는지
     .nonResourceURLs : URL형식으로 규칙 설정 가능

 

   2.클러스터롤

 

클러스터 전체 사용 권한 관리

네임스페이스 전체에 있음

  • aggregationRule : 다른 클러스터롤을 조합해 사용
     .clusterRoleSelectors
      .matchLabels  : 레이블로 클러스터롤 선택

 

    3. 롤바인딩

 

롤과 사용자를 묶는 역할. 사용자가 어떤 롤을 사용하는지 설정함.

 

‘kubectl create rolebinding dev-user-binding --namespace=default --role=developer --user=dev-user’ 

  • Kind
     ServiceAccount : 서비스 계정
  • Metadata
     name : 이름 지정
     namespace : 네임스페이스 지정

  • subjects : 어떤 유형의 사용자 계정과 연결하는지 설정
     .kind : 사용자 계정 종류
     .name
     .apiGroup :
  • roleRef : 사용자에게 어떤 롤을 할당할 지
     .kind
     .name
     .apiGroup : 사용하는 API를 설정

    4.클러스터롤바인딩

 

    5. 다양한 롤의 권한 관리 확인하기

 

‘ Kubectl config “’명령” ‘ : config 파일 수정

‘ Kubectl config set-credentials 사용자 “—token=값” ‘ : 사용자의 토큰정보 추가

‘ Kubectl config set-context “컨텍스트 이름” —cluster=클러스터 —user=사용자 : 사용자와 클러스터를 연결하는 컨텍스트 생성

‘ Kubectl config use-context “컨텍스트 이름” ‘ : 컨텍스트 사용하기