쿠버네티스에서 사용자별로 특정 네임스페이스에 대한 권한을 제어하려면 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
사용자에게list
와get
권한만 부여.
- Namespace 기반 권한 분리
- 사용자가 특정 네임스페이스에서만 작업하도록 권한을 제한합니다.
- 예: 개발팀은
dev
네임스페이스만, QA팀은qa
네임스페이스만 접근.
- Role/ClusterRole의 재사용
- 동일한 권한이 필요한 사용자 그룹을 위한
Role
또는ClusterRole
을 미리 정의합니다. - 예:
developer-role
,qa-tester-role
과 같은 이름으로 역할 생성.
- 동일한 권한이 필요한 사용자 그룹을 위한
2. Group 기반 관리
쿠버네티스는 사용자 그룹을 직접 관리하지 않지만, 외부 인증 시스템과 연동하여 그룹 기반 권한 관리를 효과적으로 할 수 있습니다.
- 인증 시스템 연동
- Kubernetes를 LDAP, SSO, OpenID Connect(OIDC)와 통합하여 사용자 인증을 중앙에서 관리합니다.
- 예: Google Workspace, Active Directory와 연동.
- 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
- RoleBinding에서 사용자 그룹을 지정하여 동일한 권한을 여러 사용자에게 효율적으로 할당합니다.
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를 사용합니다.
- kind:
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를 지정합니다.
- kind:
사용 목적
- RBAC를 사용해 특정 그룹(여기서는
developers
)에 특정 권한(Roledeveloper-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은
pods
와configmaps
리소스에 대해 읽기, 생성, 업데이트, 삭제 권한을 부여합니다. - namespace: Role은 네임스페이스 범위이므로
dev
네임스페이스에서만 유효합니다.
kubectl 명령어
- RoleBinding 생성
kubectl apply -f rolebinding.yaml
- Role 확인
kubectl describe role developer-role -n dev
- RoleBinding 확인
kubectl describe rolebinding dev-rolebinding -n dev
- 네임스페이스 내 권한 테스트 (예: 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 구성 및 네임스페이스 프로비저닝 자동화.
권한 관리 프로세스 요약
- 사용자/그룹을 명확히 정의.
- RBAC 정책을 최소 권한 원칙에 따라 설계.
- 인증 시스템과 연동하여 중앙 집중식 사용자 관리.
- Dynamic Admission Controller를 통해 세부 정책 적용.
- Audit Logs와 정기 검토로 보안 강화를 지속.
- 멀티 테넌시 전략 및 자동화 도구로 운영 효율성 향상.
이 접근법은 확장성, 효율성, 보안성을 모두 갖춘 사용자 권한 관리 방법입니다.
댓글