1. API 인증 : RBAC(Role-based access control. 역할기반 액세스 제어)
- API 서버에 접근하기 위해서는 인증작업 필요
- 사용자의 역할에 따라 리소스에 대한 접근 권한을 가짐
- User : 클러스터 외부에서 쿠버네티스를 조작하는 사용자 인증
- Service Account : Pod가 쿠버네티스 API를 다룰 때 사용하는 계정
2. Role & RoleBinding을 이용한 권한 제어
- 특정 유저나 ServiceAccount가 접근하려는 API에 접근 권한을 설정
- 권한 있는 User만 접근하도록 허용
- Role
- 어떤 API를 이용할 수 있는지의 정의
- 쿠버네티스의 사용권한을 정의
- 지정된 네임스페이스에서만 유효
- RoleBinding
- 사용자/그룹 또는 Service Account와 Role을 연결
3. Role
- 어떤 API를 사용할 수 있는지의 권한 정의, 지정된 네임스페이스에서만 유효
- Role 예제(default 네임스페이스의 Pod에 대한 get, watch, list 할 수 있는 권한)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
verbs: ["get", "watch", "list"]
- Pod는 코어 API이기 때문에 apiGroups를 따로 지정하지 않음. 만약 리소스가 job이라면 apiGroups에 "batch"를 지정
- resources에는 pods, deployments, services 등 사용할 API resource들을 명시
- verbs에는 단어 그대로 나열된 API 리소스에 허용할 기능을 나열
4. RoleBinding
- 사용자/그룹 또는 Service Account와 role을 연결
- RoleBinding 예제(default 네임스페이스에서 유저 dev-ops에게 pod-reader의 role을 할당)
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: dev-ops
apiGroups: rbac.authorization.k8s.io
[유저 dev-ops에게 앞서 정의한 pod-reader의 role을 할당]
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
[앞서 정의한 Role을 명세, apiGroup에는 rbac api를 사용하기 때문에 rbac.authorization.k8s.io로 설정]
5. ClusterRole
- 어떤 API를 사용할 수 있는지 권한 정의, 클러스터 전체(전체 네임스페이스)에서 유효
- ClusterRole 예제(전체 네임스페이스의 Secret에 대한 get, watch, list 할 수 있는 권한)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "watch", "list"]
6. ClusterRoleBinding
- 사용자/그룹 또는 Service Account와 role을 연결
- ClusterRoleBinding 예제(manager 그룹의 모든 사용자가 모든 네임스페이스의 Secret을 읽을 수 있도록 구성)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-secrets-global
subjects:
- kind: Group
name: manager
apiGroup: rbac.authorization.k8s.io (manager 그룹)
roleRef:
kind: ClusterRole
name: secret-reader
apiGroup: rbac.authorization.k8s.io (ClusterRole)
※ 문제1: ServiceAccount, Role, RoleBinding
(참고 URL : https://kubernetes.io/docs/reference/access-authn-authz/rbac/#kubectl-create-role)
- 작업 클러스터 : k8s
- 애플리케이션 운영중 특정 namespace의 Pod들을 모니터할수 있는 서비스가 요청되었습니다. api-access 네임스페이스의 모든 pod를 view할 수 있도록 다음의 작업을 진행하시오.
- api-access라는 새로운 namespace에 pod-viewer라는 이름의 Service Account를 만듭니다.
- podreader-role이라는 이름의 Role과 podreader-rolebinding이라는 이름의 RoleBinding을 만듭니다.
- 앞서 생성한 ServiceAccount를 API resource Pod에 대하여 watch, list, get을 허용하도록 매핑하시오.
- 작업 클러스터가 k8s임을 확인

- namespace가 api-access인 것을 생성

- namespace에 pod-viewer라는 이름의 Service Account를 만든 후 확인

- podreader-role이라는 이름의 Role을 만든 후 확인

- podreader-rolebinding이라는 이름의 RoleBinding을 만든 후 확인

※ 문제2: ServiceAccount, ClusterRole, ClusterRoleBinding
(참고 URL : https://kubernetes.io/docs/reference/access-authn-authz/rbac/#kubectl-create-role)
- 작업 클러스터 : k8s
- 작업 Context에서 애플리케이션 배포를 위해 새로운 ClusterRole을 생성하고 특정 namespace의 ServiceAccount를 바인드하시오.
- 다음 resource type에서만 Create가 허용된 ClusterRole deployment-clusterrole을 생성합니다.
Resource Type: Deployment, StatefulSet, DaemonSet
- 미리 생성된 namespace api-access에 cicd-token이라는 새로운 ServiceAccount를 만듭니다.
- ClusterRole deployment-clusterrole을 namespace api-access로 제한된 새 ServiceAccount cicd-token에 바인딩합니다.
- 작업 클러스터가 k8s임을 확인

- Deployment, StatefulSet, DaemonSet리소스 타입에서만 Cretae가 허용된 deployment-clusterrole이름을 가진 ClusterRole 생성 후 확인


- 미리 생성된 namespace api-access에 cicd-token이라는 새로운 ServiceAccount을 만든 후 확인

- ClusterRole deployment-clusterrole을 namespace api-access로 제한된 새 ServiceAccount cicd-token에 바인딩 후 확인

※ 문제3: User, ClusterRole, ClusterRoleBinding
(참고 URL : https://kubernetes.io/docs/reference/access-authn-authz/certificate-signing-requests/#normal-user)
- 작업 클러스터: k8s
- CSR(Certificate Signing Request)를 통해 app-manager 인증서를 발급받은 user app-manager 에게 cluster내 모든 namespace의 deployment, pod, service 리소스를 create, list, get, update, delete 할 수 있는 권한을 할당하시오.
- user name : app-manager
- certificate name : app-manager
- clusterRole name : app-access
- clusterRoleBinding name : app-access-binding
-> master 노드에서 실행
- app-manager 인증서 생성을 위한 PKI 개인 키와 CSR을 생성 후 확인

✍ CSR : 인증서를 요청해주는 파일
- yaml 형태의 파일을 만들어 CertificateSigningRequest 생성

2-1. request 고유 키를 가져와 yaml 형태의 파일 수정
📌 request 고유 키를 가져와 조회

📌 yaml 형태의 파일을 편집하여 수정

2-2. 수정한 yaml 형태의 파일 적용하여 app-manager 인증서 요청 후 확인

-> CONDITION이 "Pending" 상태이므로 app-manager 인증서 서명 요청 승인이 필요
- app-manager 인증서 서명 요청 승인 후 확인

- CertificateSigningRequest에서 발급된 인증서를 내보낸 후 확인

- 이름이 app-access이고, deployment, pod, service 리소스를 create, list, get, update, delete 할 수 있는 ClusterRole을 생성 후 확인

- user가 app-manager인 ClusterRole을 app-access-binding 이름으로 바인딩

✍ 부가적인 설정
- app-manager 사용자를 kubeconfig 파일에 추가 후 확인

- 컨텍스트를 추가 후 확인

- 컨텍스트를 app-manager로 변경한 뒤 테스트

📌 replicaset 조회 시 승인 거부 되는 것을 알 수 있음(접근 가능 리소스 : deployment, pod, service)
