반응형
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
APISERVER=https://kubernetes.default.svc
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
...
|
참고
반응형
'Kubernetes > Kubernetes 보안' 카테고리의 다른 글
Kubernetes 보안 설정 --insecure-port=0 (0) | 2022.05.05 |
---|---|
Kubernetes 보안 설정 --anonymous-auth=false (1) | 2022.05.05 |
kube-bench (0) | 2022.05.01 |
Portieris (v0.12.2) (0) | 2022.02.23 |
Kubernetes ImagePolicyWebhook (0) | 2021.04.05 |