글에 중간 중간에 첨부된 다이어그램은 스터디에서 사용하는 다이어그램을 캡처하였습니다.
쿠버네티스 내부에 실행중인 모든 파드는 기본설정으로 클러스터 내 다른 모든 파드와 통신이 가능하다. 따라서 특정 파드가 외부 공격자에 노출되면 같은 노드 내 다른 파드는 물론 통신이 가능한 클러스터 전체의 다른 노드에서 실행중인 모든 파드에 영향이 가게 된다.
쿠버네티스 보안 권고 사항 대비 현재 클러스터의 취약점을 점검하는 도구이다.
# 설치 방법
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
설치가 완료되면 즉시 명령어 실행 할 수 있다.
주요 명령어는 아래와 같음
# 보안 취약점 확인
kubescape scan framework nsa -e kube-system,kube-public
portal.armo.cloud에 회원가입 후 제공되는 명령어 대로 진행.
이슈들을 볼 수 있는데 이슈에 해당하는 파드와 네임스페이스까지 나오니 굉장히 편리해보였다.
마치 코드 품질을 관리하는 Sonarqube처럼 인프라 구성을 관리해주는 시스템인 것 같다.
지금까지는 모든 권한을 가지는 슈퍼 어드민 (super admin) 즉, 관리자 계정을 사용했었음. 쿠버네티스도 리눅스 환경의 root 사용자처럼 관리자 계정으로 작업이 가능하다.
쿠버네티스에서도 멀티테넌시 환경을 지원한다.
멀티테넌시란 단일 인스턴스에 여러 사용자 그룹에 서비스를 제공하는 아키텍처
사용자별로 권한을 구분해서 네임스페이스 단위로 특정 기능만 가능하도록 제한하거나 네트워크 정책을 통한 외부 네임스페이스에서의 접근을 차단하거나 네임스페이스 단위로 리소스 할당량을 지정해 자원을 제한하는 것들이 있음
이런 구성요소들은 Role/RoleBinding, ClusterRole/ClusterRoleBinding, ServiceAccount(Token), 쿠버네티스 컨텍스트, User 등이 있음.
Role은 특정 네임스페이스에 속하는 파드, 서비스 등의 리소스를 지정하는 경우에 사용하고 두번째 ClusterRole은 네임스페이스에 속하지 않는 노드, PV 혹은 단일 네임스페이스가 아닌 전체 네임스페이스의 파드를 조회하는 권한 등에 사용한다.
# role yaml 파일 작성
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: test-role
namespace: test
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["batch"]
resources:
- jobs
- cronjobs
verbs: ["*"]
위 Role을 사용자에게 적용하려면 RoleBinding이 필요하다. 실제 데이터가 저장되는 PV(PersistentVolume)과 해당 데이터를 파드에 할당하는 PVC(PersistentVolumeClaim) 을 서로 분리하듯이 실제 권한을 지정한 Role과 해당 권한을 사용자에게 할당하는 RoleBinding은 서로 분리되어 있음.
# rolebinding yaml 파일 생성
kind: RoleBinding
apiVersion: rbac.authorization/k8s.io/v1
metadata:
name: test-role-binding
namespace: test
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: test-role
subjects:
- kind: ServiceAccount
name: test-sa
namespace: test