1 of 74

Kubernetes Authentication Deep Dive

쿠버네티스 인증 이해하기

2 of 74

https://blog.deepdivers.dev

기술에 대한 깊은 이해를 기반으로, 새로운 인사이트를 얻고 지식을 공유하는 것을 즐기는 동료와 함께 작은 스터디를 시작했습니다.

스터디를 진행하는 동안 함께 작성하고 공유한 자료를 바탕으로 기술 블로그를 운영하고 있습니다.

3 of 74

1. Certificates

2. Kubernetes 인증

4 of 74

  • 매우 강력한 본인확인 제도
  • 인감도장은 인감증명서와 함께 !
  • 인감도장은 본인이 소지하고
  • 인감증명서는 본인에게만 발급

인감제도

5 of 74

신청

발급

거래

👤

인감제도

6 of 74

온라인 세상에서 모든 전자거래를 안심하고 사용할 수 있게 해주는 온라인 인감증명

認 허락

證 증명

Certificates

7 of 74

① 신원확인 (인증)

② 구매가능 (권한)

신원 확인

8 of 74

👽

?!

신원 보장

9 of 74

👽

☹︎

X

👹

Fishing

안전한 거래를 하기에는 … 야생(위험천지)

10 of 74

PKI

A Public Key Infrastructure (PKI) is a collection of internet technologies

that provides secure communications in a network.

안전한 거래를 위한 …

11 of 74

4 요소

  1. 인증서 (X.509)
  2. 공개키와 개인키 (public key, private key)
  3. CA (Certificate Authorities)
  4. Certificate Revocation Lists

Revocation : 폐지

PKI

12 of 74

암호화 복호화

🔑

메시지 암호화

야생(위험천지)

13 of 74

메시지 암호화

야생(위험천지)

14 of 74

특정인만 “암호문"을 해독할 수 있어야 한다

Alice

Bob

15 of 74

Alice

Bob

해독할 수 있는 “키”를 어떻게 전달해야 할까

16 of 74

공개키, 개인키

해독할 수 있는 “키”를 어떻게 전달해야 할까

17 of 74

공개키 개인키

Alice

Bob

공개키로 암호화 하면 개인키로 복호화

18 of 74

공개키 암호화 ⇒ 개인키 소유자만 볼 수 있음

19 of 74

Bob

Alice

개인키 암호화 ⇒ 공개키 소유자들은 다 볼 수 있음

20 of 74

Bob이 보낸 메시지를 Alice만 보려면?

Bob도 Alice의 공개키가 있어야 함

당사자 둘만 보려면? 상대방 공개키를 가지면 됨

21 of 74

Alice는 Bob이 보낸 메시지 인지 어떻게 알지?

이 아저씨도 Alice 공개키 있음

보낸 사람을 어떻게 확인하지?

22 of 74

Private Key 인감도장

Public Key 인감확인 ⇒ 서명 검증

보낸 사람을 어떻게 확인하지? 전자서명 검증

Bob의 개인키로 암호화 ⇒ 전자서명

개인키 암호화가 전자서명인 이유? 개인키(인감)는 소유자만 가지기 때문

23 of 74

Bob의 공개키로 서명을 복호화

보낸 사람을 어떻게 확인하지? 전자서명 검증

Bob의 공개키로 복호화 되면

Bob이 보낸게 맞다 ?

24 of 74

이 아저씨가 Bob 행세를 했다면?

x

x

x

보낸 사람을 어떻게 확인하지? FISHING 가능

Bob의 공개키가 “가짜” 면?

25 of 74

Bob의 공개키인지 어떻게 신뢰? 수사기관에 의뢰

공개키 를 신뢰할 수 있는 기관(CA)에서 보장해 준다면?

인증서

공개키를 어떻게 믿지?

26 of 74

인증서

  • 온라인 인감증명서
  • 신뢰할 수 있는 기관에서 발급
  • 신뢰할 수 있는 서버임을 보장
  • 서버의 “공개키”를 제공

발급

발급

27 of 74

검증

인증서 발급

확실한 공인된 기관(CA)에서 보증

신청

발급

암호화 통신

CA

Alice

Bob

공개키 신뢰

Bob

28 of 74

검증

인증서 발급

확실한 공인된 기관(CA)에서 보증

신청

발급

암호화 통신

CA

Alice

Bob

공개키 신뢰

Bob

29 of 74

검증

인증서 발급

확실한 공인된 기관(CA)에서 보증

신청

발급

암호화 통신

CA

Alice

Bob

공개키 신뢰

Bob

30 of 74

Bob의 공개키로 확인됨

검증

안심하고�사용

인증서 검증

31 of 74

  • Version : X.509 버전 (v1,v2,v3)
  • Issuer : 발급기관
  • Validity Period : 유효기간
  • Subject : 소유자
  • Subject Public Key : 소유자 공개키
  • Certification Authority’s�Digital Signature : CA 디지털 서명
  • Extension Fields �(optional) : 부가정보

인증서

32 of 74

CSR, Certificate Signing Request

인증서를 발급 받으려면 CSR을 작성 합니다.

신청

[req]

distinguished_name = req_distinguished_name

req_extensions = v3_req

prompt = no

[req_distinguished_name]

O = system:nodes

CN = system:node:kube-node

[v3_req]

keyUsage = critical, digitalSignature, keyEncipherment

extendedKeyUsage = clientAuth

Bob

인증서 신청

33 of 74

CSR에 공개키를 포함하고 개인키로 서명

[req]

distinguished_name = req_distinguished_name

req_extensions = v3_req

prompt = no

[req_distinguished_name]

O = system:nodes

CN = system:node:kube-node

[v3_req]

keyUsage = critical, digitalSignature, keyEncipherment

extendedKeyUsage = clientAuth

Bob

CSR 작성

34 of 74

CA 서명된 인증서 발급

Bob

인증서 발급

공개키 첨부

Public key

CA�개인키�암호화

인증서 본문

해싱�1-way

CA서명 첨부

CA서명

CA

Bob

인증서 발급

35 of 74

CA 공개키로 복호화

CA�개인키�암호화

CA�공개키

복호화

위변조

판별

Public key

인증서 본문

공개키 첨부

CA서명 첨부

Bob

Alice

CA

검증

인증서 검증

해싱�1-way

CA서명

Bob

Bob’s

36 of 74

CA에서 CSR을 접수받아 처리

인증서 발급 과정

키 생성

CSR 작성 (공개키첨부)

전자서명

인증서발급신청

CSR 검증

인증서 작성

CA 전자서명

작성 ⇒ 서명 ⇒ 검증

37 of 74

신뢰할 수 있는 기관 ⇒ CA에서 보증함

확실한 공인된 기관 ⇒ 믿을 수 있다 !

공개키 보증

CA, Certificate Authority

38 of 74

CA 보증 ⇒ CA 인증서

메이저 브라우저들 CA인증서를 “기본" 탑재

CA 인증서

39 of 74

CA 인증서 ⇒ CA 공개키

Bob의 인증서 검증

  • CA 공개키로 Bob 인증서의 CA 서명 복호화 ⇒ CA 발급 증명
  • 복호화된 내용 해싱 == Bob 인증서 해시 ⇒ 위변조 없음 증명

CA 인증서

Alice

검증

CA’s

40 of 74

Bob 인증서 ⇒ Bob 공개키

Bob의 공개키 취득

  • 복호화된 내용으로 부터 Bob의 공개키 확보

CA 인증서

Alice

검증

Bob’s

CA’s

41 of 74

나눠서 처리합니다

성남시청

동사무소

CA 하나면 너무 바쁨

42 of 74

CA Tier

43 of 74

상위 CA 가 하위 CA를 임명

44 of 74

CA 인증 체인

45 of 74

공개키, 개인키로 쌍방간 암호화 통신

검증

CA

검증

Alice 개인키

Bob 공개키

Bob 개인키

Alice 공개키

드디어 …

46 of 74

통신할 대상이 많다면 ?

CA

검증

검증

검증

검증

검증

검증

검증

?

비효율, 복잡 ~ 키 관리, 인증서 관리 …

Alice 개인키

Bob 공개키

각자 개인키

Bob 공개키

각자 개인키

Bob 공개키

각자 개인키

Bob 공개키

각자 개인키

Bob 공개키

각자 개인키

Bob 공개키

각자 개인키

Bob 공개키

그런데 …

47 of 74

서버 공개키만 제공

CA

보다 심플하게 할 수 있는 방법 없을까?

✔︎ 다수를 상대로 하는 “서버”만 입증

✔︎ 서로 “대칭키”로 통신

Bob 공개키

Bob 공개키

Bob 공개키

Bob 공개키

Bob 공개키

Bob 공개키

Bob 공개키

다수를 상대로 통신 하려면 ?

48 of 74

디피헬만 알고리즘

키교환 알고리즘

49 of 74

초기 색상을 공유 �노랑

각 자 개인색을 정하고� 초록

초기 색상과 섞는다

+ +

섞은색을 서로 공유�+(교환) +

상대방에게 받은 섞은색개인색을 섞는다

+노+ == +노+

EVE는 ALICE와 BOB이 섞어 얻은

색을 알 수 없다

키교환 알고리즘

50 of 74

초기색상

대칭키

TLS 핸드쉐이크

51 of 74

1. Certificates

2. Kubernetes 인증

52 of 74

kube-apiserver ~ 클러스터의 모든 행정 창구

kube-apiserver

kubelet

kube-scheduler

kube-controller-manager

ETCD

kube-proxy

Pod

kubectl

Control-Plane

Client

Worker-node

53 of 74

Client 관점 ~ 믿고 이용해도 되나?

kube-apiserver

?

54 of 74

Client 관점 ~ 믿고 이용해도 되네

쿠버네티시청�API서버

콘트롤플레인1번지

2022.2.27 ~ 2023.2.27� 쿠버네티시장

!

CA가 할당한 고유번호

서명 알고리즘 식별자

발급자 (쿠버네티시티장)

유효기간

소유자

소유자 공개키

디지털 서명

용도

SAN

Apiserver Certificate

55 of 74

Server 관점 얘네들 ~ 믿고 제공해도 되나?

kube-apiserver

?

Kubectl kubelet scheduler

🤔

56 of 74

신분증 ~ 누구인지 알아야 겠음

kube-apiserver

kubelet

kube-scheduler

kube-controller-manager

ETCD

kube-proxy

Pod

kubectl

Control-Plane

Client

Worker-node

!

57 of 74

K8s의 모든 컴포넌트는 “신분증”을 갖고 있음

노드사무소장�큐블렛

워커노드1리

2022.2.27 ~ 2023.2.27� 쿠버네티시장

노드중개사스케쥴러

콘트롤플레인

2022.2.27 ~ 2023.2.27� 쿠버네티시장

쿠버네티시청�API서버

콘트롤플레인1번지

2022.2.27 ~ 2023.2.27� 쿠버네티시장

콘트롤러매니저

ETCD

OOOOOKUBEPROXY�워커노드1리

2022.2.27 ~ 2023.2.27� 쿠버네티시장

주민등록증엔진엑스�워커노드1리

2022.2.27 ~ 2023.2.27� 쿠버네티시장

OOOOOKUBECTL�H스퀘어

2022.2.27 ~ 2023.2.27� 쿠버네티시장

58 of 74

실제 “신분증”은 이렇게 생겼음

노드사무소장�큐블렛

워커노드1리

2022.2.27 ~ 2023.2.27� 쿠버네티시장

CA가 할당한 고유번호

서명 알고리즘 식별자

발급자 (쿠버네티시티장)

유효기간

소유자 (큐블렛)

소유자 공개키

디지털 서명

용도

59 of 74

Why Mutual?

서버 인증 => TLS 핸드쉐이크

클라이언트 인증 => 인증 + 인가(RBAC)

60 of 74

K8s의 인증서 사용

  • Client certificates for the kubelet to authenticate to the API server
  • Kubelet server certificates for the the API server to talk to the kubelets
  • Server certificate for the API server endpoint
  • Client certificates for administrators of the cluster to authenticate to the API server
  • Client certificates for the API server to talk to the kubelets
  • Client certificate for the API server to talk to etcd
  • Client certificate/kubeconfig for the controller manager to talk to the API server
  • Client certificate/kubeconfig for the scheduler to talk to the API server.
  • Client and server certificates for the front-proxy

61 of 74

kube-apiserver 인증 방식

  1. TLS
  2. Token
  3. Proxy

62 of 74

(1) TLS 주로..K8s 컴포넌트 인증

63 of 74

(1) TLS 로..K8s 컴포넌트 인증

64 of 74

(2) Token

  • Pod to Apiserver 인증
  • Pod to Pod 인증

kube-apiserver

Service Account

65 of 74

(2) Token Service Account ?

Service Account

  • Pod Identity
  • “명세”
  • Token 을 가질 수 있음
    • k8s namespace 마다 default SA와 token을 제공한다.
    • 여러개 SA, token을 생성하고 사용할 수 있다.

66 of 74

(2) Token Pod to ApiServer 인증

kube-apiserver

kube-controller-manager

ServiceAccounts�Controller

Tokens�Controller

Pod�(client)

kubelet

🗝

🔑

📄

🔒

토큰마운트

토큰발급

📄

🔒

🗝

🔑

SA 키페어

개인키

공개키

67 of 74

(2) Token Pod to Pod 인증

kube-apiserver

Pod�(client)

Pod�(Server)

kubelet

🗝

🔑

📄

🔒

토큰마운트

토큰발급

📄

🔒

토큰검증

📄

🔒

🗝

🔑

SA 키페어

개인키

공개키

68 of 74

(3) Proxy apiserver 앞단에 인증처리를 두고 싶다

kube-apiserver

front-proxy

kubectl

app

app

front-proxy-ca.crt

유저 디비

front-proxy-client.crt

발급

POST / HTTP/1.1

X-Remote-User: User1

X-Remote-Group: master

X-Remote-Extra-Scopre: openid

“유저정보"를 약속된 헤더로 전달

LDAP

IAM

DB

optional

69 of 74

kube-apiserver 인증 절차

TLS handshake

Panic Recovery

Authentication

Authorization

Timeout

Impersonation

이름: 큐블렛

소속: 노드사무소/워커노드1리

=> 노드 조회 허용

70 of 74

K8s 인증서 발급/갱신 ~ CSR

71 of 74

K8s CSR Signer

  • kubernetes.io/kube-apiserver-client Never auto-approved by kube-controller-manager.
  • kubernetes.io/kube-apiserver-kubelet-client Auto-approved by kube-controller-manager.
  • kubernetes.io/kubelet-serving Never auto-approved by kube-controller-manager.
  • kubernetes.io/legacy-unknown Never auto-approved by kube-controller-manager.

72 of 74

K8s CSR Approver

kube-controller-manager�built-in approver for a signer “kubernetes.io/kube-apiserver-kubelet-client”

73 of 74

kubelet 서버 TLS 인증서 제공 방식

  • --tls-private-key, --tls-certificate
  • self-signed key, certs
  • CSR

74 of 74

END