- API 인증요청
- 일반 사용자(Human User) 또는 그룹(Group)
- 클러스터 외부에서 K8s를 조작하는 사용자로, 다양한 방법으로 인증을 거친다.
- Kubernetes-admin
- K8s의 모든 권한을 소유한 유저
- serviceAccount
- K8s 내부적으로 관리되며 Pod가 K8s API를 다룰 떄 사용하는 계정
- Pod가 실행될 때 ServiceAccount를 설정하지 않으면 같은 namespace에 default라는 serviceAccount가 할당됨
- 일반 사용자(Human User) 또는 그룹(Group)
- Authentication(인증)
- user 또는 application이 API에 접근을 허가 받는 과정
- 인증방식: 클라이언트 인증서, bearer token, HTTP 기본인증 지원
- Authorization(인가)
- RBAC 모델기반
- 요청 ID에 적절한 role이 있는지 확인
- Adminssion Control
- 요청이 올바른 형식인지 판별
- 요청이 처리되기 전에 수정사항을 잠재적으로 적용
~/.kube/config 파일분석
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTi #..생략
server: https://192.168.1.10:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDR #..생략
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJV #..생략
- cluster.server : 외부에서 쿠버네티스 API에 접근할 주소 설정
- name : cluster 이름
- context.cluster : 접근할 클러스터 설정
- context.user : 접근할 사용자 그룹이 누구인지 설정
- user.client-certificate-data : 클라이언트 인증에 필요한 해시값을 설정
- user.client-key-data : 클라이언트 key 해시값을 설정
User 생성 테스트
https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#normal-user
Certificate Signing Requests
FEATURE STATE: Kubernetes v1.19 [stable] The Certificates API enables automation of X.509 credential provisioning by providing a programmatic interface for clients of the Kubernetes API to request and obtain X.509 certificates from a Certificate Authority
kubernetes.io
Private key 생성
openssl genrsa -out myuser.key 2048
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuse"
유저등록

- # cat myuser.csr | base64 | tr -d "\n"
csr파일을 base64로 인코딩한 문자열을 아래 yaml파일의 request에 추가합니다.
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: myuser
spec:
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFV #..생락
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth

- # kubectl apply -f ./myuser.yaml
- 유저 생성
- # kubectl certificate approve myuser
- 유저 승인
- # kubectl get csr myuser -o yaml
- myuser의 인증서 정보 표시
Service Account 생성
apiVersion: v1
kind: Pod
metadata:
labels:
run: webserver
name: webserver
spec:
containers:
- image: nginx
name: webserver
serviceAccount: get-pod

- # kubectl create serviceaccount get-pod
- serviceaccount 생성
- 위에서 생성한 serviceaccount를 Pod에 적용
권한관리
- Role
- 어떤 API를 사용할 수 있는지 권한정의, 지정된 네임스페이스에서만 유효
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
- apiGroups
- role이 사용할 API group
- Pod는 코드 API이기 때문에 apiGroups를 따로 지정하지 않는다, 만약 리소스가 job이라면 "batch"를 지정
- resources
- pods, deployments, services 등 사용할 API resource들을 명시
- verbs
- 나열된 API 리소스에 허용할 기능 나열
- RoleBinding
- Role과 유저를 연결

- # kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
- role 생성
- # kubectl create rolebinding developer-binding-my-user --role=developer --user=myuser
- role binding
- # kubectl config set-credentials myuser --client-key=myuser.key --client-certificate=myuser.crt --embed-certs=true
- user를 config에 등록
- # kubectl config set-context myuser --cluster=kubernetes --user=myuser
- user의 context 등록
- # kubectl config use-context myuser
- 현재 작업 context를 myuser로 변경
- ClusterRole & ClusterRoleBinding
- ClusterRole
- 특정 네임스페이스 사용 권한이 아닌 클러스터 전체 사용 권한을 관리
- ClusterRole
kubectl create clusterrole developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
kubectl create clusterrolebinding developer-binding-myuser --clusterrole=developer --user=myuser
'클라우드 > K8s' 카테고리의 다른 글
| K8s DNS (0) | 2022.04.03 |
|---|---|
| K8s volume (0) | 2022.04.03 |
| Pod 스케줄링 (0) | 2022.04.03 |
| K8s Secret (0) | 2022.03.31 |
| K8s Configmap (0) | 2022.03.31 |