설명
같은 네임스페이스의 여러 워크로드가 같은 serviceAccountName을 사용하면 동일한 서비스 계정의 API 권한을 사용합니다. 현재의 파드에 연결된 토큰은 파드별로 발급되므로 같은 계정이라고 토큰 문자열까지 동일한 것은 아닙니다. 하나의 워크로드가 침해되면 공유 계정의 권한 범위가 악용될 수 있습니다.
워크로드마다 역할이 다르면 ServiceAccount도 분리하는 것이 좋습니다. 같은 애플리케이션의 복제본처럼 권한 요구가 같은 파드가 계정을 공유하는 것은 정상적인 구성일 수 있습니다.
잠재적 영향
- 서로 다른 워크로드에 필요 이상의 공통 권한이 부여될 수 있습니다.
- 하나의 워크로드 침해로 공유 계정이 접근할 수 있는 다른 리소스도 영향을 받을 수 있습니다.
- 감사 로그에서 어떤 워크로드가 요청했는지 구분하기 어려워질 수 있습니다.
해결 방법
- 업무가 다른 워크로드에는 서로 다른 ServiceAccount를 사용하세요.
- 공용 ServiceAccount에 과도한 권한이 연결돼 있지 않은지 점검하세요.
- 애플리케이션의 권한 요구에 따라 계정을 구분하고 각 계정에 필요한 RBAC 권한만 부여하세요.
예시
두 파드는 같은 네임스페이스에 배포한다고 가정합니다. 참조하는 ServiceAccount와 필요한 역할 바인딩은 별도로 생성해야 합니다.
변경 전
yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
serviceAccountName: service1
containers:
- name: mycontainer
image: redis
---
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
serviceAccountName: service1
containers:
- name: envars-test-container
image: nginx
변경 후
yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
serviceAccountName: service1
containers:
- name: mycontainer
image: redis
---
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
serviceAccountName: service2
containers:
- name: envars-test-container
image: nginx
설명:
- 변경 전: 두 워크로드가 같은 ServiceAccount의 권한을 사용합니다. 권한 요구가 다르다면 분리하세요.
- 변경 후: 서로 다른 ServiceAccount를 지정합니다. 실제 권한 분리를 위해 각 계정의 역할 바인딩도 구분해야 합니다.