• API 인증요청
    • 일반 사용자(Human User) 또는 그룹(Group)
      • 클러스터 외부에서 K8s를 조작하는 사용자로, 다양한 방법으로 인증을 거친다.
    • Kubernetes-admin
      • K8s의 모든 권한을 소유한 유저 
    • serviceAccount
      • K8s 내부적으로 관리되며 Pod가 K8s API를 다룰 떄 사용하는 계정
      • Pod가 실행될 때 ServiceAccount를 설정하지 않으면 같은 namespace에 default라는 serviceAccount가 할당됨
  • Authentication(인증)
    • user 또는 application이 API에 접근을 허가 받는 과정
    • 인증방식: 클라이언트 인증서, bearer token, HTTP 기본인증 지원
  • Authorization(인가)
    • RBAC 모델기반
    • 요청 ID에 적절한 role이 있는지 확인
  • Adminssion Control
    • 요청이 올바른 형식인지 판별
    • 요청이 처리되기 전에 수정사항을 잠재적으로 적용

 

 

~/.kube/config 파일분석

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTi #..생략
    server: https://192.168.1.10:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDR #..생략
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJV #..생략
  • cluster.server : 외부에서 쿠버네티스 API에 접근할 주소 설정
  • name : cluster 이름
  • context.cluster : 접근할 클러스터 설정
  • context.user : 접근할 사용자 그룹이 누구인지 설정
  • user.client-certificate-data : 클라이언트 인증에 필요한 해시값을 설정
  • user.client-key-data :  클라이언트 key 해시값을 설정

 

 

User 생성 테스트

https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#normal-user

 

Certificate Signing Requests

FEATURE STATE: Kubernetes v1.19 [stable] The Certificates API enables automation of X.509 credential provisioning by providing a programmatic interface for clients of the Kubernetes API to request and obtain X.509 certificates from a Certificate Authority

kubernetes.io

Private key 생성

openssl genrsa -out myuser.key 2048
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuse"

유저등록

  • # cat myuser.csr | base64 | tr -d "\n"

csr파일을 base64로 인코딩한 문자열을 아래 yaml파일의 request에 추가합니다.

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: myuser
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFV  #..생락
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth

  • # kubectl apply -f ./myuser.yaml
    • 유저 생성
  • # kubectl certificate approve myuser
    • 유저 승인
  • # kubectl get csr myuser -o yaml
    • myuser의 인증서 정보 표시

 

Service Account 생성

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: webserver
  name: webserver
spec:
  containers:
  - image: nginx
    name: webserver
  serviceAccount: get-pod

  • # kubectl create serviceaccount get-pod
    • serviceaccount 생성
  • 위에서 생성한 serviceaccount를 Pod에 적용

 

 

 

권한관리

  • Role
    • 어떤 API를 사용할 수 있는지 권한정의, 지정된 네임스페이스에서만 유효
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"]
  • apiGroups
    • role이 사용할 API group
    • Pod는 코드 API이기 때문에 apiGroups를 따로 지정하지 않는다, 만약 리소스가 job이라면 "batch"를 지정
  • resources
    • pods, deployments, services 등 사용할 API resource들을 명시
  • verbs
    • 나열된 API 리소스에 허용할 기능 나열

 

  • RoleBinding
    • Role과 유저를 연결

 

  • # kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
    • role 생성
  • # kubectl create rolebinding developer-binding-my-user --role=developer --user=myuser
    • role binding
  • # kubectl config set-credentials myuser --client-key=myuser.key --client-certificate=myuser.crt --embed-certs=true
    • user를 config에 등록
  • # kubectl config set-context myuser --cluster=kubernetes --user=myuser
    • user의 context 등록
  • # kubectl config use-context myuser
    • 현재 작업 context를 myuser로 변경

 

 

 

  • ClusterRole & ClusterRoleBinding
    • ClusterRole
      • 특정 네임스페이스 사용 권한이 아닌 클러스터 전체 사용 권한을 관리
kubectl create clusterrole developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
kubectl create clusterrolebinding developer-binding-myuser --clusterrole=developer --user=myuser

 

'클라우드 > K8s' 카테고리의 다른 글

K8s DNS  (0) 2022.04.03
K8s volume  (0) 2022.04.03
Pod 스케줄링  (0) 2022.04.03
K8s Secret  (0) 2022.03.31
K8s Configmap  (0) 2022.03.31

+ Recent posts