설명
Tiller는 Helm 2의 서버 구성요소이며 자신의 서비스 계정 권한으로 Kubernetes 리소스를 관리합니다. 클러스터 내부에서 도달 가능한 엔드포인트에 적절한 인증이 없으면 다른 워크로드가 그 권한으로 작업을 요청할 수 있습니다.
Helm 2는 2020년 11월부터 보안 업데이트를 받지 않습니다. 지원되는 Tiller 없는 Helm 버전으로 전환하세요.
잠재적 영향
- 허가되지 않은 요청으로 배포나 다른 리소스가 변경될 수 있습니다. 영향 범위는 Tiller에 부여된 권한에 달려 있습니다.
- 침해된 Pod가 접근 가능한 관리 엔드포인트를 통해 다른 워크로드에 영향을 줄 수 있습니다.
해결 방법
- 릴리스 정보와 배포 절차를 검증하며 Tiller 없는 방식으로 이전한 뒤 Tiller를 제거하세요.
- 즉시 제거할 수 없다면 루프백 바인딩이나 인증된 TLS 연결로 접근을 제한하고 서비스 계정 권한을 최소화하세요.
- 같은 Pod의 컨테이너와 포트 전달 권한도 확인하세요. 루프백 바인딩만으로 모든 관리 접근이 차단되지는 않습니다.
예시
아래는 과거 Tiller Deployment의 리스닝 주소를 비교한 발췌입니다. 실제 이미지, selector와 서비스 계정 설정은 별도로 필요하며 새 Tiller 설치를 권장하는 예제가 아닙니다.
변경 전
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tiller-bad-args
labels:
app: helm
name: tiller
spec:
template:
metadata:
labels:
app: helm
name: tiller
spec:
containers:
- name: tiller-v2
image: tiller-image
args:
- "--listen=10.7.2.8:44134"
Tiller가 해당 주소를 가진 환경에서는 루프백 이외의 인터페이스로 요청을 받을 수 있습니다. 실제 도달 가능 여부와 TLS 인증 설정을 함께 확인해야 합니다.
변경 후
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: tiller-deploy
labels:
app: helm
name: tiller
spec:
template:
metadata:
labels:
app: helm
name: tiller
spec:
containers:
- name: tiller
image: tiller-image
args:
- "--listen=127.0.0.1:44134"
리스닝 주소를 127.0.0.1로 제한합니다. 같은 Pod의 프로세스나 허가된 포트 전달 경로는 여전히 접근할 수 있으므로 권한 제한과 마이그레이션이 필요합니다.