website/content/ko/docs/reference/access-authn-authz/kubelet-authn-authz.md

84 lines
4.1 KiB
Markdown
Raw Normal View History

---
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