쿠버네티스의 RBAC (Role-Based Access Control)은 쿠버네티스 클러스터 내의 자원에 대한 접근 권한을 제어하고 관리하기 위한 보안 메커니즘입니다. RBAC는 다양한 사용자, 서비스 계정 및 그룹에게 어떤 동작과 자원에 대한 권한을 부여하거나 제한하는 데 사용됩니다.
정의 : Role은 특정 네임스페이스 내의 리소스에 대한 접근 권한을 정의합니다. Role을 사용하면 사용자나 그룹에게 특정 리소스에 대한 읽기, 쓰기, 수정 등의 권한을 부여할 수 있습니다.
사용 예시: 예를 들어, 특정 네임스페이스 내의 파드만 조회할 수 있는 권한, 특정 서비스를 생성하거나 삭제할 수 있는 권한 등을 Role을 통해 정의할 수 있습니다.
정의 방법
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
rules:
- apiGroups: [""]
verbs: ["get", "watch", "list"] # 권한을 줄 API 종류
resources: ["pods", "pods/log"] # 권한을 주고자하는 액션
resourceNames: ["nginx"] # 권한을 주고자하는 특정 리소스
정의: RoleBinding은 특정 Role을 사용자, 그룹, 또는 ServiceAccount에 연결합니다. 즉, RoleBinding을 통해 누가 해당 Role에 정의된 권한을 사용할 수 있는지 결정합니다.
사용 예시: 만약 특정 사용자가 특정 네임스페이스 내의 파드를 조회할 수 있도록 하고 싶다면, 해당 사용자를 해당 권한을 가진 Role에 연결하는 RoleBinding을 생성합니다.
정의 방법
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
namespace: [NAMESPACE NAME]
metadata:
name: read-pods
# Role을 적용할 USER, GROUP 혹은 SERVICE ACCOUNT
subjects:
- kind: User
name: [USER NAME]
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: [GROUP NAME]
apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount
name: [SERVICE ACCOUNT NAME]
# subjects에 명시된 내용에 적용할 Role
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
정의: ClusterRole은 클러스터 전체에 걸쳐 특정 리소스에 대한 접근 권한을 정의합니다. ClusterRole은 네임스페이스를 넘어서는 리소스에 대한 권한(예: 노드) 또는 클러스터 전체 리소스(예: 시크릿)에 대한 권한을 부여할 수 있습니다.
사용 예시: 예를 들어, 클러스터 전체의 모든 파드를 조회하거나, 클러스터 레벨의 리소스(노드, 퍼시스턴트볼륨 등)에 대한 관리 권한을 부여할 때 사용합니다.
정의 방법
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-pod-reader
rules:
- apiGroups: [""]
verbs: ["get", "watch", "list"] # 권한을 주고자하는 액션
resources: ["pods", "pods/log"] # 권한을 주고자하는 특정 리소스
정의: ClusterRoleBinding은 특정 ClusterRole을 사용자, 그룹, 또는 ServiceAccount에 연결합니다. 이를 통해 해당 역할에 정의된 권한을 전체 클러스터에 걸쳐 사용할 수 있는 주체를 지정합니다.
사용 예시: RoleBinding으로는 특정 namespace 내의 리소스 권한만 통제할 수 있기 때문에 전체 클러스터의 리소스에 대한 관리 권한을 특정 사용자나 서비스 계정에 부여하고 싶을 때 ClusterRoleBinding을 사용합니다.
정의 방법
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: pod-reader-global
subjects:
- kind: User
name: [USER NAME]
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: [GROUP NAME]
apiGroup: rbac.authorization.k8s.io
- kind: ServiceAccount
name: [SERVICE ACCOUNT NAME]
# subjects에 명시된 내용에 적용할 Role
roleRef:
kind: ClusterRole
name: cluster-pod-reader
apiGroup: rbac.authorization.k8s.io
정의: ServiceAccount는 파드가 Kubernetes API와 상호작용할 때 사용하는 계정입니다. 각 파드는 특정 ServiceAccount과 연결되어 있으며, 이 계정을 통해 파드는 Kubernetes API에 접근합니다.
사용 예시: 파드가 클러스터 내 다른 리소스를 조회하거나 조작할 필요가 있는 경우, 해당 작업을 수행할 권한을 가진 ServiceAccount를 파드와 연결합니다.
정의 방법
apiVersion: v1
kind: ServiceAccount
metadata:
name: [SERVICE ACCOUNT NAME]
User Account와 비교
속성 | User Account | Service Account |
---|---|---|
식별 | 개인 사용자 또는 인증 프로바이더에서 생성된 사용자 계정 | Kubernetes 내부 서비스 및 워크로드에 사용되는 계정 |
주요 용도 | 클러스터 관리 및 리소스 조작을 위한 사용자 인증 | Pod 내부에서 클러스터 리소스에 접근하기 위한 인증 |
권한 범위 | 권한은 Role-based Access Control (RBAC) 또는 다른 인증 메커니즘을 통해 관리됨 | Service Account에는 자동으로 제한된 권한 부여 |
이름 관리 | 일반적으로 사용자 이름 또는 식별자로 식별됨 | 자동 생성되는 이름 (예: "default") |
인증 방법 | 보통 패스워드, 토큰 또는 인증 키를 사용하여 인증 | 토큰 기반의 인증 사용 (Service Account 토큰 자동 생성) |
Pod와의 연관성 | 직접적으로 관련 없음 | Service Account를 특정 Pod에 연결하여 Pod가 해당 계정을 사용할 수 있도록 함 |