참고 : https://kubernetes.io/docs/reference/access-authn-authz/rbac/
Using RBAC Authorization
Role-based access control (RBAC) is a method of regulating access to computer or network resources based on the roles of individual users within your organization. RBAC authorization uses the rbac.authorization.k8s.io API group to drive authorization decis
kubernetes.io
Role-based access control(RBAC. 역할기반 액세스 제어)
User나 Service Account가 쿠버네티스 API를 사용하기 위한 인증과 권한확인 방식
아래 그림처럼 User나 ServiceAccount와 Role을 Role Binding으로 연결하는 형태
User : 클러스터 외부에서 쿠버네티스를 조작하는 사용자 인증
Service Account : Pod가 쿠버네티스 API를 다룰 때 사용하는 계정
예제1. ServiceAccount, Role, RoleBinding
- api-access라는 namespace 생성
- api-access에서 pod-viewer라는 Service Account 생성
- podreader-role이라는 Role 생성
- podreader-rolebinding이라는 RoleBinding을 생성.
- 생성한 ServiceAccount를 API resource Pod에 대하여 watch, list, get을 허용하도록 매핑하시오.
Namespace 생성
kubectl create namespace api-access
Service Account 생성
kubectl create serviceaccount pod-viewer -n api-access
#확인
kubectl get serviceaccounts --namespace api-access
Role 생성
kubectl create role podreader-role --verb=watch --verb=list --verb=get --resource=pods --namespace api-access
Role Binding생성 (매핑)
kubectl create rolebinding podreader-rolebinding --role=podreader-role --serviceaccount=api-access:pod-viewer -n api-access
매핑 확인
kubectl describe -n api-access rolebindings.rbac.authorization.k8s.io podreader-rolebinding
예제2. User, Role, RoleBinding
참고 https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#normal-user
- CSR(Certificate Signing Request)를 통해 app-manager 인증서를 발급(certificate)
- app-manager라는 User생성
- app-access이라는 Role 생성
- app-access-binding이라는 RoleBinding을 생성.
- 생성한 User를 API resource deployment, pod, service에 대하여 create, list, get, update, delete을 허용하도록 매핑하시오.
인증서 생성
openssl genrsa -out app-manager.key 2048
openssl req -new -key app-manager.key -out app-manager.csr -subj "/CN=app-manager"
**name과 request 수정 필요
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: app-manager
spec:
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1d6Q0NBVU1DQVFBd0ZqRVVNQklHQTFVRUF3d0xZWEJ3TFcxaGJtRm5aWEl3Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNjRGxHbGpMbWdITHZIWmQvVGNxUFQ1MFJOak1jODdYZDcxeDduCkxDK3VQUnI0bEIxSzUwWmJZVVRqMjNBMnRjZG5xSFJzclZ5ZHRiUTFHcEJYdkJ1eEl1amlMTW4zd2Nlc2lzdmsKT254NGZnUkw1TThjSm95YU1INmpBQUh6MGIwZWVnZW5SN1VYQW5ZWDlXek1YRngzaWFKb0s3NE03Y2ZWbmdTNQpEZmprcFMzaTRxYUpBOEZKWGRZT1RkOWgrSFVWVWdWdGZsSHpOdUs3NDBqUUVWZk81WUdDWFpxa0Q0ZWlPQlk0CnlVbDVFaGFOaGN0T1N1eHdncHp4Um8zQlJpOGRSRWxKbUhudVYzNk5pd0I4MkM4NjFzczB2SjZJaEZ4djR3L1YKL1krN3RHdGtVZjN6STNuNTRsdVRxd3hSdmk0WEJyZ1h6SW5kcVNReUZwZVBDdE5oQWdNQkFBR2dBREFOQmdrcQpoa2lHOXcwQkFRc0ZBQU9DQVFFQWo3ZHp6eFNBUFllWHVWWGovV1FXeTBUelloMkUrdVFkSU52dERUWHdRY0J4ClR5eUVabHJBR3F6UTZwbmY3ME04WU81M3RIWEhydGM1K0JrRkhpTmZONkxsV1d2cDI0bnBCOENyMkV3Z3A0MngKWE53azhZeHprSnhXS1REaVUvYmtCQUZ0eUhZSU5WQ1FHN1QxcWVtOFpERmNMOXlBR25zRTc5ai80RUpGckhxagpMajVhSFBBUmhCR2RFWG1ERTk3QStpN3M5RU1jT0Y0RmdmRDZDWVBkV2RoZ1BtdWtRMW9hV0NKQ1ZGZURrcElTCkVUZU8vMWpvWkNDM1JwNTBtWUJmblI4SVZPYzFmOXJmR1JLVDJaVjF5N2dEclhqdDBqaFRialBjMFlGN3F2Ni8KdkpiM1dBSFlPVDJWYlVweG12bEFVYWdXRTRiK0Q1MzFYdGJmUEZNY0J3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 86400 # one day
usages:
- client auth
EOF
name은 인증서 이름, request는 아래 명령어로 생성 (위에서 생성한 csr에서 추출)
cat app-manager.csr | base64 | tr -d "\n"
# 확인
kubectl get csr
# CSR을 승인
kubectl certificate approve app-manager
# CSR에서 인증서 저장
kubectl get csr/app-manager -o yaml
# CertificateSigningRequest에서 발급된 인증서를 내보내기
kubectl get csr app-manager -o jsonpath='{.status.certificate}'| base64 -d > app-manager.crt
Cluster Role 생성
kubectl create clusterrole app-access --verb=create,list,get,update,delete --resource=deployment,pod,service
Cluster Role Binding생성
kubectl create clusterrolebinding app-access-binding --clusterrole=app-access --user=app-manager
#확인
kubectl describe clusterrolebinding app-access-binding
인증서를 사용하는 유저 등록(Add to kubeconfig)
# 자격 증명 추가
kubectl config set-credentials app-manager --client-key=app-manager.key --client-certificate=app-manager.crt --embed-certs=true
# 컨텍스트를 추가
kubectl config set-context app-manager --cluster=kubernetes --user=app-manager
# 컨텍스트 변경
kubectl config use-context app-manager
권한 확인
우리가 만든 app-manager은 persistentvolume 리소스의 get 권한이 없기 때문에 조회 안됨.
원래 컨텍스트로 다시 변경
kubectl config use-context kubernetes-admin@kubernetes
끝.
Thank you!
'Tools > Kubernetes' 카테고리의 다른 글
[CKA 도전 시리즈] 7. Deployment (0) | 2023.01.19 |
---|---|
[CKA 도전 시리즈] 6. Pod (0) | 2023.01.17 |
[CKA 도전 시리즈] 4. kubernetes upgrade (0) | 2023.01.12 |
[CKA 도전 시리즈] 3. ETCD backup & restore (0) | 2023.01.09 |
[CKA 도전 시리즈] 2. 쿠버네티스 아키텍처 (시험환경) (0) | 2023.01.07 |