[쿠버네티스] security

김윤섭·2024년 7월 25일
post-thumbnail

작성중

개요

RBAC(Role-Based Access Control)을 사용하여 특정 네임스페이스에서 Pod를 읽을 수 있는 권한을 가진 ServiceAccount를 생성하고 관리하는 방법을 배운다.

RBAC

쿠버네티스 권한 관리 실습

임의의 네임스페이스 생성

alias k='microk8s kubectl' # 빠른 입력을 위한 alias 생성
k create namespace my-namespace

필요한 Role 생성

role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: my-namespace
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]

ServiceAccount 생성
Pod를 읽을 권한을 할당할 ServiceAccount를 생성
serviceaccount.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: pod-reader-sa
  namespace: my-namespace

RoleBinding 생성
ServiceAccount에 Role을 바인딩하여 권한을 할당

rolebinding.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-binding
  namespace: my-namespace
subjects:
- kind: ServiceAccount
  name: pod-reader-sa
  namespace: my-namespace
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
k apply -f <배포할 파일이름들>.yaml

테스트

Pod 배포하여 테스트
테스트를 위해 네임스페이스에 Pod를 배포
test-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: my-namespace
spec:
  containers:
  - name: nginx
    image: nginx

Token을 통해 kubeconfig 생성하여 확인
ServiceAccount의 토큰을 가져와 kubeconfig 파일을 생성

# ServiceAccount의 시크릿 이름을 변수에 저장
# 여기서는 'pod-reader-sa-token'이라는 이름을 사용하고 있습니다.
SECRET_NAME=pod-reader-sa-token

# ServiceAccount 토큰 추출 및 디코딩
TOKEN=$(k get secret $SECRET_NAME -n my-namespace -o jsonpath='{.data.token}' | base64 --decode)
# 설명:
# k get secret $SECRET_NAME -n my-namespace : 지정된 네임스페이스에서 시크릿을 가져옵니다.
# -o jsonpath='{.data.token}' : 시크릿 데이터에서 token 필드만 추출합니다.
# | base64 --decode : 추출된 토큰을 base64 디코딩합니다 (쿠버네티스는 시크릿을 base64로 인코딩하여 저장).

# 추출된 토큰 출력
echo $TOKEN
# 이 토큰은 JWT(JSON Web Token) 형식으로, 쿠버네티스 API 서버 인증에 사용될 수 있습니다.

이 토큰을 통해서 실습이 진행되므로 저장해둬야 한다.

ServiceAccount의 Secret 이름과 토큰을 가져오기
kubeconfig-sa.yaml

apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: $(k config view --raw -o jsonpath="{.clusters[0].cluster.certificate-authority-data}")
    server: https://127.0.0.1:16443
  name: microk8s-cluster
contexts:
- context:
    cluster: microk8s-cluster
    namespace: my-namespace
    user: pod-reader-sa
  name: pod-reader-context
current-context: pod-reader-context
users:
- name: pod-reader-sa
  user:
    token: $TOKEN

kubeconfig 파일을 사용하여 인증

KUBECONFIG=kubeconfig-sa.yaml k get pods -n my-namespace

Token을 사용하여 API 호출 테스트
api 주소 확인

k config view --raw -o jsonpath="{.clusters[0].cluster.server}"

주소와 토큰을 넣어서 api호출 테스트
Authorization 헤더와 토큰을 사용하여 인증
성공적으로 API 서버에 접근하여 PodList를 반환받음

curl -k -H "Authorization: Bearer $TOKEN" $APISERVER/api/v1/namespaces/my-namespace/pods

SSL 인증서 문제로 연결에 실패

Kubectl exec -it pod #pod 내부에 bash 셸 시작
Kubectl get pods, apply, create, delete # 클러스터 리소스 관리
Kubectl config view --raw #설정 출력

정리

RBAC 권한과 관리 실습을 해보기위해 Role을 알아보고 네임스페이스를 설정해서 직접 pod 를 배포하고 토큰과 api 주소를 이용해서 pod목록을 받아보는 실습을 진행했다. 쿠버네티스의 보안에서 RBAC는 상당히 중요한 주제중 하나인데, 이를 깊이있게 탐구해볼수 있었다.

0개의 댓글