RBAC(Role Based Access Control)について

## 図

RBACでは、どんな操作を許可するのかを定義したRoleを作成し、Service AccountやUserに対してRoleを紐づけることで権限を管理する。

RBACには、Namespaceレベルのリソースと、Clusterレベルのリソースの二種類がある。

具体的には、RoleとCluster Role、Role BindingとCluster Role Binding。

![スクリーンショット 2022-01-29 11.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/ae579987-f185-67a2-0e9f-d5160e674e51.png)

## Commandで理解

```yaml
kubectl describe pod kube-apiserver-controlplane -n kube-system 
## 一部抜粋
    Command:
      kube-apiserver
      --authorization-mode=Node,RBAC
```

``--authorization-mode=Node,RBAC``

をつけてAPI serverを起動することで、RBACを有効化する。

```yaml
## 全てのNamespaceのRoleを見る
kubectl get roles --all-namespaces 
## 一部抜粋
NAMESPACE     NAME                                             CREATED AT
blue          developer                                        xxxxx
kube-system   kube-proxy                                       xxxxx
```

```yaml
## kube-system名前空間のkube-proxyが、configmapsにGetできるとわかる。
kubectl describe role kube-proxy -n kube-system
Name:         kube-proxy
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources   Non-Resource URLs  Resource Names  Verbs
  ---------   -----------------  --------------  -----
  configmaps  []                 [kube-proxy]    [get]
```

```yaml
## kube-proxy roleは、Group:system:bootstrappers:kubeadm:default-node-token　に紐づけられているとわかる。
kubectl describe rolebinding kube-proxy -n kube-system  
Name:         kube-proxy
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  Role
  Name:  kube-proxy
Subjects:
  Kind   Name                                             Namespace
  ----   ----                                             ---------
  Group  system:bootstrappers:kubeadm:default-node-token  
```

```yaml
## 権限のないユーザーは、Listすることができない。
kubectl get pods --as dev-user
Error from server (Forbidden): pods is forbidden: User "dev-user" cannot list resource "pods" in API group "" in the namespace "default"
```

## Role(Role Binding) 作成

```yaml
## Command で作成する場合
kubectl create role developer --namespace=default --verb=list,create,delete --resource=pods
role.rbac.authorization.k8s.io/developer created

kubectl create rolebinding dev-user-binding --namespace=default --role=developer --user=dev-user
rolebinding.rbac.authorization.k8s.io/dev-user-binding created
```

```yaml
## YAML使用の場合

## Role
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: blue
  name: deploy-role
## Roleでは、以下Ruleの3 sectionsを指定する。
## なお、複数作成することも可能。podにGetできる権限を与えて、もう１つのRuleでは、ConfigをCreateできる権限を与えるなど。
rules:
- apiGroups: ["apps", "extensions"]
  resources: ["deployments"]
  verbs: ["create"]

## RoleBinding
## Role（deploy-role）とUser（dev-user）を紐づけている。
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dev-user-deploy-binding
  namespace: blue
## Userの詳細を記載。
subjects:
- kind: User
  name: dev-user
  apiGroup: rbac.authorization.k8s.io
## 上記で記載したRole（deploy-role）を記載する。
roleRef:
  kind: Role
  name: deploy-role
  apiGroup: rbac.authorization.k8s.io
```

## 参考

```
https://kubernetes.io/docs/reference/access-authn-authz/node/
https://unofficial-kubernetes.readthedocs.io/en/latest/admin/authorization/rbac/
https://www.cncf.io/blog/2020/08/28/kubernetes-rbac-101-authorization/
https://snyk.io/blog/snyk-at-snyk-enabling-kubernetes-rbac-for-snyks-developers/
https://support.huaweicloud.com/intl/en-us/usermanual-cce/cce_01_0189.html
Kubernetes完全ガイド (impress top gear)
https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/
```

参考にさせていただきました。ありがとうございます。

## 備考

何か間違っている記載ありましたら教えていただけると嬉しいです。