84 lines
4.1 KiB
Markdown
84 lines
4.1 KiB
Markdown
|
---
|
||
|
title: Kubelet 인증/인가
|
||
|
---
|
||
|
|
||
|
|
||
|
## 개요
|
||
|
|
||
|
kubelet의 HTTPS 엔드포인트는 다양한 민감도의 데이터에 대한 접근을 제공하는 API를 노출하며,
|
||
|
노드와 컨테이너 내에서 다양한 수준의 권한으로 작업을 수행할 수 있도록 허용한다.
|
||
|
|
||
|
이 문서는 kubelet의 HTTPS 엔드포인트에 대한 접근을 인증하고 인가하는 방법을 설명한다.
|
||
|
|
||
|
## Kubelet 인증
|
||
|
|
||
|
기본적으로, 다른 구성의 인증 방법에 의해 거부되지 않은 kubelet의 HTTPS 엔드포인트에 대한 요청은
|
||
|
익명의 요청으로 처리되며, `system:anonymous`의 사용자 이름과 `system:unauthenticated`
|
||
|
의 그룹이 부여된다.
|
||
|
|
||
|
익명의 접근을 비활성화하고 인증되지 않은 요청에 `401 Unauthorized` 응답을 보내려면 아래를 참고한다.
|
||
|
|
||
|
* `--anonymous-auth=false` 플래그로 kubelet을 시작
|
||
|
|
||
|
kubelet의 HTTPS 엔드포인트에 대한 X509 클라이언트 인증서 인증을 활성화하려면 아래를 참고한다.
|
||
|
|
||
|
* `--client-ca-file` 플래그로 kubelet을 시작하면 클라이언트 인증서를 확인할 수 있는 CA 번들을 제공
|
||
|
* `--kubelet-client-certificate` 및 `--kubelet-client-key` 플래그로 apiserver를 시작
|
||
|
* 자세한 내용은 [apiserver 인증 문서](/docs/reference/access-authn-authz/authentication/#x509-client-certs)를 참고
|
||
|
|
||
|
API bearer 토큰(서비스 계정 토큰 포함)을 kubelet의 HTTPS 엔드포인트 인증에 사용하려면 아래를 참고한다.
|
||
|
|
||
|
* API 서버에서 `authentication.k8s.io/v1beta1` API 그룹이 사용 가능한지 확인
|
||
|
* `--authentication-token-webhook` 및 `--kubeconfig` 플래그로 kubelet을 시작
|
||
|
* kubelet은 구성된 API 서버의 `TokenReview` API를 호출하여 bearer 토큰에서 사용자 정보를 결정
|
||
|
|
||
|
## Kubelet 승인
|
||
|
|
||
|
성공적으로 인증된 모든 요청(익명 요청 포함)이 승인된다. 기본 인가 모드는 모든 요청을 허용하는 `AlwaysAllow` 이다.
|
||
|
|
||
|
kubelet API에 대한 접근을 세분화하는 데는 다양한 이유가 있다.
|
||
|
|
||
|
* 익명 인증을 사용할 수 있지만, 익명 사용자의 kubelet API 호출 기능은 제한되어야 함
|
||
|
* bearer 토큰 인증을 사용할 수 있지만, 임의의 API 사용자(API 계정)의 kubelet API 호출 기능은 제한되어야 함
|
||
|
* 클라이언트 인증을 사용할 수 있지만, 구성된 CA에서 서명한 일부 클라이언트 인증서만 kubelet API를 사용하도록 허용해야 함
|
||
|
|
||
|
kubelet API에 대한 접근을 세분화하려면 API 서버에 권한을 위임한다.
|
||
|
|
||
|
* `authorization.k8s.io/v1beta1` API 그룹이 API 서버에서 사용 가능한지 확인
|
||
|
* `--authorization-mode=Webhook` 및 `--kubeconfig` 플래그로 kubelet을 시작
|
||
|
* kubelet은 구성된 API 서버의 `SubjectAccessReview` API를 호출하여 각각의 요청이 승인되었는지 여부를 확인
|
||
|
|
||
|
kubelet은 API 요청을 apiserver와 동일한 [요청 속성](/ko/docs/reference/access-authn-authz/authorization/#요청-속성-검토) 접근 방식을 사용하여 승인한다.
|
||
|
|
||
|
동사는 들어오는 요청의 HTTP 동사로부터 결정된다.
|
||
|
|
||
|
HTTP 동사 | 요청 동사
|
||
|
----------|---------------
|
||
|
POST | create
|
||
|
GET, HEAD | get
|
||
|
PUT | update
|
||
|
PATCH | patch
|
||
|
DELETE | delete
|
||
|
|
||
|
리소스 및 하위 리소스는 들어오는 요청의 경로로부터 결정된다.
|
||
|
|
||
|
Kubelet API | 리소스 | 하위 리소스
|
||
|
-------------|----------|------------
|
||
|
/stats/\* | nodes | stats
|
||
|
/metrics/\* | nodes | metrics
|
||
|
/logs/\* | nodes | log
|
||
|
/spec/\* | nodes | spec
|
||
|
*all others* | nodes | proxy
|
||
|
|
||
|
네임스페이스와 API 그룹 속성은 항상 빈 문자열이며,
|
||
|
리소스 이름은 항상 kubelet의 `Node` API 오브젝트 이름이다.
|
||
|
|
||
|
이 모드로 실행할 때, `--kubelet-client-certificate` 및 `--kubelet-client-key` 플래그로 식별된 사용자에게
|
||
|
다음 속성에 대한 권한이 있는지 확인한다.
|
||
|
|
||
|
* verb=\*, resource=nodes, subresource=proxy
|
||
|
* verb=\*, resource=nodes, subresource=stats
|
||
|
* verb=\*, resource=nodes, subresource=log
|
||
|
* verb=\*, resource=nodes, subresource=spec
|
||
|
* verb=\*, resource=nodes, subresource=metrics
|