콘텐츠로 이동

RBAC & Permissions

Kubetail은 접근 제어를 Kubernetes RBAC에 위임합니다. 이 페이지에서는 Helm chart가 어떤 RBAC 리소스를 생성하고 각 구성 요소가 이를 어떻게 사용하는지 설명합니다.


Helm chart는 각 구성 요소마다 전용 ServiceAccount, ClusterRole, ClusterRoleBinding을 생성합니다. 각 구성 요소는 자신의 작업에 필요한 권한만 가지고 실행되며, 최소 권한 원칙이 전반에 걸쳐 적용됩니다.

ComponentKindServiceAccount
DashboardDeploymentkubetail-dashboard
Cluster APIDeploymentkubetail-cluster-api
Cluster AgentDaemonSetkubetail-cluster-agent

Dashboard는 워크로드를 나열하고 사용자 대신 로그를 스트리밍하기 위해 Kubernetes API에 대한 광범위한 읽기 권한이 필요합니다. 또한 사용자 자격 증명을 검증하기 위해 token review를 생성할 권한도 필요합니다.

ClusterRole - 클러스터 전체 읽기 권한:

rules:
- apiGroups: [""]
resources: [namespaces, nodes]
verbs: [get, list, watch]
- apiGroups: ["", apps, batch]
resources:
- cronjobs
- daemonsets
- deployments
- jobs
- pods
- pods/log
- replicasets
- statefulsets
verbs: [get, list, watch]
- apiGroups: [authentication.k8s.io]
resources: [tokenreviews]
verbs: [create]

Role - kubetail-system 내 namespace 범위 권한:

rules:
- apiGroups: [discovery.k8s.io]
resources: [endpointslices]
verbs: [list, watch]

endpointslices 권한은 Dashboard가 Cluster API Pod의 상태를 실시간으로 모니터링하는 데 사용됩니다.


Cluster API는 GraphQL API를 통해 워크로드 메타데이터도 제공하므로 Dashboard와 동일한 워크로드 리소스 읽기 권한이 필요합니다.

ClusterRole - 클러스터 전체 읽기 권한:

rules:
- apiGroups: [""]
resources: [nodes]
verbs: [get, list, watch]
- apiGroups: ["", apps, batch]
resources:
- cronjobs
- daemonsets
- deployments
- jobs
- pods
- pods/log
- replicasets
- statefulsets
verbs: [get, list, watch]

Role - kubetail-system 내 namespace 범위 권한:

rules:
- apiGroups: [discovery.k8s.io]
resources: [endpointslices]
verbs: [list, watch]

endpointslices 권한을 통해 Cluster API는 어떤 Cluster Agent Pod가 준비 상태인지 추적해 정상 agent로 로그 요청을 라우팅할 수 있습니다.


Cluster Agent는 노드 파일시스템에서 로그 파일을 직접 읽으며 로그를 가져오기 위해 Kubernetes API 접근이 필요하지 않습니다. 이 ServiceAccount는 Cluster API에서 오는 요청을 승인할 수 있도록 하기 위해서만 사용됩니다. agent는 데이터를 제공하기 전에 수신한 bearer token을 Kubernetes API에 대해 검증합니다.

Cluster Agent ServiceAccount에는 기본적으로 ClusterRole이나 Role이 없습니다. 권한 부여 결정은 호출자가 제공한 토큰으로 Kubernetes SubjectAccessReview API를 호출해 이루어지므로, 실제 접근 가능 범위는 호출자 자신의 RBAC 권한에 의해 결정됩니다.


사용자가 Dashboard에서 로그 보기를 열면 다음 권한 부여 흐름이 발생합니다.

  1. Dashboard는 인증된 사용자를 대신해 수명이 짧은 Kubernetes ServiceAccount 토큰을 생성합니다.
  2. Dashboard는 해당 토큰을 Authorization 헤더로 Cluster API에 전달합니다.
  3. Cluster API는 그 토큰을 관련 Cluster Agent로 전달합니다.
  4. 각 Cluster Agent는 Kubernetes SubjectAccessReview API를 호출해 토큰을 검증하고, 토큰 소유자가 요청된 namespace의 pods/log에 대해 get 권한을 갖는지 확인합니다.
  5. 확인이 통과되면 agent는 로그 데이터를 스트리밍합니다. 그렇지 않으면 권한 거부 오류를 반환합니다.

즉, 어떤 사용자가 Pod에 대해 kubectl logs를 실행할 수 없다면, 어떤 방식으로 연결하든 Kubetail에서도 해당 로그를 볼 수 없습니다. Kubetail 전용 추가 권한은 필요하지 않습니다.