반응형
콩니🔧
개지니어 콩니
콩니🔧
전체 방문자
오늘
어제
  • 분류 전체보기 (79)
    • Life outside of work (13)
    • DevOps (29)
    • Developments (23)
    • CS and others (7)
    • Book reviews (7)

블로그 메뉴

  • 홈
  • 태그

공지사항

  • 제가 누군지 궁금하시다면

인기 글

태그

  • Infra
  • DevOps
  • HTML
  • web
  • programmers
  • Jenkins
  • 프로그래머스
  • Network
  • Java
  • kubernetes

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
콩니🔧

개지니어 콩니

[Kubernetes] RBAC을 이용하여 특정 namespace에만 권한 주기
DevOps

[Kubernetes] RBAC을 이용하여 특정 namespace에만 권한 주기

2021. 12. 12. 19:34
반응형

안녕하세요! 오늘은 특정 NAMESPACE에만 권한을 부여하고, 
이 권한에 대한 kubeconfig 를 생성하는 방법에 대해 알아보겠습니다.

결론적으로는, RBAC을 사용합니다.

특정 namespace용 kubeconfig 만들기


TL;DR;
  • Kubernetes에서 제공하는 role, role binding, service account를 이용합니다.
  • 관련문서: https://kubernetes.io/docs/reference/access-authn-authz/rbac/
  • 특정 namespace에 read/write 권한을 갖는 role을 생성하고, 시스템 어카운트인 serviceaccount를 생성하고, rolebindingd을 통해 앞서 정의한 role을 생성한 serviceaccount에 바인딩합니다.

상황
  • 클러스터를 관리하고 있는 admin은 클러스터 내의 모든 권한을 갖지만, 이 권한을 모든 사용자가 가져서는 안 됩니다. 개발자나, 특정 리소스에만 접근이 필요한 사용자에게 least previlege의 원칙에 맞추어 필요한 만큼의 권한만 부여해야 하는데, 본문에서는 특정 namespace를 생성해 주고, 거기에 read/write 권한을 갖는 kubeconfig를 생성하여 이 config를 사용하는 사용자가 적정한 권한을 이용하여 클러스터에 접근할 수 있도록 합니다.

clusterrole vs. role

  • scope의 차이가 있습니다. role은 within a certain namespace이라는 범위를 가지고 있고, clusterrole은 클러스터 내에서 지정할 수 있는 role 입니다. 본문의 경우에는 둘 다 사용 가능하지만 clusterrole로 진행하겠습니다~!

rbac이 적용된 kubeconfig 만들기

  • 권한을 부여할 namespace가 없다면 생성합니다.
kubectl create ns test-space
  • service account를 생성합니다. yaml로 생성하든 cli로 생성하든 편하신 대로..ㅎㅎ
# CLI

kubectl create sa sa-dev

# yaml
# serviceaccount.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
name: sa-dev
  namespace: test-space

kubectl apply -f ./serviceaccount.yaml
  • 생성된 service account에 role binding을 통해 권한을 부여합니다.
# rb.yaml

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: dev-rolebinding
 namespace: test-space
subjects:
- kind: ServiceAccount
  name: sa-dev
 namespace: test-space
roleRef:
  kind: ClusterRole
  name: edit
  apiGroup: rbac.authorization.k8s.io
  • namespace와 serviceaccount의 정보를 기반으로 kubeconfig를 생성합니다.
# the name of the service account
name=sa-dev
# the name of the namespace
namespace=test-space
server=$(kubectl cluster-info | grep -m 1 -o "https.*.:443")
token_name=$(kubectl -n $namespace get serviceaccount $name -o jsonpath='{.secrets[].name}')
ca=$(kubectl -n $namespace get secret/$token_name -o jsonpath='{.data.ca\\.crt}')
token=$(kubectl -n $namespace get secret/$token_name -o jsonpath='{.data.token}' | base64 --decode)
 
echo "
apiVersion: v1
kind: Config
clusters:
- name: default-cluster
  cluster:
    certificate-authority-data: ${ca}
    server: ${server}
contexts:
- name: default-context
  context:
    cluster: default-cluster
    namespace: ${namespace}
    user: ${name}
current-context: default-context
users:
- name: ${name}
  user:
    token: ${token}
" > kubeconfig
  • 이제 생성된 kubeconfig를 --kubeconfig 옵션을 이용하든 kubectx를 사용하든 뭘 하시든 사용하시면 해당 namespace에서만 read, write가 가능한 환경이 조성됩니다~

    네.........
    길고 긴 여정이었는데요,
    하나씩 하는 것도 좋지만..................조금...번거롭습니다.
    스크립트 하나로 퉁쳐봅시다!



  • 위의 설명은 다 잊고 요 스크립트 실행시키고, service account name과 namespace 만 지정해 주시면
    알아서 지지고볶고 다 됩니다~
  • 주의하실 점은, 해당 커맨드를 사용하실 때 rancher api를 이용한 context 파일을 사용하고 계시면 안 되고,
    (kubernetes api server의 주소를 가져오지 못하고 rancher api 주소를 가져오기 때문)
    이 shell을 실행하실 때 current-context가 원하시는 클러스터로 지정되어 있어야 합니다^^
#!/bin/bash

read -p 'service account name: ' name
read -p 'namespace you want to create: ' namespace

if [ -z "$name" ] || [ -z "$namespace" ];
then
  echo "please provide the input - serviceaccount and namespace"
  exit 1
fi

kubectl create ns $namespace
kubectl create serviceaccount $name -n $namespace

kubectl create rolebinding $name --clusterrole=edit --serviceaccount="$namespace:$name" --namespace=$namespace

server=$(kubectl cluster-info | grep -m 1 -o "https.*.:443")
token_name=$(kubectl -n $namespace get serviceaccount $name -o jsonpath='{.secrets[].name}')
ca=$(kubectl -n $namespace get secret/$token_name -o jsonpath='{.data.ca\\.crt}')
token=$(kubectl -n $namespace get secret/$token_name -o jsonpath='{.data.token}' | base64 --decode)
cluster=$(kubectl config view --minify -o jsonpath='{.clusters[].name}')

echo "
apiVersion: v1
kind: Config
clusters:
- name: ${namespace}-${name}
  cluster:
    certificate-authority-data: ${ca}
    server: ${server}
contexts:
- name: developer-context
  context:
    cluster: ${cluster}
    namespace: ${namespace}
    user: ${name}
current-context: developer-context
users:
- name: ${name}
  user:
    token: ${token}
" > kubeconfig

 

이상입니다~ 즐건 쿠베생활하세요 ㅎㅎ

반응형
저작자표시 비영리 변경금지 (새창열림)

'DevOps' 카테고리의 다른 글

[이럴땐이렇게] Kubernetes(쿠버네티스)에서 namespace 삭제가 안 될 때 강제 삭제하기  (0) 2022.01.12
[이럴땐이렇게] Jenkins에서 배포한 지 오래 된 Job 찾기! 마지막 배포로부터 n일 이상 된 잡을 찾아보자~!  (0) 2021.12.21
[Kubernetes & Azure] TLS 인증서(SSL 인증서) Keyvault 연동하기  (1) 2021.11.13
[Kubernetes] Application Gateway의 기본 기능, Connection Draining에 대해 알아보자!  (0) 2021.11.10
[Kubernetes] Node selector vs. Node affinity, 어떤 것을 사용할까?  (1) 2021.11.07
    콩니🔧
    콩니🔧
    개발알못 인프라알못 콩니

    티스토리툴바