
쿠버네티스 클러스터에 접근하기 위한 과정(인증 → 인가 → 접근제어 → 승인제어)을 파악하고, 그 밖의 형식과 설정파일인 X.509와 kubeconfig에 대해서도 살펴보자.
kubectl 등으로 외부에서 클러스터에 접근할 때 사용bitnami/kubectl:latestexec으로 Pod에 접속해 kubectl 명렁어를 실행하면 API 서버에게 거부당한다.default라는 SA를 가진다. kubectl get sa: SA 조회API 서버에 대한 접근 권한을 얻기 위해 인증 과정을 거쳐야 한다.
클러스터 관리자는 API 서버가 하나 이상의 인증기 모듈을 실행하도록 구성된다.
| 인증 방식 | 설명 |
|---|---|
| Client Certificate | 주로 관리자나 kubeconfig로 접근하는 사용자 |
| Static Password File | --basic-auth-file 플래그로 등록 (비추) |
| Static Token File | --token-auth-file로 토큰 등록 |
| Bootstrap Token | 클러스터 초기에 kubelet 등록용으로 사용 |
| ServiceAccount Token | Pod 내부 어플리케이션의 API 접근용 JWT |
사람은 인증할 때 인증서를 사용하고, SA는 토큰을 이용한다.
kubectl config view # 클러스터 정보, 인증 정보, 어떤 사용자로 접근 중인지, kubeconfig 파일의 전체 내용
cat ~/.kube/config # kubernetes-admin 인증서
# 일반 user가 사용할 RSA private key 생성
openssl genrsa -out user.key 2048
# user.key의 공개키 + 신원정보(CN, O 등) 를 묶어 .csr 파일로
openssl req -new -key user.key -out user.csr -subj "/CN=user"
vi csr-user.yaml # 쿠버네티스에 등록할 인증서 작성
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: user
spec:
request: # 인증서 내용, cat user.csr | base64 | tr -d "\n"로 확인
signerName: kubernetes.io/kube-apiserver-client # CSR을 서명할 사용자 지정
usages: # 인증서가 사용될 목적을 지정
- client auth # API 서버에 클라이언트로 인증하는 데 사용
# 인증서 등록 -> Pending 상태
# Kubernetes 내에서 자체적으로 인증서를 서명 (CA 역할)
kubectl apply -f csr-user.yaml
# csr 승인 요청
kubectl certificate approve user
# 인증서 저장
kubectl get csr user -o \
jsonpath='{.status.certificate}'| base64 -d > user.crt
# user의 키와 인증서를 쿠버네티스 config 파일에 등록
kubectl config set-credentials user \
--client-key=user.key \
--client-certificate=user.crt \
--embed-certs=true
# config 파일에 context를 등록, kubectl use-context로 해당 사용자로 변경
kubectl config set-context myuser --cluster=kubernetes --user=user
Pod는 default SA를 자동으로 부여받으며,
/var/run/secrets/kubernetes.io/serviceaccount/token경로에 JWT 토큰이 자동 마운트되어 API 서버에 전달되어 인증 수단으로 사용된다.
apiVersion: v1
kind: Pod
metadata:
name: testpod
namespace: default
spec:
containers:
- image: nginx
name: testpod
serviceAccount: sa_name # 여기서 지정
Kubernetes에서 인증은 API 요청의 주체를 검증하는 첫 관문으로,
요청이 인증된 후에는 RBAC 등 정책을 통해 인가되며, 어드미션 컨트롤 단계를 거쳐 etcd에 기록된다.
인증은 "누구인가?"를 확인하는 단계이고, 인가는 "그 사람이 할 수 있는가?"를 판단하는 단계이다.
--authorization-mode 플래그로 인가 모드를 설정할 수 있고, 복수 설정이 가능하다.| 권한 제어 방식 | 설명 |
|---|---|
RBAC | Role/ClusterRole로 권한 정의 → (Cluster)RoleBinding으로 사용자에게 연결 (표준) |
ABAC | JSON 파일로 속성 기반 정책 정의 (deprecated 성격) |
Webhook | 외부 시스템에 인가 요청 위임 (OAuth 연동 등) |
Node | kubelet 전용 인가 방식 (Node의 인증된 요청에 한함) |
AlwaysAllow | 모든 요청 허용 (테스트용) |
AlwaysDeny | 모든 요청 거부 (디버깅용) |
인가는 인증된 요청자에게 무엇을 할 수 있는지 판단하는 절차로, 이것은 접근 제어 정책에 따라 결정된다. 접근 제어는 기본적으로는 RBAC 방식이 사용된다.
접근 제어 방식 중에서도 쿠버네티스에서 표준으로 사용하는 RBAC에 대해서 알아보자.
Role: 특정 네임스페이스 내 자원에 대한 권한 집합 (예: Pod 조회, 생성)RoleBinding: Role과 사용자/SA를 연결하여 해당 권한을 부여ClusterRole: 클러스터 전체 또는 모든 네임스페이스에 대한 권한 집합 cluster-admin: 모든 API, 모든 리소스에 대한 전체 권한admin: 네임스페이스 수준에서 모든 리소스 수정 가능, RBAC 설정 가능edit: 대부분의 리소스를 수정 가능 (RBAC 설정은 불가) view: 리소스를 조회만 가능, 수정 불가ClusterRoleBinding: ClusterRole과 사용자/SA를 연결Role + RoleBinding로, 클러스터 전체에서 적용되는 Role은 ClusterRole + ClusterRoleBinding을 사용한다.# ClusterRole, 모든 네임스페이스의 Pod 조회 권한
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: read-pods-global
rules:
- apiGroups: [""] # Core API 그룹
resources: ["pods"] # 권한이 적용되는 리소스
verbs: ["get", "list"] # 해당 리소스에 대해 허용되는 동작
# ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: global-pod-read-binding
subjects:
- kind: User
name: dev-user
apiGroup: rbac.authorization.k8s.io # RBAC의 기본 그룹
roleRef: # 어떤 역할을 부여할 것인지 지정
kind: ClusterRole
name: read-pods-global
apiGroup: rbac.authorization.k8s.io
# developer라는 이름의 role에 pod에 대해 create, get, list, update, delete 권한을 부여
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
# rolebinding
kubectl create rolebinding developer-binding-myuser --role=developer --user=user
RBAC을 통해 사용자의 요청이 인가되더라도, Kubernetes는 리소스의 생성이나 변경이 실제로 클러스터에 반영되기 전, 추가적인 정책 검사(승인 제어)를 수행한다.
생성해도 되는가? / 수정해도 되는가?에 대한 유효성을 검사하는 단계
MutatingAdmissionController: 요청을 수정할 수 있음ValidatingAdmissionController: 요청이 유효한지 검사만 함 X.509는 공개키 기반 구조(PKI)에서 사용되는 표준 인증서 형식으로, 사용자의 공개 키와 신원 정보(CN, O, OU 등)를 담고 있으며, 이를 신뢰할 수 있는 인증기관(CA)가 서명한다.
ca.crt + ca.key in /etc/kubernetes/pki)를 가지고 있어, 외부 사용자의 인증서 요청을 스스로 검증하고 서명할 수 있다.user.key)user.csr)CertificateSigningRequest 리소스)kubectl certificate approve) user.crt)user.crt, user.key 설정 → 인증 완료
~/.kube/config파일은 kubectl 명령어가 사용할 Kubernetes 클러스터 접속 정보를 담고 있는 설정 파일이다.
clusters: 클러스터 API 서버의 주소 및 인증서 정보users (credentials): 인증서(CRT), 키(KEY), 토큰 등 사용자 인증 정보contexts: 클러스터 + 사용자 + 네임스페이스의 조합current-context: kubectl 명령이 기본적으로 사용할 contextkubectl config view: 현재 kubeconfig 전체 구조 보기# 사용자 인증 정보 추가 (credentials 생성)
kubectl config set-credentials user \
--client-certificate=user.crt \ # 사용자 인증서
--client-key=user.key \ # 사용자 비밀키
--embed-certs=true # 인증서 내용을 파일 내에 직접 내장
# 클러스터 정보 등록 (보통 기본 config에 이미 등록됨)
kubectl config set-cluster cluster.local \
--server=https://192.168.0.10:6443 \
--certificate-authority=ca.crt \
--embed-certs=true
# 컨텍스트 생성 (클러스터 + 사용자 + 네임스페이스 연결)
kubectl config set-context user@cluster.local \
--cluster=cluster.local \
--user=user \
--namespace=default
# 컨텍스트 적용
kubectl config use-context user@cluster.local