Kubernetes RBAC(역할 기반 접근통제)
* RBAC(역할 기반 접근통제, Role-based Access Control)
- Kubernetes 클러스터 내 사용자가 수행할 수 있는 작업을 제어하는 방법이다.
- 클러스터 리소스 및 작업에 대한 접근을 관리할 수 있어 보안을 강화할 수 있다.
* Kubernetes RBAC 구성 요소
1) Role: Role은 특정 네임스페이스에서 사용할 수 있는 권한과 규칙을 정의하고 리소스 (예를 들어 파드나 서비스) 및 작업 (예를 들어 조회, 생성)에 대한 권한이다.
2) ClusterRole: 클러스터 수준에서 사용할 수 있는 권한과 규칙을 정의한다. 모든 네임스페이스에서 사용할 수 있으며 클러스터 전체에서 리소스 및 작업에 대한 권한을 정의한다.
3) RoleBinding: 사용자, 그룹, 계정과 Role 또는 ClusterRole 사이의 매핑 설정한다. 사용자 또는 서비스 계정에 특정 권한을 부여할 수 있다.
4) ClusterRoleBinding: 사용자, 그룹이나 계정과 ClusterRole 사이의 매핑 설정한다. 클러스터 수준에서 권한을 할당할 수 있다.
* 예제로 실습
1. 롤 바인딩(RoleBinding) 구성하기
rbac-test.yaml 파일
apiVersion: apps/v1 kind: Deployment metadata: name: test-deployment labels: app: test-deployment spec: replicas: 3 selector: matchLabels: app: test-deployment template: metadata: labels: app: test-deployment spec: containers: - name: test-deployment image: nginx:1.7.9 ports: - containerPort: 80 |
디플로이먼트를 생성해 준다.
2. 롤 생성
rbac-role.yaml
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: default name: role-dev rules: - apiGroups: ["", "apps"] resources: ["pods", "deployments"] verbs: ["get", "list", "edit"] |
➤ roles 옵션 값
- apiGroups: [API 그룹 이름], Kubernetes API 대한 그룹, 대부분의 리소스는 `””` 빈 문자열을 사용하고 문자열의 의미는 핵심그룹을 나타낸다.
- resources: [리소스 종류], 수행 가능한 대상의 유형을 정의한다. pods 나 services 등
- verbs: [수행 가능한 작업], 특정 리소스에 대해 수행 가능한 작업을 정의한다. get, list, create 등
3. 사용자 생성
ServiceAccount 생성 후 apply
serviceaccount-dev01.yaml
apiVersion: v1 kind: ServiceAccount metadata: name: dev01 namespace: default |
kubectl apply -f serviceaccount.yaml
쿠버네티스 service account 목록을 확인하는 방법
kubectl get serviceaacount
K8S 1.24 버전까지는 위와 같이 ServiceAccount를 생성하면 토큰이 자동으로 생성되지만,
1.24 이후 버전부터는 보안 강화를 위해 토큰을 자동으로 생성하지 않는다. 별도로 Secret 오브젝트를 생성해야 한다.
ServiceAccount에 대한 Token을 획득할 수 있다.
serviceaccount-dev01-secret.yaml
apiVersion: v1 kind: Secret metadata: name: drone-bot-secret namespace: default annotations: kubernetes.io/service-account.name: drone-bot type: kubernetes.io/service-account-token |
생성한 계정의 토큰 값을 확인
kubectl get secret
서비스 계정에 할당된 secret에 대한 자세한 정보 표시
kubectl describe secret <계정명>
※ 참고: 해당 내용은 $HOME_DIR/.kube/config 파일에 입력되며 해당 파일에서 직접 추가, 수정, 삭제 가능하다.
사용자 생성을 이어서 진행한다.
sudo kubectl config set-credentials [생성할 계정명] --token=[확인한 secret token 값]
kubectl config set-credentials dev01 --token=eyJhb~~
클러스터명 확인하기
kubectl config get-clusters
클러스터와 사용자 간 연결을 설정하는 context 명령어
sudo kubectl config set-context [생성할 context명] --cluster=[확인한 클러스터명] --user=[위에서 생성한 계정명]
※ 참고: 삭제 명령은 kubectl config delete-context [context명]
4. 롤 바인딩 생성
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 |
➤ subjects 값은 역할(role)을 사용할 사용자나 그룹을 정의한다.
- kind: “ServiceAccount”는 서비스 계정을 나타낸다.
- name: dev01, 주체의 이름을 지정한다.
➤ roleRef 값은 해당 바인딩이 연결될 역할을 지정한다.
- kind: 역할의 유형을 나타내며, 대부분 Role, ClusterRole로 정의된다.
- name: 바인딩할 역할의 이름을 지정한다.
=> 설정하면 해당 사용자 또는 그룹이 해당 역할(role)을 사용할 수 있다.
5. context 전환 및 롤바인딩 확인
사용 가능한 context 확인
kubectl config get-contexts
dev-user context로 전환
kubectl config use-context [변경할 context]
kubectl config use-context dev-user
현재 사용 중인 context 확인
kubectl config current-context
6. 권한 부여 완료
role-dev.yaml에서 입력했던 get, edit와 pods, deployment는 정상적으로 동작할 수 있다.
하지만 정의해주지 않았던 명령(아래 이미지의 경우 scale)들은 아래와 같이 권한 에러가 발생한다.
그리고 context는 권한이 한정되어 있으므로 다시 원래의 context로 전환해야 정상적인 이용이 가능하다.
[error]
“The connection to the server localhost:8080 was refused - did you specify the right host or port?”
= root로 명령어 입력 시 에러 발생
해결방안: https://d-life93.tistory.com/436
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config export KUBECONFIG=/etc/kubernetes/admin.conf |
※ 참고문서
'Cloud' 카테고리의 다른 글
[docker] 도커에서 파일 복사 및 가져오기 (cp, 로컬 - 컨테이너) (1370) | 2023.11.15 |
---|---|
[K8S] Kubernetes 구축 - 2. Worker Node 추가 (kubeadm, Join) (1363) | 2023.08.28 |
[K8S] Kubernetes 구축 - 1. 설치 및 배포 (in Ubuntu 22.04) (1499) | 2023.08.21 |
[Openstack] 오픈스택 이해하기 (442) | 2021.07.15 |
[Hypervisor] KVM(Kernel-based Virtual Machine) 특징 및 설치(Ubuntu) (427) | 2021.06.30 |