Role&RoleBindingを利用した権限制御
- 特定のユーザやServiceAccountがアクセスしようとするAPIにアクセス権限を施ぅってい
- 権限あるユーザのみアクセスするようにする
- 権限制御
Role
- どんなAPIを利用できるかの定義
- k8sの利用権限を定義
- 指定した
namespace
のみ有効
ClusterRole
- 全体のnamespaceに対し、権限を与える
RoleBinding
- 利用者、グループまたは、ServiceAccountとRoleを連結
ServiceAccount
- Podと紐づけることでPodからKubernetesAPIを操作できる
チートシート
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-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