해당 스터디는 90DaysOfDevOps
https://github.com/MichaelCade/90DaysOfDevOps
를 기반으로 진행한 내용입니다.
Day 6 - Kubernetes RBAC with Ansible
역할 기반 접근 제어 (Role-Based Access Control, RBAC)은, 쿠버네티스만의 기술이 아닌, 1970년대부터 시작된 오랫동안 검증된 컴퓨터 보안 개념이다.
핵심 아이디어는 '사용자' 개인이 아닌 '역할 (Role)'에 기반하여 권한을 부여하는 것이다.
Verizon의 보고서에 따르면 데이터 유출의 82%가 사람의 실수와 관련이 있으며, 부적절한 권한 관리가 주된 원인 중 하나였다고 한다.
따라서, RBAC은 이러한 인적 오류로 인한 보안 사고를 예방하는 데 결정적인 역할을 하고 있다.
쿠버네티스는 버전 1.6부터 RBAC을 표준 인가 (Authorization) 방식으로 도입하였으며, 네가지 핵심 객체를 통해 작동한다.
추가적으로, RBAC은 선택적 기능이며, EKS나 AKS 등 Managed Cloud 제공업체의 배포판에는 해당 기능이 켜진 상태로 제공된다.
$ kubectl api-versions | grep rbac.authorization.k8s.io/v1
해당 명령어를 통해, RBAC이 활성화되어있는지 확인할 수 있다.
만약 RBAC이 활성화되어있지 않다면 쿠버네티스 API 서버에서
$ kube-apiserver --authorization-mode=RBAC
플래그를 사용하여 활성화할 수 있다.
1. Role (역할)
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: role-dev
rules:
- apiGroups: ["", "apps"]
resources: ["pods", "deployments"]
verbs: ["get", "list", "edit"]
2. ClusterRole (클러스터 역할)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-resource-reader
rules:
- apiGroups: [""] # 코어(core) API 그룹
resources: ["nodes", "persistentvolumes", "namespaces"]
verbs: ["get", "list", "watch"]
3. RoleBinding (역할 연결)
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: dev-rolebinding
namespace: default
subjects:
- kind: ServiceAccount
name: dev01
apiGroup: ""
roleRef:
kind: Role
name: role-dev
apiGroup: rbac.authorization.k8s.io
4. ClusterRoleBinding (클러스터 역할 연결)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-cluster-resources-binding
subjects:
- kind: User # 권한을 부여받을 주체의 종류 (User, Group, ServiceAccount 중 선택)
name: jane.doe@example.com # 권한을 부여받을 사용자의 이름
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: cluster-resource-reader # 연결할 ClusterRole의 이름
apiGroup: rbac.authorization.k8s.io
해당 강의에서는 사용자 인증과정의 예시로, kubectl apply 명령어 처리 과정에 대해서 설명한다.
1. 요청 접수 및 파싱
사용자가 kubectl apply 명령을 실행하면, 해당 요청이 클러스터의 API 서버로 제출됨.
2. 인증 (Authentication) 단계
구문 검사가 끝나면 API 서버는 요청을 보낸 주체의 신원을 확인하는 인증 절차를 시작함.
3. 인가 (Authorization) 및 저장 단계
인증을 통해 사용자 이름이 식별되면, 다음으로 해당 사용자가 요청한 작업을 수행할 권한이 있는지 확인하는 인가 절차 실행함
➕ TLS 클라이언트 인증서 발급 과정?
앞서 인증 (Authentication) 단계에서 설명한 다양한 인증 방식 중, '클라이언트 인증서' 방식의 자격 증명 발급 과정은 '인증서 서명 요청(Certificate Signing Request, CSR)'을 통해 이루어 진다.
1. Key 및 CSR 생성 : 사용자는 자신의 개인 키(private key)와 공개 키 및 신원 정보가 포함된 CSR을 생성
2. CSR 제출 : 생성된 CSR을 쿠버네티스 API에 제출
3. 검토 및 승인 : 관리자 또는 자동화된 시스템이 제출된 CSR을 검토하고 승인
4. CA 서명 : CSR이 승인되면, 쿠버네티스의 인증 기관(CA)이 해당 CSR에 서명하여 최종 인증서를 생성
5. 인증서 수신 : 사용자는 서명된 인증서를 쿠버네티스 API로부터 받아 자신의 kubeconfig에 설정하여 사용
Ansible은 복잡하고 반복적인 IT 작업을 자동으로 처리해주는 도구로, 서버에 소프트웨어를 설치하거나, 설정을 변경하거나, 어플리케이션을 배포하는 등의 일을 미리 작성된 YAML에 따라 수행하게 한다.
특징1 : Agentless
특징2. 플레이북 (PlayBook)
즉, Ansible은 Agent 없이 SSH를 통해 작동하며, Playbook이라는 각본을 통해 IT인프라를 원하는 상태로 자동관리할 수 있는 자동화 도구이다.
HashiCorp Vault는 IT 환경의 민감한 Secret정보들을 안전하게 저장하고 관리하는 데 특화된 보안도구이다.
특징1. 중앙 집중식 Secret 관리
특징2. 동적 Secret
즉, HashiCorp Vault는 암호나 API 키 와 같은 Secret을 암호화하여 중앙에서 안전하게 관리하며, 동적 시크릿을 만들어주는 보안도구이다.