[GKE] RBAC-1-IAM 계정으로 GKE의 특정 네임스페이스에만 권한 할당하기

Seunghyun Moon·2023년 5월 4일
0

K8S-RBAC

목록 보기
1/3

GKE Cluster에 대한 RBAC 기반 관리를 하기 위해 GCP의 IAM 과 K8s builtin RBAC을 적절히 조합해 더욱 세부적인 접근 제어를 할 수 있습니다.


위 그림을 보면 GCP IAM의 predefined roles 와 kubernetes의 cluster roles는 100%는 아니지만 어느정도 비슷합니다.

중요한 점은 GCP의 roles는 기본적으로 gcp 프로젝트 레벨이기 때문에 IAM 을 통해 갖는 GKE에 대한 권한은 클러스터 레벨(namespace가 아닌)라는 점입니다.

그렇기 때문에 IAM role을 부여하면 GKE cluster(project 포함) 내의 admin, edit, view 각각에 대한 cluster 레벨 권한이 부여됩니다.

GKE의 resource에 대한 접근은 IAM 권한과 builtin 권한 둘중 하나만 있어도 됩니다.(합집합의 개념으로 이해하고 있습니다.)

IAM과 built-in RBAC을 조합을해 세밀하게 접근 제어를 할 수 있습니다.

예를 들어, Kubernetes Engine Viewer 와 builtin rolebinding(edit 권한이 있는 role 과 GCP IAM 사용자의 rolebinding)을 조합해 모든 클러스터에 대한 view 권한 + 특정 네임스페이스 혹은 리소스에 대한 edit 권한을 가져갈 수 있습니다.

또, 이 글에서 소개할텐데, 개발자로 가정할 수 있는 하나의 IAM 사용자에게 GKE의 단일 namespace에만 view 권한을 주기 위해 builtin rolebinding을 통해 권한을 줘서 액세스의 범위를 더욱 줄일 수 있습니다.



IAM 계정으로 GKE의 특정 네임스페이스에만 권한 할당하기

prerequisites

  1. gcloud auth login
  2. bastion에 kubectl 설치
sudo su
sudo apt-get install -y kubectl google-cloud-sdk-gke-gcloud-auth-plugin bash-completion cat >> /etc/profile <<EOL export USE_GKE_GCLOUD_AUTH_PLUGIN=True export PROJECT_ID=prj-sandbox-devops-9999 source <(kubectl completion bash) alias k=kubectl complete -o default -F __start_kubectl k EOL source /etc/profile
  1. 특정 namespace에 대한 권한을 테스트하기 위해서(여기서는 argocd)에 대한 테스트를 진행하기 위해 argocd를 설치합니다
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

초기에 IAM 계정은 GKE에 대한 권한이 없습니다.

IAM에서 커스텀 역할을 만듭니다.

아래 권한을 줍니다.

  • container.clusters.get
  • container.clusters.getCredentials
  • (옵셔널, 클러스터 리스팅 용) container.clusters.list

    k8s config를 가져옵니다.

    api서버에 대한 config가 생겼습니다.

kubectl get all을 해보지만 k8s resource에 대한 권한이 없기때문에 에러가 납니다.

role 생성과 role 바인딩을 해보겠습니다.

role.yaml
kubectl create -f role.yaml

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: moon-role
  namespace: argocd
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: moon-role-binding
  namespace: argocd
subjects:
# You can specify more than one "subject"
- kind: User
  name: shmoon2@wemakeprice.com # "name" is case sensitive
  apiGroup: rbac.authorization.k8s.io
roleRef:
  # "roleRef" specifies the binding to a Role / ClusterRole
  kind: Role #this must be Role or ClusterRole
  name: moon-role # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io

argocd namespace에 대한 viewer 권한을 획득한걸 확인할 수 있습니다.


참고

https://cloud.google.com/kubernetes-engine/docs/concepts/access-control?hl=ko
IAM 역할은 프로젝트의 모든 클러스터 또는 모든 하위 프로젝트의 모든 클러스터(역할이 폴더 수준에서 적용되는 경우)에 권한을 부여합니다.

https://cloud.google.com/kubernetes-engine/docs/how-to/role-based-access-control?hl=ko
GKE에서는 IAM과 Kubernetes RBAC가 서로 연동하여 사용자의 작업 수행을 승인합니다. 사용자는 둘 중 하나의 도구에서만 충분한 권한을 가지고 있으면 됩니다. 기본적으로 Google Cloud 사용자에게는 Kubernetes RBAC RoleBindings가 없으므로 GKE 클러스터를 준비하는 과정에서 이는 중요 부분을 차지합니다.

https://cloud.google.com/kubernetes-engine/docs/how-to/restrict-resources-access-by-namespace?hl=ko

https://medium.com/@jwlee98/gcp-gke-%EC%B0%A8%EA%B7%BC-%EC%B0%A8%EA%B7%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-6%ED%83%84-cloud-iam-%EA%B3%BC-kubernetes-rbac-f02b52cf538e
https://cloud.google.com/kubernetes-engine/docs/how-to/api-server-authentication?hl=ko#environments-without-gcloud
https://www.cloudskillsboost.google/focuses/5156?parent=catalog
https://medium.com/uptime-99/making-sense-of-kubernetes-rbac-and-iam-roles-on-gke-914131b01922
https://engineering.sada.com/gke-authentication-and-authorization-between-cloud-iam-and-rbac-d54ea17721d6
https://kubernetes.io/docs/reference/access-authn-authz/authentication/
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/add-user-role.html

profile
I live fullest

0개의 댓글