RBAC 인증

장동민·2022년 7월 26일
0

CKA 자격증 준비

목록 보기
3/13

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을 허용하도록 매핑하시오.
  1. 작업 클러스터가 k8s임을 확인

  1. namespace가 api-access인 것을 생성

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

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

  1. 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에 바인딩합니다.
  1. 작업 클러스터가 k8s임을 확인

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

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

  1. 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 노드에서 실행

  1. app-manager 인증서 생성을 위한 PKI 개인 키와 CSR을 생성 후 확인

✍ CSR : 인증서를 요청해주는 파일

  1. yaml 형태의 파일을 만들어 CertificateSigningRequest 생성

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

📌 request 고유 키를 가져와 조회

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

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

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

  1. app-manager 인증서 서명 요청 승인 후 확인

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

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

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

✍ 부가적인 설정

  1. app-manager 사용자를 kubeconfig 파일에 추가 후 확인

  1. 컨텍스트를 추가 후 확인

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

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

profile
나만의 데이터베이스

0개의 댓글