Kubelet Authentication & Authorization

Support HackTricks

Kubelet Authentication

문서에서:

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

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

  • 익명 (기본값): 매개변수 --anonymous-auth=true 또는 구성 설정을 사용합니다:

"authentication": {
"anonymous": {
"enabled": true
},
  • Webhook: 이것은 kubectl API bearer tokens를 인증으로 활성화합니다 (유효한 모든 토큰이 유효합니다). 다음과 같이 허용합니다:

  • API 서버에서 authentication.k8s.io/v1beta1 API 그룹이 활성화되어 있는지 확인합니다.

  • --authentication-token-webhook--kubeconfig 플래그로 kubelet을 시작하거나 다음 설정을 사용합니다:

"authentication": {
"webhook": {
"cacheTTL": "2m0s",
"enabled": true
},

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

  • X509 클라이언트 인증서: X509 클라이언트 인증서를 통해 인증을 허용합니다.

  • 자세한 내용은 apiserver 인증 문서를 참조하십시오.

  • --client-ca-file 플래그로 kubelet을 시작하여 클라이언트 인증서를 검증할 CA 번들을 제공합니다. 또는 구성으로:

"authentication": {
"x509": {
"clientCAFile": "/etc/kubernetes/pki/ca.crt"
}
}

Kubelet Authorization

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

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

익명 인증이 활성화되어 있더라도 익명 액세스어떤 작업도 수행할 권한이 없을 수 있습니다는 점에 유의하십시오.

웹후크를 통한 권한 부여는 **매개변수 --authorization-mode=Webhook**를 사용하거나 구성 파일을 통해 구성할 수 있습니다:

"authorization": {
"mode": "Webhook",
"webhook": {
"cacheAuthorizedTTL": "5m0s",
"cacheUnauthorizedTTL": "30s"
}
},

The kubelet은 구성된 API 서버에서 SubjectAccessReview API를 호출하여 각 요청이 허가되었는지 결정합니다.

kubelet은 apiserver와 동일한 요청 속성 접근 방식을 사용하여 API 요청을 허가합니다:

  • 작업

HTTP 동사요청 동사

POST

생성

GET, HEAD

가져오기 (개별 리소스의 경우), 목록 (전체 객체 내용을 포함한 컬렉션의 경우), 감시 (개별 리소스 또는 리소스 컬렉션을 감시하는 경우)

PUT

업데이트

PATCH

패치

DELETE

삭제 (개별 리소스의 경우), 컬렉션 삭제 (컬렉션의 경우)

  • Kubelet API와 통신하는 리소스항상 노드이며, 서브리소스는 들어오는 요청의 경로에서 결정됩니다:

Kubelet API리소스서브리소스

/stats/*

노드

stats

/metrics/*

노드

metrics

/logs/*

노드

log

/spec/*

노드

spec

모든 기타

노드

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

Support HackTricks

Last updated