임퍼스네이션에 대해서 잘 몰라서 정리 참고자료: https://kubernetes.io/docs/reference/access-authn-authz/authentication/#user-impersonation
Impersonate-User
Impersonate-Group
Impersonate-Extra-( extra name )
Impersonate-Uid
일반
kubectl drain mynode
Impersonation 사용 예시
kubectl drain mynode --as=superman --as-group=system:masters
ClusterRole에 impersonate verbs 필요
ClusterRole
impersonate
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: impersonator rules: - apiGroups: [""] resources: ["users", "groups", "serviceaccounts"] verbs: ["impersonate"]
다양한 예시
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: limited-impersonator rules: # Can impersonate the user "jane.doe@example.com" - apiGroups: [""] resources: ["users"] verbs: ["impersonate"] resourceNames: ["jane.doe@example.com"] # Can impersonate the groups "developers" and "admins" - apiGroups: [""] resources: ["groups"] verbs: ["impersonate"] resourceNames: ["developers","admins"] # Can impersonate the extras field "scopes" with the values "view" and "development" - apiGroups: ["authentication.k8s.io"] resources: ["userextras/scopes"] verbs: ["impersonate"] resourceNames: ["view", "development"] # Can impersonate the uid "06f6ce97-e2c5-4ab8-7ba5-7654dd08d52b" - apiGroups: ["authentication.k8s.io"] resources: ["uids"] verbs: ["impersonate"] resourceNames: ["06f6ce97-e2c5-4ab8-7ba5-7654dd08d52b"]
API 접근 확인
kubectl auth can-i create deployments --namespace dev
결과는 다음과 같이 출력
yes
관리자는 이를 사용자 가장(impersonation)과 병행하여 다른 사용자가 수행할 수 있는 작업을 결정 가능
kubectl auth can-i list secrets --namespace dev --as dave
SelfSubjectAccessReview는 authorization.k8s.io API 그룹의 일부로서 API 서버 인가를 외부 서비스에 노출
이 그룹의 기타 리소스에는 다음이 포함
SubjectAccessReview
LocalSubjectAccessReview
SelfSubjectRulesReview
이러한 API는 반환된 오브젝트의 응답 "status" 필드가 쿼리의 결과인 일반 쿠버네티스 리소스를 생성하여 쿼리 가능
kubectl create -f - -o yaml << EOF apiVersion: authorization.k8s.io/v1 kind: SelfSubjectAccessReview spec: resourceAttributes: group: apps resource: deployments verb: create namespace: dev EOF
다음 페이지 계속
생성된 SelfSubjectAccessReview 는 다음과 같다.
apiVersion: authorization.k8s.io/v1 kind: SelfSubjectAccessReview metadata: creationTimestamp: null spec: resourceAttributes: group: apps resource: deployments namespace: dev verb: create status: allowed: true denied: false
음... can-i 명령을 이용하여 모든 리소스 권한을 알 수는 없을까?
can-i
아래의 명령을 이용하면 가능
kubectl auth can-i --list
쿠버네티스 API 서버는 현재 상태를 나타내는 세 가지 API 엔드포인트(healthz, livez 와 readyz)를 제공
healthz 엔드포인트는 사용 중단(deprecated)됨 (쿠버네티스 v1.16 버전 이후)
-> 대신 보다 구체적인 livez 와 readyz 엔드포인트를 사용
livez
readyz
API 서버의 health/livez/readyz 를 사용하는 머신은 HTTP 상태 코드에 의존
모든 엔드포인트는 verbose 파라미터를 사용하여 검사 항목과 상태를 출력 가능 (API 서버의 현재 상태를 디버깅하는데 유용)
verbose
curl -k https://localhost:6443/livez?verbose
kubectl get --raw='/readyz?verbose'
[+]ping ok [+]log ok [+]etcd ok [+]poststarthook/start-kube-apiserver-admission-initializer ok [+]poststarthook/generic-apiserver-start-informers ok [+]poststarthook/start-apiextensions-informers ok [+]poststarthook/start-apiextensions-controllers ok [+]poststarthook/crd-informer-synced ok [+]poststarthook/bootstrap-controller ok ... [+]poststarthook/apiservice-openapi-controller ok healthz check passed
curl -k 'https://localhost:6443/readyz?verbose&exclude=etcd'
[+]ping ok [+]log ok ... [+]etcd excluded: ok healthz check passed
FEATURE STATE: Kubernetes v1.22 [alpha]
/livez/<healthcheck-name>
<healthcheck-name>
curl -k https://localhost:6443/livez/etcd
참고자료: https://khmirage.tistory.com/382
shutdown -h now