Kubernetes 클러스터는 물리 노드, 가상 노드 및 동작하는 다양한 요소로 구성되어 있다. Kubernetes 클러스터는 인증 및 권한 부여 메커니즘을 이용해 구성 요소 간 통신과 클러스터에 대한 접근 관리성을 확보함으로써 보호되어야 한다.
사용자
쿠버네티스는 기본적으로 사용자 계정을 관리하지 않는다. 즉, kubectl create user와 같은 명령어로 사용자를 생성할 수 없고, kubectl get users와 같은 명령어로 사용자를 확인할 수도 없다.
쿠버네티스는 인증서, LDAP과 같은 서비스, 사용자 정보가 저장된 정적 파일 등을 이용해 사용자를 관리한다.
단, Service Accounts는 쿠버네티스에 생성하고 관리할 수 있다.
사용자 유형
인간
User Accounts
- 관리자 : 관리 작업을 수행하기 위해 클러스터에 접근
- 개발자 : 애플리케이션을 테스트하거나 배포하기 위해 클러스터에 접근
- 최종 사용자 : 클러스터에 배포된 애플리케이션에 접근. 최종 사용자의 보안은 애플리케이션 자체에서 관리되기 때문에 클러스터에서 별도로 관리할 필요가 없다.
로봇
Service Accounts
- 타사 애플리케이션 : 통합 목적으로 클러스터에 접근
kuberctl을 통하든, kube-apiserver에 직접 접근하든, 모든 사용자의 접근은 kube-apiserver에 의해 관리된다. kube-apiserver는 요청을 처리하기 전에 해당 요청을 정해진 인증 메커니즘을 이용해 인증한다.
아래에는 인증 매커니즘 중 하나의 정적 암호/토큰 파일에 대한 내용을 정리한다.
정적 암호/토큰 파일
사용자와 패스워드, 또는 토큰 목록을 정적 파일로 생성하여 사용자 정보로 사용하는 방식이다.
파일 내 속성은 사용자명, 암호, user id, group 정보 등이 있을 수 있다.
kube-apiserver 인증 적용 방법
- kube-apiserver.service에 설정 추가
--basic-auth-file 옵션을 추가한다.
설정 변경 후 적용을 위해서는 서비스 재시작이 필요하다.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://192.168.5.11:2379,https://192.168.5.12:2379 \\ --event-ttl=1h \\ --runtime-config=api/all \\ --service-cluster-ip-range=10.96.0.0/24 \\ --service-node-port-range=30000-32767 \\ --v=2 --basic-auth-file=<FILENAME>
- kubeadm을 이용해 클러스터를 설정한 경우, kube-apiserver의 POD 정의 yaml 파일 수정
--basic-auth-file 옵션을 추가한다.
vi /etc/kubernetes/manifests/kube-apiserver.yaml
파일 업데이트 시, kubeadm이 자동으로 kube-apiserver를 재시작한다.apiVersion: v1 kind: Pod metadata: creationTimestamp: null name: kube-apiserver namespace: kube-system spec: containers: - command: - kube-apiserver - --authorization-mode=Node,RBAC - --advertise-address=172.17.0.50 - --allow-privileged=true - --enable-admission-plugins=NodeRestriction - --enable-bootstrap-token-auth=true - --basic-auth-file=<FILENAME> image: k8s.gcr.io/kube-apiserver-amd64:v1.11.3 name: kube-apiserver ...
kube-apiserver 인증 방법
사용자, 비밀번호 또는 토큰을 이용해 kube-apiserver에 인증하기 위해서는 curl 명령어에 해당 정도를 지정하면 된다.
- 사용자/비밀번호 사용
curl -v -k <KUBE_APISERVER_URL> -u "<USERNAME>:<PASSWORD>" # 예시 curl -v -k https://master-node-ip:6443/api/v1/pods -u "user1:password123"
- 토큰 사용
curl -v -k <KUBE_APISERVER_URL> --header "Authorization: Bearer VALUE"
참고 문서
https://coffeewhale.com/kubernetes/authentication/http-auth/2020/05/03/auth02/