[Kubernetes] 보안 가이드 (Authentication & Authorization, RBAC)
☸️ Kubernetes 보안 개요 #
Kubernetes는 클러스터 기반 인프라이기 때문에 보안이 매우 중요합니다.
특히 다음 영역이 핵심입니다.
- 사용자 인증 (Authentication)
- 권한 인가 (Authorization)
- 네트워크 보안
- Secret 관리
이 글에서는 그 중에서도 사용자 인증과 권한 인가를 중심으로 정리합니다.
Authentication vs Authorization #
보안 시스템에서 가장 먼저 이해해야 하는 개념은 인증(Authentication) 과 인가(Authorization) 입니다.
| 개념 | 설명 |
|---|---|
| Authentication | 사용자가 누구인지 확인 |
| Authorization | 해당 사용자가 어떤 권한을 가지는지 확인 |
예를 들어
로그인 → Authentication
권한 체크 → AuthorizationKubernetes 보안 구조 #
graph TD A[Client] B[Authentication] C[Authorization] D[Kubernetes API Server] E[Cluster Resource] A --> B B --> C C --> D D --> E
흐름
1️⃣ Client 요청 2️⃣ 인증(Authentication) 3️⃣ 권한 확인(Authorization) 4️⃣ API Server 처리
Kubernetes 계정 종류 #
Kubernetes에서는 두 가지 계정을 사용합니다.
| 계정 | 설명 |
|---|---|
| User Account | 사람이 사용하는 계정 |
| Service Account | 시스템 또는 Pod에서 사용하는 계정 |
User Account #
일반적인 사용자 계정입니다.
특징
- Kubernetes 내부에서 직접 관리하지 않음
- 외부 인증 시스템과 연동
대표적인 인증 방식
- OAuth
- Webhook
- LDAP
- OIDC
Service Account #
Service Account는 Pod나 애플리케이션이 Kubernetes API를 사용할 때 사용하는 계정입니다.
예를 들어
- Controller
- Operator
- 내부 애플리케이션
ServiceAccount 생성 #
1kubectl create sa my-service-accountServiceAccount 구조 #
graph TD A[Pod] B[ServiceAccount] C[Secret Token] D[Kubernetes API] A --> B B --> C C --> D
ServiceAccount는 API 인증을 위한 Token을 Secret에 저장합니다.
Kubernetes 인증 방식 #
Kubernetes는 다양한 인증 방식을 지원합니다.
| 인증 방식 | 설명 |
|---|---|
| Basic Auth | HTTP 인증 |
| Bearer Token | API Token 기반 인증 |
| Client Certificate | 인증서 기반 인증 |
| Webhook | 외부 인증 시스템 |
Bearer Token 인증 #
가장 많이 사용하는 방식입니다.
Authorization: Bearer {TOKEN}ServiceAccount Token을 이용하여 API 호출이 가능합니다.
Token 조회 #
1kubectl describe sa default또는
1kubectl describe secret {secret-name}API 호출 예시 #
1curl https://APISERVER/api \
2 --header "Authorization: Bearer $TOKEN" \
3 --insecurekubectl proxy를 이용한 인증 #
직접 Token을 사용하는 대신 kubectl proxy를 사용할 수도 있습니다.
1kubectl proxy --port=8080이후 API 호출
curl localhost:8080/apiproxy가 자동으로 인증 정보를 추가합니다.
Authorization (권한 관리) #
인증 이후에는 권한 검사가 진행됩니다.
Kubernetes는 기본적으로 RBAC(Role Based Access Control) 을 사용합니다.
RBAC 구조 #
graph TD A[User] B[Group] C[ServiceAccount] D[Role] E[RoleBinding] F[Kubernetes Resource] A --> E B --> E C --> E E --> D D --> F
핵심 구성
- Role
- RoleBinding
- ClusterRole
- ClusterRoleBinding
Role #
Role은 특정 리소스에 대한 권한 정의입니다.
예
- Pod 조회
- Deployment 생성
- Service 삭제
Role 예시 #
1apiVersion: rbac.authorization.k8s.io/v1
2kind: Role
3metadata:
4 name: pod-reader
5
6rules:
7- apiGroups: [""]
8 resources: ["pods"]
9 verbs: ["get", "watch", "list"]RoleBinding #
Role을 사용자 또는 서비스 계정에 연결합니다.
graph LR A[User] B[RoleBinding] C[Role] A --> B --> C
RoleBinding 예시 #
1kind: RoleBinding
2apiVersion: rbac.authorization.k8s.io/v1
3
4metadata:
5 name: read-pods
6
7subjects:
8- kind: User
9 name: jane
10
11roleRef:
12 kind: Role
13 name: pod-reader
14 apiGroup: rbac.authorization.k8s.ioRole vs ClusterRole #
| 구분 | 범위 |
|---|---|
| Role | 특정 Namespace |
| ClusterRole | Cluster 전체 |
ClusterRole은 다음과 같은 리소스에 사용됩니다.
- Node
- PersistentVolume
- Cluster 설정
기본 제공 Role #
Kubernetes는 기본 Role을 제공합니다.
| Role | 설명 |
|---|---|
| cluster-admin | 전체 관리자 |
| admin | 네임스페이스 관리자 |
| edit | 리소스 수정 가능 |
| view | 읽기 전용 |
RBAC 전체 아키텍처 #
graph TD A[User] B[Group] C[ServiceAccount] D[Role] E[ClusterRole] F[RoleBinding] G[ClusterRoleBinding] H[Resource] A --> F B --> F C --> F F --> D G --> E D --> H E --> H
ServiceAccount + RBAC 예제 #
먼저 ServiceAccount 생성
1apiVersion: v1
2kind: ServiceAccount
3metadata:
4 name: sa-viewerClusterRoleBinding 생성
1kind: ClusterRoleBinding
2apiVersion: rbac.authorization.k8s.io/v1
3
4metadata:
5 name: default-view
6
7subjects:
8- kind: ServiceAccount
9 name: sa-viewer
10 namespace: default
11
12roleRef:
13 kind: ClusterRole
14 name: view
15 apiGroup: rbac.authorization.k8s.ioPod에서 ServiceAccount 사용
1apiVersion: v1
2kind: Pod
3metadata:
4 name: pod-reader
5
6spec:
7 serviceAccountName: sa-viewer
8
9 containers:
10 - name: reader
11 image: gcr.io/terrycho-sandbox/pod-reader:v1이렇게 하면 Pod 내부에서 Kubernetes API를 호출할 수 있습니다.
정리 #
Kubernetes 보안 핵심
Authentication #
사용자를 식별
대표 방식
- Bearer Token
- Client Certificate
- OAuth
Authorization #
권한 관리
대표 방식
- RBAC
계정 종류 #
| 계정 | 사용 |
|---|---|
| User Account | 사용자 |
| Service Account | Pod / 시스템 |