Kubelet Authentication & Authorization
Reading time: 4 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
Kubelet Authentication
기본적으로, 다른 구성된 인증 방법에 의해 거부되지 않은 kubelet의 HTTPS 엔드포인트에 대한 요청은 익명 요청으로 처리되며, **system:anonymous
**라는 사용자 이름과 **system:unauthenticated
**라는 그룹이 부여됩니다.
3 가지 인증 방법은 다음과 같습니다:
- 익명 (기본값): 매개변수
--anonymous-auth=true
또는 구성 설정을 사용합니다:
"authentication": {
"anonymous": {
"enabled": true
},
- Webhook: 이것은 kubectl API bearer tokens를 인증으로 활성화합니다 (유효한 모든 토큰이 유효합니다). 다음과 같이 허용합니다:
authentication.k8s.io/v1beta1
API 그룹이 API 서버에서 활성화되어 있는지 확인합니다.--authentication-token-webhook
및--kubeconfig
플래그로 kubelet을 시작하거나 다음 설정을 사용합니다:
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},
note
kubelet은 구성된 API 서버에서 TokenReview
API를 호출하여 사용자 정보를 결정합니다.
- X509 클라이언트 인증서: X509 클라이언트 인증서를 통해 인증을 허용합니다.
- 자세한 내용은 apiserver 인증 문서를 참조하십시오.
--client-ca-file
플래그로 kubelet을 시작하여 클라이언트 인증서를 검증할 CA 번들을 제공합니다. 또는 구성으로:
"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}
Kubelet Authorization
성공적으로 인증된 모든 요청(익명 요청 포함)은 그 다음에 권한이 부여됩니다. 기본 권한 부여 모드는 **AlwaysAllow
**로, 모든 요청을 허용합니다.
그러나 다른 가능한 값은 **webhook
**입니다(대부분의 경우 여기서 찾을 수 있는 것입니다). 이 모드는 인증된 사용자의 권한을 확인하여 작업을 허용하거나 거부합니다.
warning
익명 인증이 활성화되어 있더라도 익명 접근이 어떤 작업을 수행할 권한이 없을 수 있습니다.
웹훅을 통한 권한 부여는 **파라미터 --authorization-mode=Webhook
**를 사용하거나 구성 파일을 통해 설정할 수 있습니다:
"authorization": {
"mode": "Webhook",
"webhook": {
"cacheAuthorizedTTL": "5m0s",
"cacheUnauthorizedTTL": "30s"
}
},
kubelet은 구성된 API 서버에서 SubjectAccessReview
API를 호출하여 각 요청이 허가되었는지 결정합니다.
kubelet은 apiserver와 동일한 요청 속성 접근 방식을 사용하여 API 요청을 허가합니다:
- 작업
HTTP 동사 | 요청 동사 |
---|---|
POST | 생성 |
GET, HEAD | 가져오기 (개별 리소스의 경우), 목록 (전체 객체 내용을 포함한 컬렉션의 경우), 감시 (개별 리소스 또는 리소스 컬렉션을 감시하는 경우) |
PUT | 업데이트 |
PATCH | 패치 |
DELETE | 삭제 (개별 리소스의 경우), 컬렉션 삭제 (컬렉션의 경우) |
- Kubelet API와 통신하는 리소스는 항상 노드이며, 서브리소스는 들어오는 요청의 경로에서 결정됩니다:
Kubelet API | 리소스 | 서브리소스 |
---|---|---|
/stats/* | nodes | stats |
/metrics/* | nodes | metrics |
/logs/* | nodes | log |
/spec/* | nodes | spec |
모든 기타 | nodes | proxy |
예를 들어, 다음 요청은 권한 없이 kubelet의 포드 정보를 접근하려고 했습니다:
curl -k --header "Authorization: Bearer ${TOKEN}" 'https://172.31.28.172:10250/pods'
Forbidden (user=system:node:ip-172-31-28-172.ec2.internal, verb=get, resource=nodes, subresource=proxy)
- 우리는 금지됨을 받았으므로 요청이 인증 검사를 통과했습니다. 그렇지 않았다면 우리는 단지
권한 없음
메시지를 받았을 것입니다. - 사용자 이름(이 경우 토큰에서)을 볼 수 있습니다.
- 리소스가 노드였고 하위 리소스가 프록시였는지 확인하십시오(이전 정보와 일치합니다).
References
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
Azure 해킹 배우기 및 연습하기:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.