Information Security ˗ˋˏ ♡ ˎˊ˗

Cloud

[K8S] Kubernetes 구축 - 3. RBAC 권한 설정(role 생성, role binding)

토오쓰 2023. 11. 2. 17:56

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

 

 

 

※ 참고문서

https://ondemand.tistory.com/382

https://may9noy.tistory.com/545