관리 메뉴

코딩 기록 저장소

[쿠버네티스] 권한이 제한된 사용자 계정 발급 본문

개인 공부/쿠버네티스

[쿠버네티스] 권한이 제한된 사용자 계정 발급

KimNang 2025. 6. 24. 16:39

목차

     

    1. context

    01. 쿠버네티스 context

    - 쿠버네티스 계정을 발급하고 권한을 제한하는 방법이 serviceaccount와 role

    - pod 생성 등의 쿠버네티스 요청은 쿠버네티스 API 서버가 처리하고, API 서버는 사용자 요청을 처리하기 전 올바를 사용자가 맞는지 검사하고 사용할 수 있는지 확인함

    - API 서버의 인증, 인가를 확인하는 기준이 쿠버네티스 context 정보!

    - context 정보에는 쿠버네티스 클러스터 정보와 사용자 정보가 존재함

    - 사용자가 요청할 때 별도로 인증, 인가 정보를 명시하지 않으면 context 정보가 자동으로 요청정보와 같이 전송됨

    ※ context는 사용자 홈 디렉터리 /.kube/config에 위치함

     

    02. context 구조

    - 쿠버네티스 클러스터 정보와 사용자 정보로 구성됨

    • 클러스터 정보 : API 서버의 인증서와 주소 필요.
    • 사용자 정보 : ssh키 쌍, 토큰, 사용자 이름과 비밀번호 등 여러가지 유형으로 유저를 설정함

    - 쿠버네티스 설치시 default로 쿠버네티스 admin 유저와 localhost 또는 host ip로 쿠버네티스 클러스터 정보가 설정되어 있음

    - 자동 설정된 값이 있었기에 kubectl 명령어를 사용할 수 있었던 것

     

     

    현재 사용중인 context 확인

    - 아래 명령어 사용하면 현재 사용중인 context 정보가 출력됨

    kubectl config current-context

     

     

    • context에 대한 자세한 정보 출력
      - context는 cluster와 user(authinfo)로 구성됨
      - 현재 사용중인 kubernetes-admin context는 cluster.local클러스터와 kubernetes-admin user를 사용하고 있음
      kubectl config get-contexts

     

    2. 쿠버네티스 context에 등록

    01. serviceaccount 생성

    - 계정 이름과 namespace를 지정해주면 됨

    - default namespace에 developer라는 serviceaccount을 생성함

    kubectl create sa developer -n test

     



    • serviceaccount가 생성되었는지 확인하는 방법
      kubectl get sa -n test


    • serviceaccount의 토큰을 발급함
      - Kubernetes v1.24 이상부터는 Secret 기반 토큰이 사라지고, TokenRequest API를 통해 토큰을 발급함
      kubectl create token developer -n test

     

     

    02. context 생성

    - serviceaccount를 이용해 쿠버네티스 인증을 하려면 context 등록이 필요함

    • serviceaccount 토큰을 환경변수로 저장
      - context를 생성할 때 serviceaccount 토큰을 이용함
      - 토큰 길이가 길어서 환경변수로 저장하여 사용함
      export DEV_TOKEN=$(kubectl create token developer -n test)


    • 유저 등록
      - kubectl config set-credentials 명령어로 context 유저를 쉽게 등록할 수 있음
      kubectl config set-credentials dev --token=$DEV_TOKEN


    • 클러스터 이름 확인
      - context를 생성하기 위해 쿠버네티스 클러스터가 필요함
      - 기존에 등록되어 있는 로컬 쿠버네티스 클러스터를 사용함
      - 로컬 클러스터란 127.0.0.1 주소로 시작하는 클러스터 주소
      - 클러스터가 설치되어 있는 서버에만 접근이 가능함
      kubectl config get-clusters


    • context 등록
      - devloper으로 등록한 유저와 로컬 클러스터를 이용해 context를 등록함
      kubectl config set-context dev \
        --cluster=kubernetes \
        --user=dev \
        --namespace=test


    • context 확인
      - 생성한 context는 다음 명령어로 확인 가능함
      - 현재 사용중인 context는 CURRENT필드에 별표로 표시됨
      kubectl config get-contexts

     

     

    3. context 사용 및 권한 제한

    01. context 전환

    - context 이름은 current-context로 확인해야 함

    kubectl config use-context dev

     

     

    pod 생성 시도

    - context를 전환하면 context에 해당하는 계정 권한을 가짐

    - developer 계정은 어떠한 권한도 설정하지 않았으므로 모든 요청이 쿠버네티스 API서버에서 거부함

    - pod를 test namespace에서 생성을 시도하면 permission denied 오류 메시지가 뜸

     

     

    02. 권한 설정

    - RBAC 방법으로 계정에 권한을 설정하는 방법이 있음

    - role이라는 쿠버네티스 리소스로 관리됨

    - kubeflow 일부 권한을 developer 계정에 설정함

    • apigroup: 쿠버네티스 리소스가 속해 있는 api group이름
    • resources: 권한 설정할 쿠버네티스 리소스
    • verbs: 권한
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: test
      name: pods-role
    rules:
    - apiGroups: [""] # "" indicates the core API group
      resources: ["pods"]
      verbs: ["create", "delete"]

     

    - role 설정

     

     

    03. 권한 부여

    - 생성한 role을 serviceaccount에 설정을 수동으로 해줘야 함

    - rolebinding을 사용해 권한을 부여함

    - kubectl --dry-run을 이용해서 rolebinding yaml파일을 생성한 후, yaml 파일을 쿠버네티스에 적용함

    kubectl create rolebinding pod-rolebinding \
      --serviceaccount=test:developer \
      --role=pods-role \
      --namespace=test \
      --dry-run=client -o yaml > pod-rolebinding.yaml
    
    kubectl apply -f pod-rolebinding.yaml

     

     

    - kubectl create 명령어로 방금 생성한 rolebinding을 실행함

    kubectl create -f pod-rolebinding.yaml

     

     

     

    04. pod 생성 테스트

    - 아래 명령어를 이용해 실행이 되는지 확인해봄

    kubectl auth can-i create pods --as=system:serviceaccount:test:developer -n test

     

    - serviceaccount에 rolebinding이 적용됨

    - 아까 실패했던 pod 생성이 성공하는 모습을 볼 수 있음



     

     

    https://malwareanalysis.tistory.com/133

     

    쿠버네티스에서 권한이 제한된 개발자 계정 발급 1편

    1편: https://malwareanalysis.tistory.com/133 2편: https://malwareanalysis.tistory.com/135 이 챕터는 권한이 제한된 쿠버네티스 계정(serviceaccount)을 생성하는 방법을 다룹니다. https://youtu.be/qt4fMcvG564 1. 1편에서 다루

    malwareanalysis.tistory.com