Part 9: RBAC과 ServiceAccount - 인증과 인가
Part 9: RBAC과 ServiceAccount - 인증과 인가
Part 9: 인증 및 인가
24. TLS 및 인증서 관리
24.1 TLS 기초
TLS (Transport Layer Security)의 필요성:
Kubernetes 클러스터의 모든 통신은 암호화되어야 한다:
1
2
3
kubectl → API Server → etcd
↓
kubelet (Worker Nodes)
대칭키 vs 비대칭키:
1
2
3
4
5
6
7
8
9
10
대칭키 암호화:
- 암호화/복호화에 같은 키 사용
- 빠르지만 키 전달 문제
- 예: AES
비대칭키 암호화:
- 공개키(Public Key): 암호화
- 개인키(Private Key): 복호화
- 느리지만 안전
- 예: RSA
인증서 구성 요소:
1
2
3
4
5
6
7
8
9
10
개인키 (Private Key): server.key
공개키 (Public Key): 인증서에 포함
인증서 (Certificate): server.crt
- 공개키
- 소유자 정보 (CN, O)
- CA 서명
CA (Certificate Authority):
- CA 개인키: ca.key
- CA 인증서: ca.crt
24.2 Kubernetes에서의 TLS
Kubernetes 클러스터의 인증서:
1. CA 인증서 (최상위):
1
2
/etc/kubernetes/pki/ca.crt
/etc/kubernetes/pki/ca.key
2. Server 인증서 (서버 인증):
1
2
3
4
5
6
7
8
9
10
11
API Server:
- /etc/kubernetes/pki/apiserver.crt
- /etc/kubernetes/pki/apiserver.key
etcd:
- /etc/kubernetes/pki/etcd/server.crt
- /etc/kubernetes/pki/etcd/server.key
kubelet:
- /var/lib/kubelet/pki/kubelet.crt
- /var/lib/kubelet/pki/kubelet.key
3. Client 인증서 (클라이언트 인증):
1
2
3
4
5
6
7
8
9
10
11
kubectl (admin):
- ~/.kube/config 내 client-certificate-data
- ~/.kube/config 내 client-key-data
API Server → etcd:
- /etc/kubernetes/pki/apiserver-etcd-client.crt
- /etc/kubernetes/pki/apiserver-etcd-client.key
API Server → kubelet:
- /etc/kubernetes/pki/apiserver-kubelet-client.crt
- /etc/kubernetes/pki/apiserver-kubelet-client.key
24.3 인증서 생성 및 관리
수동 인증서 생성 (OpenSSL):
1. CA 인증서 생성:
1
2
3
4
5
6
# CA 개인키 생성
openssl genrsa -out ca.key 2048
# CA 인증서 생성 (자체 서명)
openssl req -new -x509 -key ca.key -out ca.crt -days 3650 \
-subj "/CN=KUBERNETES-CA/O=Kubernetes"
2. Admin 사용자 인증서 생성:
1
2
3
4
5
6
7
8
9
10
# Admin 개인키 생성
openssl genrsa -out admin.key 2048
# CSR (Certificate Signing Request) 생성
openssl req -new -key admin.key -out admin.csr \
-subj "/CN=kube-admin/O=system:masters"
# CA로 서명하여 인증서 생성
openssl x509 -req -in admin.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out admin.crt -days 365
3. kubeconfig 생성:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kubectl config set-cluster kubernetes \
--certificate-authority=ca.crt \
--embed-certs=true \
--server=https://10.0.0.1:6443
kubectl config set-credentials kube-admin \
--client-certificate=admin.crt \
--client-key=admin.key \
--embed-certs=true
kubectl config set-context kubernetes-admin@kubernetes \
--cluster=kubernetes \
--user=kube-admin
kubectl config use-context kubernetes-admin@kubernetes
24.4 Certificates API
Kubernetes 내장 인증서 관리:
Kubernetes는 CSR (CertificateSigningRequest) 리소스를 통해 인증서 발급을 자동화한다.
사용자 인증서 발급 프로세스:
1. 개인키 및 CSR 생성:
1
2
3
4
5
6
7
8
9
# 개인키 생성
openssl genrsa -out john.key 2048
# CSR 생성
openssl req -new -key john.key -out john.csr \
-subj "/CN=john/O=developers"
# CSR을 Base64 인코딩
cat john.csr | base64 -w 0
2. CertificateSigningRequest 리소스 생성:
1
2
3
4
5
6
7
8
9
10
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: john-developer
spec:
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K... # Base64 CSR
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
expirationSeconds: 86400 # 24시간 (선택적)
1
kubectl apply -f john-csr.yaml
3. 관리자가 승인:
1
2
3
4
5
6
7
8
# CSR 목록 확인
kubectl get csr
# 승인
kubectl certificate approve john-developer
# 확인
kubectl get csr john-developer
4. 인증서 추출:
1
kubectl get csr john-developer -o jsonpath='{.status.certificate}' | base64 -d > john.crt
5. kubeconfig 생성:
1
2
3
4
5
6
7
8
9
10
11
12
kubectl config set-credentials john \
--client-certificate=john.crt \
--client-key=john.key \
--embed-certs=true
kubectl config set-context john-context \
--cluster=kubernetes \
--user=john
# Role/RoleBinding 생성 (권한 부여)
kubectl create role developer --verb=get,list,create --resource=pods
kubectl create rolebinding john-developer --role=developer --user=john
24.5 인증서 문제 해결
인증서 정보 확인:
1
2
3
4
5
6
7
8
# 인증서 상세 정보 출력
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
# 주요 확인 항목:
# - Subject: CN (Common Name), O (Organization)
# - Issuer: 발급자 (CA)
# - Validity: Not Before, Not After (만료일)
# - Subject Alternative Name: DNS, IP (중요!)
인증서 갱신 (kubeadm):
1
2
3
4
5
6
7
8
# 모든 인증서 만료일 확인
kubeadm certs check-expiration
# 모든 인증서 갱신
kubeadm certs renew all
# 특정 인증서만 갱신
kubeadm certs renew apiserver
25. RBAC (Role-Based Access Control)
25.1 ServiceAccount
정의:
ServiceAccount는 Pod이 API Server와 통신할 때 사용하는 신원이다.
1
2
3
4
5
apiVersion: v1
kind: ServiceAccount
metadata:
name: myapp-sa
namespace: default
1
2
3
4
5
6
# ServiceAccount 확인
kubectl get serviceaccount
kubectl describe serviceaccount myapp-sa
# 토큰 확인
kubectl get secret
25.2 Role과 ClusterRole
Role (Namespace 범위):
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [ "" ]
resources: [ "pods" ]
verbs: [ "get", "list", "watch" ]
- apiGroups: [ "" ]
resources: [ "pods/logs" ]
verbs: [ "get" ]
ClusterRole (전체 클러스터 범위):
1
2
3
4
5
6
7
8
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: admin
rules:
- apiGroups: [ "*" ]
resources: [ "*" ]
verbs: [ "*" ]
25.3 RoleBinding과 ClusterRoleBinding
RoleBinding:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: ServiceAccount
name: myapp-sa
namespace: default
- kind: User
name: user@example.com
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
ClusterRoleBinding:
1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-secrets-global
subjects:
- kind: ServiceAccount
name: myapp-sa
namespace: default
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io
학습 정리
핵심 개념
- TLS로 모든 클러스터 통신 암호화
- Certificates API로 사용자 인증서 발급 자동화
- RBAC으로 세밀한 권한 관리
- ServiceAccount로 Pod에 권한 부여
- Role/ClusterRole과 RoleBinding/ClusterRoleBinding으로 권한 분리
다음 단계
- TLS 및 인증서 관리 이해
- Certificates API로 인증서 발급
- RBAC로 권한 관리
- Pod 보안 학습 → Part 10으로 이동
실습 과제
- 사용자 인증서 발급 (Certificates API)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# 개인키 생성 openssl genrsa -out jane.key 2048 # CSR 생성 openssl req -new -key jane.key -out jane.csr -subj "/CN=jane/O=developers" # Base64 인코딩 cat jane.csr | base64 -w 0 # CSR 리소스 생성 및 적용 kubectl apply -f jane-csr.yaml # 승인 kubectl certificate approve jane-developer # 인증서 추출 kubectl get csr jane-developer -o jsonpath='{.status.certificate}' | base64 -d > jane.crt
- RBAC 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# ServiceAccount 생성 kubectl create serviceaccount app-sa # Role 생성 (Pod 읽기만 허용) kubectl create role pod-reader --verb=get,list,watch --resource=pods # RoleBinding 생성 kubectl create rolebinding app-sa-binding --role=pod-reader --serviceaccount=default:app-sa # Pod에 ServiceAccount 적용 kubectl run nginx --image=nginx --serviceaccount=app-sa # 권한 테스트 kubectl auth can-i get pods --as=system:serviceaccount:default:app-sa
추가 학습 자료
This post is licensed under CC BY 4.0 by the author.