# RBAC & Permissions

import { Aside } from '@astrojs/starlight/components';

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

---

## 개요

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

| Component | Kind | ServiceAccount |
|-----------|------|---------------|
| Dashboard | Deployment | `kubetail-dashboard` |
| Cluster API | Deployment | `kubetail-cluster-api` |
| Cluster Agent | DaemonSet | `kubetail-cluster-agent` |

---

## Dashboard

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

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

```yaml
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 범위 권한:

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

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

---

## Cluster API

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

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

```yaml
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 범위 권한:

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

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

---

## Cluster 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 전용 추가 권한은 필요하지 않습니다.

<Aside type="tip">
사용자에게 어떤 권한이 필요한지 이해하려면 [보안 및 프라이버시](/ko/concepts/security-and-privacy) 페이지를 참고하세요.
</Aside>