본문으로 건너뛰기

인증(Authentication)


Authentication in Kubernetes

개념

authentication1

  • Kubernetes 클러스터에 접근/조작 하기 위해서는

    1. 클러스터에 접근 가능한 자격이 있는지(인증 - Authentication) 확인하고
    2. 클러스터 내에서 어떠한 리소스들에 권한이 있는지(인가 - Authorization)에 대한 확인
  • 을 거쳐야한다.

  • 이 글에서는 인증(Authentication)을 다룰 것이다.

  • 그럼 이 인증은 어디서 검증해주는걸까?

  • 유저가 클러스터에 kubectl로 요청을 했을 때, Authentication을 하는 주체는 kube-apiserver이다.

Authentication 대상

authentication2.png

User Account

  • 대상 - 쿠버네티스 클러스터 내의 리소스를 조작하는 사람
    • 클러스터 관리자
    • 개발자
  • Kubernetes는 User Account 라는 객체가 존재하지 않는다. - 다른 방법으로 관리
    • cf) 미리 말하자면, 유저가 개인키로 CSR을 만들 때 넣는 CN(Common Name)이 유저의 이름이 된다.

Service Account

  • 클러스터 내 다른 객체
    • ex: Deployment, Ingress Controller 등)
  • Kubernetes에는 클러스터 내 객체가 Authentication을 하기위한 객체인 Service Account가 존재한다.

Authentication 종류

  • User
    • Static Password File (v1.19에서 Deprecated)
    • Static Token File (권장 X)
    • Certificates (권장 O)
    • Third party Service (LDAP, Kerberos 등)
  • Bot
    • Service Account

예시 - Static Token File (For 이해, 권장 X)

정보

이 글에서는 Authentication 이해를 위한 가장 쉬운 예시인 Static Token File 방법을 소개한다. (토큰이 plain text 그대로 저장되기 때문에 보안상 권장 x) 권장되는 User 인증 방법인 Certificate와 객체 끼리의 인증 방법인 Service Account는 다른 글에서 자세히 다룬다.

In Kubernetes Cluster

토큰 파일 생성

mkdir /etc/kubernetes/token
nano /etc/kubernetes/token/static-tokens.csv
<토큰>,<사용자 이름>,<UID>,"<그룹>"
# 예시
23a31c5195e33d0639d67d739812a02e,remote-son,001,"system:masters"
  • 위와같이 4개의 column을 가진 csv 파일 형태로 토큰을 /etc/kubernetes/token(임의의 디렉토리 - 변경 가능)에 생성한다.
  • RBAC를 아직 배우지 않았기 때문에, 그룹에 "system:masters"로 이미 존재하는 최고 권한을 가진 그룹에 포함시킨다.

kube-apiserver 설정 변경

nano /etc/kubernetes/manifests/kube-apiserver.yaml
...
spec:
containers:
- command:
- kube-apiserver
- --authorization-mode=Node,RBAC # RBAC 포함 확인
- --token-auth-file=/etc/kubernetes/token/static-tokens.csv # 이 줄을 추가
...
volumeMounts:
- mountPath: /etc/kubernetes/token
name: static-token-dir # 위에서 정의한 볼륨 이름
readOnly: true
...
volumes:
- hostPath:
path: /etc/kubernetes/token
type: DirectoryOrCreate # token 폴더가 없으면 생성
name: static-token-dir # 볼륨 이름
...
  • Static Token File 파일을 등록하기 위해 kube-apiserver의 설정 파일을 수정한다.
    • commandStatic Token File 경로 추가
    • Pod에서 Static Token File 경로에 접근할 수 있도록 volumes, volumeMounts 추가
  • kube-apiserverStatic Pod이기 때문에 설정 파일을 수정하고 조금 기다리면 수정된다.

CA 인증서 확인

cat /etc/kubernetes/pki/ca.crt | base64 -w 0
  • kube-apiserver의 인증서를 검증하는 데 사용하는 CA 인증서
  • 이를 기록해둔다.
  • 왜냐하면, 토큰이 Authentication 부분은 해결하지만, TLS 연결을 해결해주는 것이 아니기 때문에 CA 인증서가 필요하다.

User Local

  • 클러스터에 접근하려는 유저가 로컬에서 클러스터에 요청을 보내고 싶을 경우를 가정한다.

kubectl 설치 (mac 기준)

brew install kubectl
  • 클러스터에 요청을 보내기 위해서는 쿠버네티스를 설치할 필요는 없고 kubectl만 설치하면 된다. (설치하지 않고, curl로 api 요청을 보내도 된다)

로컬 kubeconfig 파일 생성

mkdir ~/.kube
nano ~/.kube/config
apiVersion: v1
kind: Config
preferences: {}

# 1. 클러스터 정보 정의
clusters:
- cluster:
certificate-authority-data: <위에서 기록해둔 CA 인증서>
server: https://192.168.0.1:6443 # 마스터 노드의 IP 및 포트
name: kubernetes-static-token

# 2. 사용자 정보 정의
users:
- name: remote-son
user:
token: 23a31c5195e33d0639d67d739812a02e # 설정한 Static Token

# 3. Context 정의
contexts:
- context:
cluster: kubernetes-static-token
user: remote-son
name: remote-son-context@kubernetes

# 4. 현재 Context 설정
current-context: remote-son-context@kubernetes
  • 사용자의 로컬에 Authentication을 위한 confing 파일을 생성한다.
    • 경로: ~/.kube
kubectl get pod --all-namespaces
  • 이제 User의 로컬에서 클러스터에 인증 후 명령어를 사용할 수 있는 것을 볼 수 있다.
    • RBAC 그룹을 모든 권한이 있는 system:masters로 해둔 상태이다.

API 요청을 직접 보내고 싶다면

CA_DATA_ENCODED="<기록해둔 CA 인증서>"

echo $CA_DATA_ENCODED | base64 -D > /tmp/ca.crt
curl -X GET \
--cacert "/tmp/ca.crt" \ # CA 인증서를 저장한 경로 (기록해둔 것 파일로 저장)
-H "Authorization: Bearer <설정한 토큰>" \
-H 'Accept: application/json' \
"https://192.168.0.1:6443/api/v1/pods?limit=500"

레퍼런스