전공영역 공부 기록

[CKS] 클러스터 보안 - pod의 serviceaccount token

악분 2022. 1. 24. 23:21
반응형

안녕하세요. 이 글은 CKS자격증을 공부하면서 정리한 글입니다.

 

1. pod와 serviceaccount 관계

pod가 내부적으로 kube api server에 API를 사용할 경우가 있습니다. 쿠버네티스 이 문제를 해결하기 위해 pod 내부에 serviceaccount token을 마운트할 수 있습니다. pod는 마운트된 token을 이용해서 kube api server에 요청과 응답을 받습니다.

 

2. default serviceaccount

namespace를 생성하면 자동으로 default serviceaccount가 생성됩니다. namespace를 생성하고 약 1분뒤에 serviceaccount를 조회하면 default serviceaccount가 보입니다.

kubectl create ns test
# 약 1분 뒤에
kubectl get serviceaccount -n test

 

serviceaccount가 생성되면 serviceaccount 토큰이 secret으로 자동생성됩니다. default serviceaccount도 마찬가지로 토큰이 secret으로 저장됩니다.

 kubectl get secret -n test

 

3. pod에 serviceaccount 토큰 마운트

pod를 생성할때 serviceaccount필드로 serviceaccount 토큰을 마운트 할 수 있습니다. 설정하지 않으면 default serviceaccount 토큰이 마운트됩니다. 아래 yaml은 default namespace에 있는 build-robot serviceaccount 토큰은 마운트하는 예제입니다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: build-robot

 

busybox를 pod로 실행 한 후, 마운트 목록을 확인하면 serviceaccount 디렉터리가 보입니다.

 kubectl run -it --image=busybox busybox -- /bin/sh
 # df -h

 

kube api server ca인증서, serviceaccount token이 보입니다.

 ls /var/run/secrets/kubernetes.io/serviceaccount

 

4. pod에서 kube api sevrer 요청

헤더에 마운트된 serviceaccount토큰을 사용하면 api server에 요청할 수 있습니다.

 

실습을 쉽게 하기 위해서 netshoot이미지를 사용하여 pod를 실행합니다.

kubectl run -it --image=nicolaka/netshoot netshoot -- zsh

 

curl 명령어로 kube api server에 요청을 날립니다. default serviceaccount은 아무 권한도 없기 때문에 forbidden응답을 받습니다.

cd  /run/secrets/kubernetes.io/serviceaccount
token=$(cat token)
curl -k -H "Authorization: Bearer ${token}" https://kubernetes.default.svc

 

5. 마치며

default serviceaccount에 rolebinding으로 권한을 부여하거나, 권한이 있는 serviceaccount를 pod 생성시 설정하면 kube api server에 요청할 수 있습니다. 

추천 예제는 pod를 생성, 조회 권한을 갖는 serviceaccount를 설정하고 jenkins pod에 설정합니다. 그리고 jenkins job에서 pod를 생성하고 조회해보세요!.

 

6. 참고자료

[1] [공식문서] serviceaccount: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/

반응형