반응형
참고 : https://kubernetes.io/docs/reference/access-authn-authz/rbac/
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 |