이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

99. Kubernetes 보안 설정 automountServiceAccountToken: false

이쿠우우 2022. 5. 5. 16:38
반응형

 

 
 

automountServiceAccountToken: false 설정

 

취약점 분석

 
모든 namespace에는 default ServiceAccount가 존재하고 있음.
아래와 같이 default sa 확인 가능.
[namespace service account 확인]

 
이러한 default ServiceAccount는 pod를 생성할 때 사용됨.
pod와 ServiceAccount에 별도의 설정이 없다면 kubernetes는 default로
Pod 생성 시 ServiceAccount를 무조건 사용하게 되어 있음. 
즉 관리자가 별도로지 pod를 생성할 때  ServiceAccount를 지정하지 않아도
Pod를 확인해 보면 자동으로 ServiceAccount가 mount되어 있는것을 확인할 수 있음.

 
위 image에서 확인한 바와 같이
pod 생성 시 관리가 별도로 ServiceAccount를 지정하지 않아도
자동으로 namespace의 default ServiceAccount를 사용하는 것을 알 수 있음.
 
kubernetes는 default로 ServiceAccount를 사용하게 되면 ServiceAccount의 API Token을 Volumes로 mount함.
mount 경로는 /var/run/secrets/kubernetes.io/serviceaccount 임.
해당 경로에는 API인증을 위한 인증서와, Token이 들어 있음.
 
해당 default ServiceAccount의 Token을 통해 pod에서 kube-apiserver로 접근이 가능함.
직접 확인해보겠음.
 
[pod 내부에서 kube-apiserver로 접속하는 명령어]
kubectl exec -it test -- sh
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
TOKEN=$(cat ${SERVICEACCOUNT}/token)
CACERT=${SERVICEACCOUNT}/ca.crt
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api
 

 

[결과]
다음과 같이 pod에서 자동으로 mount된 default ServiceAccount 정보로
kube-apiserver에 접근할 수 있음.

 

 
하지만 default ServiceAccount의 경우 
unauthenticated user(인증되지 않은 사용자) 권한만 가지고 있어서
kubernetes cluster의 정보를 모두 확인할 수는 없음.
 
[결과]

 
하지만 default ServiceAccount에 보다 많은 권한이 부여되어있다면
pod에서 kubernetes cluster 정보를 확인할 수 있는 상태가 됨.
 
위에서 알아본 바와 같이 pod에 자동으로 mount되는 default ServiceAccount 정보로
kube-apiserver로 접근이 가능함.
 

결론

 
하지만 일반적으로 Pod는 애플리케이션을 운영하기 위한 목적으로 사용하지,
Pod를 통해 kube-apiserver로 접근하는 경우는 거의 없음.
즉 일반적으로 사용하지도 않은 ServiceAccount Token 정보가 pod 내부의 mount되어있음.
만약 해당 Token이 악의적인 사용자에게 탈취 당한다면 
공격자는 해당 Token을 이용해서 kube-apiserver에 접근이 가능함.
그렇기 때문에 pod 내부에 ServiceAccount Token 정보가 mount되면 안됨.
 
 

해결책1.

ServiceAccount 생성 시 
자동으로 mount되지 않도록 하는 옵션을 추가함.
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-robot
automountServiceAccountToken: false
...
 
 

해결책2.

Pod 생성 시 
ServiceAccount가 자동으로 mount되지 않도록 하는 옵션을 추가함.
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: build-robot
  automountServiceAccountToken: false
  ...
 
 
 

 
참고

 

반응형