CKA試験、Role&RoleBinding

# Role&RoleBindingを利用した権限制御

- 特定のユーザやServiceAccountがアクセスしようとするAPIにアクセス権限を施ぅってい
- 権限あるユーザのみアクセスするようにする
- 権限制御

## Role
- どんなAPIを利用できるかの定義
- k8sの利用権限を定義
- 指定した`namespace`のみ有効

## ClusterRole
- 全体のnamespaceに対し、権限を与える

## RoleBinding
- 利用者、グループまたは、ServiceAccountとRoleを連結

## ServiceAccount
- Podと紐づけることでPodからKubernetesAPIを操作できる

![스크린샷 2023-02-23 17.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961840/a5cd0071-1531-1612-8241-fb73874dc81e.png)

## チートシート
https://kubernetes.io/docs/reference/access-authn-authz/rbac/#role-and-clusterrole

---
# Role&RoleBindingの問題1
アプリケーションを運営中、特定namespaceのPodたちをモニタリングするサービスが要求されました
`api-access` namespaceのすべてのPodをViewできるように次の作業を進みなさい

```
 - 'api-access'という新しいnamespaceに、'pod-viewer'という名前をもつ、ServiceAccountを作成する
 - 'podreader-role'という名前をもつRoleと、'podreader-rolebinding'という名前をもつRoleBindingを作成する
 - 上記の生成した、ServiceAccountをAPI resource Podに対し、'watch','list','get'を許容するようにマッピングする
```

### 1. namespaceを作成する
```
kubectl create namespace api-access
```

### 2. ServiceAccountを作成する
```
kubectl create serviceaccount pod-viewer --namespace api-access
kubectl get serviceaccounts --namespace api-access
```

### 3. Role作成
```
kubectl create role podreader-role --verb=get,list,watch  --resource=pods --namespace api-access 
kubectl get role --namespace api-access
```

### 4. RoleBinding作成
```
kubectl create rolebinding podreader-rolebinding --role=podreader-role --serviceaccount=api-access:pod-viewer --namespace=api-access
kubectl get rolebindings --namespace=api-access
```

上記の`pod-viewer`というServiceAccountを持つPodはapi-access配下で動作しているすべてのPodに対し、`get,list,watch`という動作ができる

---

# Role&RoleBindingの問題2

作業してるContextで、アプリケーションリリースのため、新しいClusterRoleを作成し、特定namespaceのServiceAccountをマッピングしなさい

```
- 次のリソースタイプのみ'Create'が許容したClusterRole'deployment-clusterrole' 
  Resource Type: Deployment StatefulSet DaemonSet
- Role&RoleBindingの問題1で作成したnamespace'api-access'に、'cicd-token'というServiceAccountを作成します
- ClusterRole'deployment-clusterrole'をnamespace'api-access'のみ制限した新しいServiceAccount'cicd-token'にマッピングします
```

### 1. cluster role`deployment-clusterrole`を作成する
```
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployment,statefulSet,daemonSet
```

### 2. ServiceAccount`cicd-token`を作成する(`api-access`namespaceに動作)
```
kubectl create account cicd-token --namespace=api-access  
```

### 3. ClusterRoleBinding作成
> 名前の話がないと、自分で決めていい
```
kubectl create rolebinding myapp-view-binding --clusterrole=deployment-clusterrole --serviceaccount=api-access:cicd-token
```

`api-access`配下にある`cicd-token`を持つPodがk8s全体に対し、`deployment,statefulSet,daemonSet`を`Create`できる権限を持つ

---

# Role&RoleBindingの問題3

CSRを利用した`app-manager`認証書を発給したユーザ`app-manager`に、Cluster内部のすべてのnamespaceの`deployment, pod, service`リソ酢を`create list get update delete`できる権限を与えてください

### 1. user作成
 - certificate name: app-manager
csrファイル作成
```
openssl genrsa -out app-manager.key 2048
openssl req -new -key app-manager.key -out app-manager.csr -subj "/CN=app-manager"
```


```
cat app-manager.csr | base64 | tr -d "\n"
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1d6Q0NBVU1DQVFBd0ZqRVVNQklHQTFVRUF3d0xZWEJ3TFcxaGJtRm5aWEl3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM1TTk0Zm53d2pHOXNVdzFabjFNcjhHd0k2SUtrL2NjVzlyVFZ6ClRrU2UybFN6c1ZCZFJKaVBkbGk1VlF3cWVwTWVuVjVUSHNLWmdSK3FoUzBoZkVlTjZVWWd5TVo2SUZsSk9hTTIKNkRERmp1WkVrT1h6WFFpWWorWEdFdEN5aE1VbFdDQ3Y0WUJXSHZPak9jQUF4RmtySkM2TDZxM2xRbHByNERvYgpZMU4rQjNkQnV6R05vWngvMExxU1RiRUplM3hhVENxY1liQUZGSlFJUFg5bit1Y3ZvT2h4Qko3M3JJSC9ON0NZCk16SUF6RXlOM2V4SWZ4dkxEQ0dVUGFGTGllZjd4VnFJeHdPZjZSTzRJY2Jhdmk1MmVoaS9rRklOSVdYZThzN28KamZubFJrMmppUXFmT3hoQmwrRzQxN05JdWVmdkJvK1BEZDBwYmluN2kvQ0tRcXRUQWdNQkFBR2dBREFOQmdrcQpoa2lHOXcwQkFRc0ZBQU9DQVFFQVhoMWJmY2Y0ZG03QTVqYnBoOW9XWm1LOFBFTFhaTVdhdE9kQnF0NHBjMTB0CkFrK2RUU3ZxNVozRUE2RUwxWkFiSDlLLzl4SnpydnczYm5maHhtUDFsaGpRdStkNkZVZzFyN1hsd2FwZFF5R3QKTWpSUE9RdXkwODZYb0dZc2lhTCs0elVZYm95N3IzNC9LdEEraFMyRXZPUlVaNllOZStWSVhQTjhnYVhYOEtxagpoUDFIR0Y5bnhhc1NCSnRTN0hXMjlOOFJZWFpIaUg5VjZLdzA3M3k4Z1R3a1FqV3YwQ2lJS2pPdkhCTDNVODk3ClN1QUZMZHBCd2hOQUpTb3BLNGQvamZuOWtTRkQ4NFNNeHN0KytURWZCdTlIcDdWdk50d2w3alF4ZWJmL1dDUlUKRWhoTW1ZWVYyUnpRRVIzc1I2c0xUbjRWL2tVUGJYd1ZEbDhZcmRGekt3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==
```
上記の出力されたことをコピする
↓コピペー
```
vi app-manager.yaml
```

app-manager.yamlを開いて、下の文書をコピペー
```
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: app-manager
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1d6Q0NBVU1DQVFBd0ZqRVVNQklHQTFVRUF3d0xZWEJ3TFcxaGJtRm5aWEl3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM1TTk0Zm53d2pHOXNVdzFabjFNcjhHd0k2SUtrL2NjVzlyVFZ6ClRrU2UybFN6c1ZCZFJKaVBkbGk1VlF3cWVwTWVuVjVUSHNLWmdSK3FoUzBoZkVlTjZVWWd5TVo2SUZsSk9hTTIKNkRERmp1WkVrT1h6WFFpWWorWEdFdEN5aE1VbFdDQ3Y0WUJXSHZPak9jQUF4RmtySkM2TDZxM2xRbHByNERvYgpZMU4rQjNkQnV6R05vWngvMExxU1RiRUplM3hhVENxY1liQUZGSlFJUFg5bit1Y3ZvT2h4Qko3M3JJSC9ON0NZCk16SUF6RXlOM2V4SWZ4dkxEQ0dVUGFGTGllZjd4VnFJeHdPZjZSTzRJY2Jhdmk1MmVoaS9rRklOSVdYZThzN28KamZubFJrMmppUXFmT3hoQmwrRzQxN05JdWVmdkJvK1BEZDBwYmluN2kvQ0tRcXRUQWdNQkFBR2dBREFOQmdrcQpoa2lHOXcwQkFRc0ZBQU9DQVFFQVhoMWJmY2Y0ZG03QTVqYnBoOW9XWm1LOFBFTFhaTVdhdE9kQnF0NHBjMTB0CkFrK2RUU3ZxNVozRUE2RUwxWkFiSDlLLzl4SnpydnczYm5maHhtUDFsaGpRdStkNkZVZzFyN1hsd2FwZFF5R3QKTWpSUE9RdXkwODZYb0dZc2lhTCs0elVZYm95N3IzNC9LdEEraFMyRXZPUlVaNllOZStWSVhQTjhnYVhYOEtxagpoUDFIR0Y5bnhhc1NCSnRTN0hXMjlOOFJZWFpIaUg5VjZLdzA3M3k4Z1R3a1FqV3YwQ2lJS2pPdkhCTDNVODk3ClN1QUZMZHBCd2hOQUpTb3BLNGQvamZuOWtTRkQ4NFNNeHN0KytURWZCdTlIcDdWdk50d2w3alF4ZWJmL1dDUlUKRWhoTW1ZWVYyUnpRRVIzc1I2c0xUbjRWL2tVUGJYd1ZEbDhZcmRGekt3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
```

yamlファイルを適応する
```
kubectl apply  -f app-manager.yaml
certificatesigningrequest.certificates.k8s.io/app-manager created
```

上記のファイルを確認する
```
kubectl get csr
NAME          AGE     SIGNERNAME                            REQUESTOR          REQUESTEDDURATION   CONDITION
app-manager   4m27s   kubernetes.io/kube-apiserver-client   kubernetes-admin   <none>              Pending
```

承認を要求する
```
kubectl certificate approve app-manager
certificatesigningrequest.certificates.k8s.io/app-manager approved

kubectl get csr
NAME          AGE     SIGNERNAME                            REQUESTOR          REQUESTEDDURATION   CONDITION
app-manager   6m17s   kubernetes.io/kube-apiserver-client   kubernetes-admin   <none>              Approved,Issued
```

認証を作成する
```
kubectl get csr app-manager -o jsonpath='{.status.certificate}'| base64 -d > app-manager.crt
```


app-manager.crt 認証書を利用するユーザを作成する
 - user name: app-manager




### 2. clusterrole作成
 - clusterRole name: app-access

```
kubectl create clusterrole app-access --verb=create,list,get,update,delete --resource=pods,deployment,service
clusterrole.rbac.authorization.k8s.io/app-access created
```

```
kubectl get clusterrole app-access
NAME         CREATED AT
app-access   2023-02-23T15:35:09Z
```

### 3. clusterrolebinding作成
 - clusterRoleBinding name: app-access-binding
```
kubectl create clusterrolebinding app-access-binding --clusterrole=app-access --user=app-manager
clusterrolebinding.rbac.authorization.k8s.io/app-access-binding created
```

```
kubectl get clusterrolebindings app-access-binding
NAME                 ROLE                     AGE
app-access-binding   ClusterRole/app-access   29s
```



---
2023/04/20
誤記があり、修正しました

## 修正前
### 4. RoleBinding作成
```
kubectl create rolebinding podreader-rolebinding --role=podviewer-role --serviceaccount=api-access:pod-viewer --namespace=api-access
kubectl get rolebindings --namespace=api-access
```

## 修正後

### 4. RoleBinding作成
```
kubectl create rolebinding podreader-rolebinding --role=podreader-role --serviceaccount=api-access:pod-viewer --namespace=api-access
kubectl get rolebindings --namespace=api-access
```
---