본문 바로가기

Kubernetes

[Kubernetes] Kubernetes 인증

반응형

kubectl 명령을 실행했을 때 요청했던 유저는 kubernetes-admin 유저이다.

# kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://10.100.0.104:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: ingress-nginx
    user: kubernetes-admin
  name: ingress-admin@kubernetes
- 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: REDACTED
    client-key-data: REDACTED

 

kubenetes-admin의 인증 정보는 ~/.kube/config 아래에 등록되어있다.

# cat ~/.kube/config

 

API 접근제어

 - API 인증요청

  1) User/Group, Service Account(application)

 - Authentication

  1) user 또는 applicatoin이 API에 접근을 허가 받는 과정

  2) 인증방식 : 클라이언트 인증서, 베어러 토큰(bearer token), HTTP 기본인증 지원

 - Authorization

  1) RBAC 모델기반

  2) 요청 ID에 적절한 role이 있는지 확인

 - Admission Control

  1) 요청이 올바른 형식인지 판별

  2) 요청이 처리되기 전에 수정사항을 잠재적으로 적용

 

API 인증

 - 서버에 접근하기 위해서는 인증작업 필요

  1) 일반사용자 또는 그룹 : 클러스터 외부에서 쿠버네티스를 조작하는 사용자로 다양한 방법으로 인증을 거친다.

  2) 서비스계정 : 쿠버네티스 내부적으로 관리되며 Pod가 쿠버네티스 API를 다룰 때 사용하는 계정이다.

 

API 유저 생성

 - 쿠버네티스 사이트 내용을 바탕으로 유저 생성 진행

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

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

ls
myuser.csr  myuser.key

.csr : 인증서 요청 파일

.key : private 키 파일

 

CertificateSigningRequest 만들기

vi csr-myuser.yaml

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: myuser
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400  # one day
  usages:
  - client auth

/// request 키 파일과 expirationSeconds 삭제

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

// 인증서 파일 생성 후 request 에 추가한다.
cat myuser.csr | base64 | tr -d "\n"

 

인증서 파일을 등록한 후 확인 하면 pending 상태가 나오며, 승인 요청을 해줘야한다.

kubectl apply -f csr-myuser.yaml
certificatesigningrequest.certificates.k8s.io/myuser created

kubectl get csr
NAME     AGE   SIGNERNAME                            REQUESTOR          REQUESTEDDURATION   CONDITION
myuser   57s   kubernetes.io/kube-apiserver-client   kubernetes-admin   <none>              Pending

kubectl certificate approve myuser
certificatesigningrequest.certificates.k8s.io/myuser approved

kubectl get csr
NAME     AGE     SIGNERNAME                            REQUESTOR          REQUESTEDDURATION   CONDITION
myuser   2m47s   kubernetes.io/kube-apiserver-client   kubernetes-admin   <none>              Approved,Issued

 

myuser의 csr 정보를 yaml 형태로 확인

 kubectl get csr myuser -o yaml

 

인증서 저장

kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt

 

Service Account 

 - 쿠버네티스 내부적으로 관리되는 Account 

 - Pod가 실행될 때 특별히 ServiceAccount를 설정하지 않으면 같은 namespace에 default 라는 ServiceAccount가 할당됨

kubectl get serviceaccounts 
NAME      SECRETS   AGE
default   0         66d

 

testpod 생성 후 serviceAccount가 default로 할당되는지 확인

kubectl run  testpod --image=nginx
pod/testpod created


kubectl get pods testpod -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2023-01-29T07:34:49Z"
  labels:
    run: testpod
  name: testpod
  namespace: default
  resourceVersion: "169974"
  uid: 7542d68b-15d0-4ee0-86d3-3335a3cf37cf
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: testpod
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-4nstk
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: node1.example.com
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default

 

pod-viewer 라는 serviceaccount 생성 후 testpod.yaml 에 serviceAccount 추가 후 pod를 실행한 다음 설정 확인

kubectl create serviceaccount pod-viewer
serviceaccount/pod-viewer created

kubectl get sa
NAME         SECRETS   AGE
default      0         66d
pod-viewer   0         5s

vi testpod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: testpod
  namespace: default
spec:
  containers:
  - image: nginx
    name: testpod
  serviceAccount: pod-viewer

kubectl create -f testpod.yaml 
pod/testpod created

kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
testpod   1/1     Running   0          8s

kubectl get pods -o yaml
apiVersion: v1
items:
- apiVersion: v1
  kind: Pod
  metadata:
    creationTimestamp: "2023-01-29T07:40:38Z"
    name: testpod
    namespace: default
    resourceVersion: "170477"
    uid: eec52623-4b50-4c4a-9e68-3bd0ca1b55e5
  spec:
    containers:
    - image: nginx
      imagePullPolicy: Always
      name: testpod
      resources: {}
      terminationMessagePath: /dev/termination-log
      terminationMessagePolicy: File
      volumeMounts:
      - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
        name: kube-api-access-f9qdx
        readOnly: true
    dnsPolicy: ClusterFirst
    enableServiceLinks: true
    nodeName: node1.example.com
    preemptionPolicy: PreemptLowerPriority
    priority: 0
    restartPolicy: Always
    schedulerName: default-scheduler
    securityContext: {}
    serviceAccount: pod-viewer
    serviceAccountName: pod-viewer

 

 

[참고]

- 유투브 따배쿠 강의

 

반응형

'Kubernetes' 카테고리의 다른 글

[kubernetes] Kubernetes 스토리지  (0) 2023.01.30
[Kubernetes] Kubernetes 권한  (0) 2023.01.29
[Kubernetes] taint&toleraton, cordon&drain  (0) 2023.01.27
[Kubernetes] Pod Scheduling  (1) 2023.01.26
[Kubernetes] Istio 정리  (0) 2023.01.25