본문 바로가기
서버구축 (WEB,DB)

Kubernetes RBAC 사용자 생성 및 역할 기반 액세스 권한 제어

by 날으는물고기 2025. 1. 26.

Kubernetes RBAC 사용자 생성 및 역할 기반 액세스 권한 제어

쿠버네티스에서 사용자별로 특정 네임스페이스에 대한 권한을 제어하려면 RBAC(Role-Based Access Control)를 활용해야 합니다. 아래는 사용자에게 특정 네임스페이스에 권한을 부여하는 방법입니다.


1. 사용자 생성 및 인증서 발급

쿠버네티스는 기본적으로 사용자 관리를 제공하지 않으므로, 인증서를 통해 사용자를 식별합니다.

# 사용자 개인 키 생성
openssl genrsa -out username.key 2048

# CSR(Certificate Signing Request) 생성
openssl req -new -key username.key -out username.csr -subj "/CN=username"

# CSR을 쿠버네티스 CA로 서명하여 인증서 발급
openssl x509 -req -in username.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out username.crt -days 365

2. kubeconfig에 사용자 추가

사용자의 인증서를 kubeconfig 파일에 추가하여 kubectl로 접근할 수 있게 합니다.

kubectl config set-credentials username --client-certificate=username.crt --client-key=username.key
kubectl config set-context username-context --cluster=클러스터이름 --namespace=네임스페이스이름 --user=username

3. Role 및 RoleBinding 생성

사용자에게 특정 네임스페이스에 대한 권한을 부여하기 위해 Role과 RoleBinding을 생성합니다.

 

Role 생성 role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: 네임스페이스이름
  name: 사용자-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

RoleBinding 생성 rolebinding.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: 사용자-rolebinding
  namespace: 네임스페이스이름
subjects:
- kind: User
  name: username
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: 사용자-role
  apiGroup: rbac.authorization.k8s.io

적용

kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml

4. 권한 확인

사용자가 해당 네임스페이스에서 권한을 가지고 있는지 확인합니다.

kubectl auth can-i list pods --as=username --namespace=네임스페이스이름

참고사항

  • 여러 사용자에게 동일한 권한을 부여하려면 Group을 활용할 수 있습니다.
  • ClusterRole과 ClusterRoleBinding을 사용하면 클러스터 전역 권한을 설정할 수 있지만, 보안상 필요한 경우에만 사용해야 합니다.

 

이 방법을 통해 각 사용자에게 특정 네임스페이스에 대한 세부적인 권한을 부여하고 관리할 수 있습니다. 사용자별로 Kubernetes 권한을 효과적으로 제어하려면 RBAC(Role-Based Access Control)를 적절히 활용하고 관리 프로세스를 최적화해야 합니다. 다음은 사용자별 Kubernetes 권한을 효과적으로 관리하기 위한 방안들입니다.

1. RBAC(Role-Based Access Control) 정책 설계

RBAC은 Kubernetes 권한 관리를 위한 핵심 도구입니다. 다음 방안을 활용해 정책을 설계하세요.

  • Least Privilege Principle (최소 권한 원칙)
    • 사용자가 필요한 작업만 수행할 수 있도록 최소한의 권한만 부여합니다.
    • 예: read-only 사용자에게 listget 권한만 부여.
  • Namespace 기반 권한 분리
    • 사용자가 특정 네임스페이스에서만 작업하도록 권한을 제한합니다.
    • 예: 개발팀은 dev 네임스페이스만, QA팀은 qa 네임스페이스만 접근.
  • Role/ClusterRole의 재사용
    • 동일한 권한이 필요한 사용자 그룹을 위한 Role 또는 ClusterRole을 미리 정의합니다.
    • 예: developer-role, qa-tester-role과 같은 이름으로 역할 생성.

2. Group 기반 관리

쿠버네티스는 사용자 그룹을 직접 관리하지 않지만, 외부 인증 시스템과 연동하여 그룹 기반 권한 관리를 효과적으로 할 수 있습니다.

  1. 인증 시스템 연동
    • Kubernetes를 LDAP, SSO, OpenID Connect(OIDC)와 통합하여 사용자 인증을 중앙에서 관리합니다.
    • 예: Google Workspace, Active Directory와 연동.
  2. Group 기반 RoleBinding
    • RoleBinding에서 사용자 그룹을 지정하여 동일한 권한을 여러 사용자에게 효율적으로 할당합니다.
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: dev-rolebinding
        namespace: dev
      subjects:
      - kind: Group
        name: developers
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: Role
        name: developer-role
        apiGroup: rbac.authorization.k8s.io

Kubernetes의 RoleBinding 리소스를 정의한 예시입니다. 이 RoleBinding은 특정 네임스페이스(dev)에서 특정 Role(developer-role)을 그룹(developers)에 바인딩하는 역할을 합니다.

 

apiVersion

apiVersion: rbac.authorization.k8s.io/v1
  • 이 리소스가 Role-Based Access Control (RBAC) API의 v1 버전을 사용한다는 것을 나타냅니다.

 

kind

kind: RoleBinding
  • 리소스의 종류가 RoleBinding임을 명시합니다.
  • RoleBinding은 특정 네임스페이스 내에서 사용자나 그룹에 권한을 할당합니다.

 

metadata

metadata:
  name: dev-rolebinding
  namespace: dev
  • name: 이 RoleBinding의 이름은 dev-rolebinding입니다.
  • namespace: 이 RoleBinding은 dev 네임스페이스에 속합니다. 이는 RoleBinding이 네임스페이스 스코프에서 작동함을 의미합니다.

 

subjects

subjects:
- kind: Group
  name: developers
  apiGroup: rbac.authorization.k8s.io
  • subjects: 권한을 할당받을 주체를 지정합니다.
    • kind: Group은 사용자 그룹을 의미합니다. 예를 들어, developers라는 그룹에 권한을 부여합니다.
    • name: 그룹 이름은 developers입니다.
    • apiGroup: rbac.authorization.k8s.io를 지정해 Kubernetes RBAC API를 사용합니다.

 

roleRef

roleRef:
  kind: Role
  name: developer-role
  apiGroup: rbac.authorization.k8s.io
  • RoleBinding이 참조할 Role을 지정합니다.
    • kind: Role은 네임스페이스 내에서 정의된 Role을 참조합니다.
    • name: 이 RoleBinding이 연결될 Role의 이름은 developer-role입니다.
    • apiGroup: 역시 rbac.authorization.k8s.io를 사용하여 RBAC API를 지정합니다.

 

사용 목적

  • RBAC를 사용해 특정 그룹(여기서는 developers)에 특정 권한(Role developer-role)을 네임스페이스(dev)에서 부여하려는 목적입니다.
  • 예를 들어, developer-role이 ConfigMap 읽기 및 작성 권한을 포함한다면, developers 그룹은 dev 네임스페이스에서 ConfigMap을 다룰 수 있습니다.

 

추가 예제: Role 정의

위 YAML 파일은 RoleBinding에 대한 내용만 포함되어 있으므로, Role 정의 예시도 추가로 제공합니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer-role
  namespace: dev
rules:
- apiGroups: [""]
  resources: ["pods", "configmaps"]
  verbs: ["get", "list", "watch", "create", "update", "delete"]
  • rules: 이 Role은 podsconfigmaps 리소스에 대해 읽기, 생성, 업데이트, 삭제 권한을 부여합니다.
  • namespace: Role은 네임스페이스 범위이므로 dev 네임스페이스에서만 유효합니다.

 

kubectl 명령어

  1. RoleBinding 생성
    kubectl apply -f rolebinding.yaml
  2. Role 확인
    kubectl describe role developer-role -n dev
  3. RoleBinding 확인
    kubectl describe rolebinding dev-rolebinding -n dev
  4. 네임스페이스 내 권한 테스트 (예: pod 조회)
    kubectl get pods -n dev --as-group=developers

3. Dynamic Admission Controller 사용

RBAC 외에 Dynamic Admission Controller를 활용해 사용자 작업을 세부적으로 통제할 수 있습니다.

  • OPA(Open Policy Agent) Gatekeeper
    • 세부적인 정책을 정의하여 사용자별 리소스 사용 제어.
    • 예: 특정 사용자가 pod 이름에 test라는 단어가 포함되지 않도록 제한.
    package kubernetes.admission
    
    deny[msg] {
      input.request.kind.kind == "Pod"
      contains(input.request.object.metadata.name, "test")
      msg := "Pod 이름에 'test' 포함이 금지됨"
    }

4. 모니터링 및 감사

RBAC 정책 적용 후 사용자 작업을 주기적으로 모니터링하고, 권한 남용을 방지해야 합니다.

  • Audit Logs 활성화
    • Kubernetes의 Audit Logs를 활성화하여 사용자 작업 기록.
    • 예: 누가, 언제, 어떤 리소스를 생성/수정/삭제했는지 확인.
  • 정기적인 권한 검토
    • 사용하지 않는 Role/RoleBinding을 제거하여 보안을 강화합니다.
    • kubectl get rolebinding --all-namespaces로 현재 권한을 검토.

5. 멀티 테넌시 도입

다수의 팀/사용자가 Kubernetes를 공유하는 경우, 멀티 테넌시 전략을 적용하면 권한 관리를 효과적으로 할 수 있습니다.

  • Namespace 기반 Isolation
    • 팀별로 독립된 네임스페이스를 제공.
    • 네임스페이스에 ResourceQuota를 적용하여 자원 남용 방지.
  • NetworkPolicy를 활용한 네트워크 접근 제어
    • 사용자 또는 Pod 간의 네트워크 통신 제한.

6. 자동화 도구 활용

사용자 권한 관리의 복잡도를 줄이기 위해 자동화 도구를 활용하세요.

  • Kyverno
    • RBAC 정책 생성 및 배포를 자동화.
  • Terraform/Kustomize
    • RBAC 구성 및 네임스페이스 프로비저닝 자동화.

권한 관리 프로세스 요약

  1. 사용자/그룹을 명확히 정의.
  2. RBAC 정책을 최소 권한 원칙에 따라 설계.
  3. 인증 시스템과 연동하여 중앙 집중식 사용자 관리.
  4. Dynamic Admission Controller를 통해 세부 정책 적용.
  5. Audit Logs와 정기 검토로 보안 강화를 지속.
  6. 멀티 테넌시 전략 및 자동화 도구로 운영 효율성 향상.

이 접근법은 확장성, 효율성, 보안성을 모두 갖춘 사용자 권한 관리 방법입니다.

728x90

댓글