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 지원하기

Kubelet Authentication

문서에서:

기본적으로, 다른 구성된 인증 방법에 의해 거부되지 않은 kubelet의 HTTPS 엔드포인트에 대한 요청은 익명 요청으로 처리되며, **system:anonymous**라는 사용자 이름과 **system:unauthenticated**라는 그룹이 부여됩니다.

3 가지 인증 방법은 다음과 같습니다:

  • 익명 (기본값): 매개변수 --anonymous-auth=true 또는 구성 설정을 사용합니다:
json
"authentication": {
"anonymous": {
"enabled": true
},
  • Webhook: 이것은 kubectl API bearer tokens를 인증으로 활성화합니다 (유효한 모든 토큰이 유효합니다). 다음과 같이 허용합니다:
  • authentication.k8s.io/v1beta1 API 그룹이 API 서버에서 활성화되어 있는지 확인합니다.
  • --authentication-token-webhook--kubeconfig 플래그로 kubelet을 시작하거나 다음 설정을 사용합니다:
json
"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},

note

kubelet은 구성된 API 서버에서 TokenReview API를 호출하여 사용자 정보를 결정합니다.

  • X509 클라이언트 인증서: X509 클라이언트 인증서를 통해 인증을 허용합니다.
  • 자세한 내용은 apiserver 인증 문서를 참조하십시오.
  • --client-ca-file 플래그로 kubelet을 시작하여 클라이언트 인증서를 검증할 CA 번들을 제공합니다. 또는 구성으로:
json
"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}

Kubelet Authorization

성공적으로 인증된 모든 요청(익명 요청 포함)은 그 다음에 권한이 부여됩니다. 기본 권한 부여 모드는 **AlwaysAllow**로, 모든 요청을 허용합니다.

그러나 다른 가능한 값은 **webhook**입니다(대부분의 경우 여기서 찾을 수 있는 것입니다). 이 모드는 인증된 사용자의 권한을 확인하여 작업을 허용하거나 거부합니다.

warning

익명 인증이 활성화되어 있더라도 익명 접근어떤 작업을 수행할 권한이 없을 수 있습니다.

웹훅을 통한 권한 부여는 **파라미터 --authorization-mode=Webhook**를 사용하거나 구성 파일을 통해 설정할 수 있습니다:

json
"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/*nodesstats
/metrics/*nodesmetrics
/logs/*nodeslog
/spec/*nodesspec
모든 기타nodesproxy

예를 들어, 다음 요청은 권한 없이 kubelet의 포드 정보를 접근하려고 했습니다:

bash
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 지원하기