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
◦
특정 네임스페이스에 한정된 정책을 명시하는 파일이다. 라는 뜻
•
apiVersion: rbac.authorization.k8s.io/v1
◦
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
◦
특정 네임스페이스에 한정된 정책을 명시하는 파일이다. 라는 뜻
•
apiVersion: rbac.authorization.k8s.io/v1
◦
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를 볼 수 있고 수정도 가능하다.” 라는 결론이 나온다.