[CKS] 1-3. Authentication

쿠버네티스 보안의 핵심, 사용자 접근 관리. kube-apiserver 인증/인가 처리 방식 확인을 확인합니다.

[CKS] 1-3. Authentication
Photo by Ed Hardie / Unsplash

개요

내부 구성 요소간의 통신을 안전하게 수행하고 인증 및 권한 부여 메커니즘을 통해 클러스터 관리 접근을 안전하게 수행하는 방법에 대해서 정리하였습니다.

Accounts(내부 사용자)

사용자들의 관리 목적 쿠버네티스 클러스터 접근을 관리하기 위해 다음과 같은 두 가지로 분류할 수 있습니다.

  • Users → Admin, Developers
  • Service Accounts → Bots

Kubernets는 사용자 계정, 클러스터에 접근이 필요한 애플리케이션들을 기본적으로 관리하지 않습니다. 사용자 세부 정보가 있는 파일과 인증서, LDAP 같은 외부 소스에 의존하고 있습니다.

따라서 사용자 생성, 사용자 목록은 조회할 수 없지만, Service Accounts 계정의 경우는 가능합니다만, 현재 자료에서는 k8s 사용자에 집중하겠습니다.

Manage Accounts

모든 사용자의 접근은 apiserver에 의해 관리되며 kube-apiserver는 요청을 처리하기 전에 이를 인증합니다.

이를 수행하기 위해 kube-apiserver는 authentication 메커니즘을 수행합니다. Static Password 파일(패스워드, 토큰), 혹은 인증서.. 그 외 Identity Service를 수행합니다.

Auth Mechanisms - Basic (1.19 Deprecated)

Authentication의 가장 간단한 형태로 CSV 파일에 사용자 목록, 비밀번호를 생성합니다. 그것을 사용하여 사용자 정보의 소스로 사용합니다. 이를 옵션으로 kube-apiserver에 등록합니다.

# User File Contents
password123,user1,u0001
password123,user2,u0002
password123,user3,u0003
password123,user4,u0004
password123,user5,u0005

api-server에 인증 정보 등록을 수행해야합니다.

ExecStart=/usr/local/bin/kube-apiserver \
  --advertise-address=${INTERNAL_IP} \
  --allow-privileged=true \
  --apiserver-count=3 \
  --authorization-mode=Node,RBAC \
  --bind-address=0.0.0.0 \
  --enable-swagger-ui=true \
  --etcd-servers=https://127.0.0.1:2379 \
  --event-ttl=1h \
  --runtime-config=api/all \
  --service-cluster-ip-range=10.32.0.0/24 \
  --service-node-port-range=30000-32767 \
  -v=2 \
  --basic-auth-file=user-details.csv

kubeadm같은 도구를 사용하여 cluster를 설정했다면 kube-apiserver를 수정합니다.

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - name: kube-apiserver
    image: k8s.gcr.io/kube-apiserver-amd64:v1.11.3
    command:
      - kube-apiserver
      - --authorization-mode=Node,RBAC
      - --advertise-address=172.17.0.107
      - --allow-privileged=true
      - --enable-admission-plugins=NodeRestriction
      - --enable-bootstrap-token-auth=true
      - --basic-auth-file=user-details.csv
  • kubeadm을 사용하여 클러스터를 구성할 때 인증 파일이 볼륨으로 안전하게 마운트되었는지 확인
  • 새로운 사용자에 대해 적절한 권한 부여 정책을 배포하여 클러스터를 무단 액세스로부터 보호 필요

이제 인증을 위한 설정은 완료되었습니다. 인가를 위한 Role Binding까지 수행해야합니다.

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: # "" indicates the core API group
  resources: ["pods
  verbs: ["get", "watch", "lis

---
# This role binding allows "jane" to read pods in the "default" namespace.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: user1 # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role #this must be Role or ClusterRole
  name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io

토큰 또한 동일합니다. auth 파일을 CSV 파일로 저장, Baerer 토큰을 전달합니다.

KpjCVbI7cFAHYPkByTIzRb7gulcUc4B,user10,u0010,group1
rJjncHmvtXHc6MlWQddhtvNyvhgTdXSC,user11,u0011,group1
mjpOFTEiF0kL9toikaRNTt59ePtczZSq,user12,u0012,group2
PG41IXhs7QjqWkmBkgvGT9gIoyUqZiJ,user13,u0013,group2

이후 토큰 파일 옵션을 사용합니다.

kube-apiserver --token-auth-file=user-token-details.csv

사용자 이름, 비밀번호, 토큰을 일반 텍스트로 저장하는 것은 본질적으로 안전하지 않습니다. 운영 환경에서는 인증서 기반 인증을 사용하거나 신뢰할 수 있는 타사 ID 제공업체와 통합하는 것을 고려하세요.

전달 방식은 다음과 같습니다.

curl -v -k https://master-node-ip:6443/api/v1/pods -u "user1:password123"
curl -v -k https://master-node-ip:6443/api/v1/pods --header "Authorization: Bearer KpjCVbI7cFAHYPkByTIzRb7gulcUc4B"

평문으로 저장하기 때문에 권장되지 않는 방식이지만 가장 이해하기 쉬우며 인증에 대한 기본으로 구성되는 방식입니다.