본문 바로가기
CICD

[Kubernetes] X509 Certs, kubectl, ServiceAccount(Authentication)

by 장중앙 2022. 1. 30.

쿠버네티스 접근제어 체계

  • Authentication : 접속한 사람의 신분을 시스템이 인증하는 단계 -> 신분증 확인
  • Authorization : 어떤 권한을 가지고 어떤 행동을 할 수 있는지 확인하는 단계 -> 사용자별 권한 확인
  • Admission Control : 인증과 권한확인 이후에 추가적인 요청내용에 대한 검증 또는 요청 내용 강제 변경

이러한 접근체계중 Authentication을 주제로 포스팅

 

 

쿠버네티스 API 서버에 접근(Authentication)하는 3가지 방법

  1. X509 Client Certs
  2. kubectl
  3. ServiceAccount

 

1. X509 Client Certs

쿠버네티스 클러스터에는 6443 포트로 API 서버가 열려있음

사용자가 이곳으로 https 접근하는 방법이며 Kubernetes 설치 시, kubeconfig 파일 안의 인증서 내용으로 접근

  • kubeconfig에 Client crt, Client Key를 사용자가 복사하여 Kubernetes API Server에 접근 가능
    • 이러한 인증서가 만들어지는 과정

  • 이러한 kubeconfig는 kubectl이 설치되면서 내부에 복사됨
    • 이러한 kubectl내부에 복사된 kubeconfig를 이용하여 kubectl에서 Kubernetes API Server에 접근하여 리소스 조회가 가능
  • kubectl에 accept-hosts기능으로 8001 포트를 열어두면 외부에서도 https로 접근 가능
    • kubectl 내부에 Kubeconfig로 인증서를 가지고 있기 때문에 사용자는 아무런 인증없이 접근 가능

 

 

2. kubectl

외부 서버에 kubectl를 설치하여 멀티 클러스터에 접근

  • 사전에 각 cluster에 대한 kubeconfig가 외부서버의 kubectl에 존재해야함
    • 사용자는 외부서버의 kubectl에 존재하는 kubeconfig를 통해 원하는 클러스터에 접근 가능

  • kubeconfig의 내용 및 접근 방법
    • kubeconfig내의 항목
      • clusters : 클러스터를 등록
      • users : 사용자 등록
      • contexts : clusters와 users를 연결, 이렇게 연결된 contexts를 이용해 사용자가 접근가능

 

3. ServiceAccount

네임 스페이스 내부의 Secret의 token 값으로 사용자가 API Server에 접근 가능한 방법

  • Namespace 생성 시, 자동적으로 ServiceAccount가 생성됨
    • 이러한 ServiceAccount에는 Secret이 존재
      • 내부에 CA crt와 token 값이 존재
  • 네임 스페이스 내부에 Pod를 생성하면 ServiceAccount와 연결되며, Pod는 Secret의 token값을 통해 API Server에 접근 가능

실습

1. X509 Client Certs

클라이언트 인증서를 복사하여 txt에 저장

grep 'client-certificate-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d

 

클라이언트 키를 복사하여 txt에 저장

grep 'client-key-data' /etc/kubernetes/admin.conf | head -n 1 | awk '{print $2}' | base64 -d

 

https 요청 

PostMan을 이용하여 호출, node list 조회

    -> 아직 인증서 및 키에대한 정보가 없기 때문에 접근 불가

 

정상적인 호출이 가능하게 하는 설정

# postman
Settings > General > SSL certificate verification > OFF
Settings > Certificates > Client Certificates > Host, CRT file, KEY file 설정 및 등록

# curl
curl -k --key ./Client.key --cert ./Client.crt https://192.168.56.30:6443/api/v1/nodes

 

https 호출(nodelist 조회) 재시도

    - 정상적으로 조회/호출 가능

 

kubectl로 Proxy 띄우기

'^*$' -> 어떠한 호스트에서도 접근 가능(특정 호스트를 지정하는 것도 가능)

nohup kubectl proxy --port=8001 --address=192.168.56.30 --accept-hosts='^*$' >/dev/null 2>&1 &

post man으로 8001 포트로 조회하면 위의 6443포트와 동일한 결과가 출력됨

     -> 인증서 없이 외부에서 클러스터 접근 가능

 


2. ServiceAccount

네임 스페이스 생성

kubectl create ns nm-01

ServiceAccount, Secret 확인

# ServiceAccount 확인
kubectl describe -n nm-01 serviceaccounts

# Secret 확인
kubectl describe -n nm-01 secrets

 

Pod 생성

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: nm-01
  labels:
     app: pod
spec:
  containers:
  - name: container
    image: kubetm/app
EOF

https 호출 준비

post man의 Authorization에 Bearer to Token으로 Token에 Secret의 Tocken 값 입력

https로 API 호출

    -> Secret의 Token값을 이용하여 외부에서 API Server에 접근 가능함

댓글