쿠버네티스 인증(Authentication) - X509 Certs, kubectl, ServiceAccount

yunyoung·2021년 1월 22일

쿠버네티스

목록 보기
8/12

쿠버네티스 API 서버에 접근하는 세 가지 방법.

X509 Client Certs

쿠버네티스 클러스터에 6443 포트 API 서버가 열려있다. 사용자가 이 곳으로 https 접근을 하려면 쿠버네티스 설치 시 kubeconfig 파일 안에 있는 인증서 내용을 가지고 접근할 수 있다.

kubeconfig 안에는 CA crt, Client crt, Client key가 있다.

  • CA crt
    CA key (발급기관 개인키) -> CA csr (인증 요청서) -> CA crt (인증서)

  • Client crt
    CA key + CA crt + (Client key (클라이언트 개인키) - > Client csr (인증요청서)) -> Client crt (인증서)

또 쿠버네티스를 설치할 때 kubectl도 같이 설치가 된다. 이 kubectl에는 kubeconfig가 들어있기 때문에 API 서버에 접근할 때 kubectl 로 접근이 가능하다.

kubectl에서 accept-hosts 옵션을 통해 8001 포트를 Proxy로 열었다고 가정하면, 사용자는 https가 아니라 http로 8001 포트로 요청을 보내 6443 포트의 API 서버로 접근할 수 있으며, kubectl에 인증서가 이미 있기 때문에 사용자가 인증서를 가지고 있지 않아도 접근할 수 있다.

kubectl Proxy 띄우기

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

kubectl

kubectl 설치 : https://kubernetes.io/docs/tasks/tools/install-kubectl/

외부 서버에 kubectl 설치해서 멀티 클러스터에 접근할 수도 있다. 이렇게 하기 위해서는 먼저 각 클러스터에 있는 kubeconfig 파일이 내 kubectl에도 있어야 하고, 사용자는 kubectl을 통해서 각 클러스터에 접근해 자원을 조회하고 생성할 수 있다.

kubeconfig

  • clusters
    클러스터를 등록할 수 있다. name(이름), url(연결 정보), CA(인증서) 속성을 가진다.

  • users
    사용자를 등록할 수 있다. name(이름), crt(인증서), key(개인키) 속성을 가진다.

  • contexts
    contextx를 통해서 클러스터와 사용자를 연결할 수 있다. name(이름), cluster(클러스터 이름), user(사용자 이름) 속성을 가진다.

이렇게 kubeconfig가 잘 만들어져 있다면, 외부의 사용자는 다음과 같은 명령어로 context-A에 접근할 수 있다.

$ kubectl config user-context context-A

Service Account

쿠버네티스 클러스터에 API 서버가 있고, 클러스터 안에 Namespace를 만들게 되면 Namespace 안에 디폴트 ServiceAccount가 자동으로 생성된다.

이 ServiceAccount에는 Secret이 달려 있는데, Secret에는 CA crt와 token값이 들어있다.

Namespace 안에 있는 ServiceAccount, Secret 조회하기

$ kubectl describe -n 네임스페이스이름 serviceaccounts
$ kubectl describe -n 네임스페이스이름 secrets

그 후 Pod를 생성하면 이 Pod는 ServiceAccount와 연결이 되고, Pod는 API 서버에 토큰 값을 통해 연결할 수 있게 된다. 결국 외부의 사용자도 이 토큰 값만 알면 API 서버에 접근할 수 있다.

토큰 값으로 접근하기 위해서는 Headers에 Authorization: Bearer 토큰값 을 추가해 요청을 보내면 된다.

profile
🌈TIL과 개발 노트

0개의 댓글