Search

RBAC

Kuberenetes의 RBAC 인증은 API Server에서 제공하는 인가 방식 중 하나이다. 보안 접근 통제 모델의 RBAC를 클러스터에 적용할 수 있도록 만들어진 듯 하다.   RBAC(Role-based Access Control)에서 나오는 Role은 실제 기업 내의 역할을 말한다.
실제 인프라에서 웹 관리자와 DB 관리자라는 역할이 나눠놓고 운영하는데 이러한 역할을 Kubernetes 클러스터에 적용하면 기업의 상황에 맞게 접근 통제 설정이 가능해진다.
Access Control(접근 제어) : '누가 어디서 무엇을 어떻게' 하는가?
RBAC(Role-based Access Control) : 어떤 역할(Role)이 '어디서 무엇을 어떻게' 하는가?

Role, RoleBinding

Role : 특정 네임스페이스에 한정된 정책 (특정 네임스페이스 + '어디서 무엇을 어떻게')
RoleBinding : 역할이 특정 네임스페이스에 한정된 정책을 따르도록 적용 (어떤 역할이 특정 네임스페이스에서 하는가?)
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: <Role name> namespace: <namespcae> rules: - apiGroups: [""] resources: ["<value>"] verbs: ["<vale>", "<vale>", "<vale>"]
YAML
복사
kind: Role
특정 네임스페이스에 한정된 정책을 명시하는 파일이다. 라는 뜻
kind: Role 을 사용하기 위해서는 일단 필요
metadata : 정책을 구분지을 메타데이터 값
namespace : 정책이 적용될 특정 네임스페이스
name : 정책의 이름
rules : 정책 ('어디서 무엇을 어떻게' 하는지를 적는 곳, "- apiGroups" 단위로 정책 한 뭉텅이)
apiGroups : resources가 속한 apiGroup, ''은 Core API Group을 말한다.
resources : 규칙을 적용할 리소스 목록, ResourceAll 은 모든 리소스를 나타낸다.
verbs : 리소스 접근 동사(접근 동사 목록은 link 참고)
요약(Role 파일의 내용)
Core API 그룹의 pods 리소스에 대해 get. list만을 허용한다.
Core API 그룹의 services 리소스에 대해 edit 만을 허용한다.
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: <RoleBinding name> namespace: <namespcae> roleRef: kind: ClusterRole name: <ClusterRole name> apiGroup: rbac.authorization.k8s.io subjects: - kind: User name: <User name> apiGroup: rbac.authorization.k8s.io - kind: ServiceAccount name: <ServiceAccout name> namespace: <namespcae> - kind: Group name: <Group name> apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: <role> apiGroup: rbac.authorization.k8s.io
YAML
복사
kind: RoleBinding
특정 네임스페이스에 한정된 정책을 명시하는 파일이다. 라는 뜻
kind: RoleBinding 을 사용하기 위해서는 일단 필요
metadata : 정책을 구분지을 메타데이터 값
namespace : 정책이 적용될 특정 네임스페이스
name : 정책의 이름
subjects : 주체('누가' 또는 어떤 역할)
kind : 주체의 종류 (User, Group, ServiceAccount 중 하나)
name : 주체의 이름
apiGroup : kind가 ServiceAccount이면 "", User나 Group 이면 rbac.authorization.k8s.io
roleRef : 주체에 적용할 정책 목록
kind : 참조할건 정책이므로 Role
name : "kind: Role"의 metadata name.
apiGroup : "kind: Role"을 사용하기 위해서는 필요
요약(Role 파일의 내용)
<ServiceAccout name>라는 서비스 계정(Core API 그룹 소속)은 <role>이라는 Role(rbac.authorization.k8s.io API 그룹 소속)이라는 리소스를 정책으로써 참조한다.
정책을 정리하면 “<role>라는 서비스 계정은 <namespcae>라는 네임스페이스의 pod의 목록을 볼 수 있고, service에 대해서는 변경만 가능하다.” 라는 설정을 할 수 있다.

ClusterRole, ClusterRoleBinding

ClusterRole : 클러스터 전체에 한정된 정책 (클러스터 전체 + '어디서 무엇을 어떻게')
ClusterRoleBinding : 역할이 클러스터 전체에 한정된 정책을 따르도록 적용 (어떤 역할이 클러스터 전체에서 하는가?)
apiVersion: rbac.authorziation.k8s.io/v1 kind: ClusterRole metadata: name: <ClusterRole name> rules: - apiGroups: [""] resources: ["<value>"] verbs: ["<value>", "<value>", "<value>"]
YAML
복사
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: <ClusterRoleBinding name> roleRef: - kind: ClusterRole name: <ClusterRole name> apiGroup: rbac.authorization.k8s.io subjects: - kind: Group name: <Group name> apiGroup: rbac.authorization.k8s.io
YAML
복사
예시본
apiVersion: rbac.authorziation.k8s.io/v1 kind: ClusterRole metadata: name: admin-nginxinc-role rules: - apiGroups: [""] resources: ["pod, service"] verbs: ["get", "edit", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: nginxinc-rolebinding roleRef: - kind: Role name: admin-nginxinc-role apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: nginxinc-admin apiGroup: ""
YAML
복사
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] --- apiVersion: v1 kind: ServiceAccount metadata: name: pod-reader-sa namespace: sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: pod-reader-binding roleRef: kind: ClusterRole name: pod-reader apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: pod-reader-sa namespace: sa
YAML
복사
ClusterRole의 내용
Core API 그룹의 pods 리소스에 대해 get, list, edit 만을 허용한다.
ClusterRoleBinding의 내용
nginxinc-admin이라는 서비스 계정(Core API 그룹 소속)은 admin-nginxinc-role이라는 ClusterRole(rbac.authorization.k8s.io API 그룹 소속)이라는 리소스를 정책으로써 참조한다.
정책을 정리하면 “nginxinc-admin이라는 서비스 계정은 nginxinc라는 클러스터 전체의 pod와 service를 볼 수 있고 수정도 가능하다.” 라는 결론이 나온다.