LabHub

CRD 와 오퍼레이터 · 오퍼레이터 운영 · 실습

오퍼레이터 설치와 권한 경계 검증

LabHub 에서 이어서 보기

목표

오퍼레이터의 매니페스트 일습(네임스페이스, RBAC, 컨트롤러 Deployment, 리더 선출 Lease)을 올바른 순서로 설치하고, 그 권한이 실제로 의도한 경계 안에 있는지 직접 질의해 증명합니다.

왜 중요한가

오퍼레이터는 클러스터에서 가장 강한 권한을 가진 워크로드일 수 있습니다. 여러 네임스페이스의 리소스를 만들고 고치므로, 그 서비스 어카운트가 탈취되면 공격자가 그 권한을 그대로 갖습니다. 그래서 두 가지가 핵심입니다. 첫째, 설치 순서는 의존성입니다. 컨트롤러는 뜨자마자 자기 타입을 watch 하므로 CRD 가 먼저 있어야 하고, 목록 조회부터 하므로 권한이 먼저 있어야 합니다. 순서가 틀리면 크래시 루프나 403 으로 나타나는데, 원인이 코드가 아니라 배포 순서라는 것을 알아채는 데 시간이 걸립니다. 둘째, 권한은 동사를 줄이는 일입니다. verbs: ["*"] 는 편하지만, 자식 정리를 소유자 참조에 맡기면 delete 조차 필요 없는 경우가 많습니다. 그리고 RBAC 에서 webserviceswebservices/status 는 완전히 다른 리소스입니다 — 이 사실을 모르면 "권한을 줬는데 status 를 못 쓴다"는 증상에 갇힙니다. 마지막으로 권한은 문서가 아니라 검증 대상입니다. kubectl auth can-i --as=되는 것과 되면 안 되는 것을 모두 확인해 두면, 그 표가 곧 권한 경계에 대한 증거가 됩니다.

단계

시작 전 준비: 실습 파드는 실습마다 새로 뜨므로 앞 실습의 클러스터 상태는 남아 있지 않습니다. 2번과 6번이 CRD webservices.apps.labhub.io 를 요구하고 7번·8번의 권한 질의가 crd-lab 네임스페이스를 대상으로 하므로, kubectl get crd webservices.apps.labhub.io 가 비어 있으면 CRD 를 다시 적용하고 kubectl create ns crd-lab 도 하세요. CRD 는 v1alpha1v1 두 버전을 가져야 하고 저장 버전은 v1 이어야 합니다(6번이 그 보존을 검사합니다).

1. 네임스페이스 labhub-operator 를 만들고 라벨 app.kubernetes.io/part-of=labhub-operatorpod-security.kubernetes.io/enforce=restricted 를 붙이세요.
2. /root/op/install/out/install-order.txt 에 설치 순서를 한 단계당 한 줄로 적으세요. 1번 줄은 CustomResourceDefinition, 2번 줄은 ServiceAccountClusterRole/ClusterRoleBinding, 3번 줄은 Deployment 를 언급해야 하며, 앞 줄에서 Deployment컨트롤러 라는 낱말을 미리 쓰지 마세요(순서 판정이 첫 등장 줄을 기준으로 합니다). CRD webservices.apps.labhub.io 도 클러스터에 있어야 합니다.
3. labhub-operator 에 ServiceAccount webservice-controller 를 만들고, ClusterRole webservice-controller 를 다음 규칙으로 만드세요.

참고

단계 8개

  1. 오퍼레이터 전용 네임스페이스 만들기
  2. 설치 순서 정리하기
  3. 와일드카드 없는 최소권한 만들기
  4. 컨트롤러 Deployment 작성하기
  5. 리더 선출 임차 만들기
  6. 이미지 올리고 CRD 버전 보존 확인하기
  7. 고장난 오퍼레이터 매니페스트 고치기
  8. 권한 경계 검증표 만들기