0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CKA試験、Role&RoleBinding

Last updated at Posted at 2023-02-23

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

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

Role

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

ClusterRole

  • 全体のnamespaceに対し、権限を与える

RoleBinding

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

ServiceAccount

  • Podと紐づけることでPodからKubernetesAPIを操作できる

스크린샷 2023-02-23 17.19.33.png

チートシート


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 roledeployment-clusterroleを作成する

kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployment,statefulSet,daemonSet

2. ServiceAccountcicd-tokenを作成する(api-accessnamespaceに動作)

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,daemonSetCreateできる権限を持つ


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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?