이 글은 CloudNet@팀의 AWS EKS Workshop Study(AEWS) 3기 스터디 내용을 바탕으로 작성되었습니다.
AEWS는 CloudNet@의 '가시다'님께서 진행하는 스터디로, EKS를 학습하는 과정입니다.
EKS를 깊이 있게 이해할 기회를 주시고, 소중한 지식을 나눠주시는 가시다님께 다시 한번 감사드립니다.
이 글이 EKS를 학습하는 분들께 도움이 되길 바랍니다.
RBAC(Role-Based Access Control) 관련 Kubernetes Krew 플러그인을 활용하여 클러스터 내 권한을 확인하고 관리하는 방법을 설명합니다.
RBAC는 Kubernetes 클러스터 내에서 사용자, 그룹, 서비스 어카운트의 권한을 관리하는 핵심적인 보안 메커니즘이며, 이를 효율적으로 관리하기 위해 다양한 Krew 플러그인을 사용할 수 있습니다.
RBAC는 Kubernetes 내에서 특정 API 리소스에 대한 접근을 제어하는 권한 관리 방식입니다.
RBAC의 주요 개념은 다음과 같습니다.
🔹 RBAC에서 사용되는 주요 Verbs(권한 종류)
| 약어 | Verbs | 설명 |
|---|---|---|
| G | Get | 리소스를 조회할 수 있음 (get) |
| L | List | 리소스를 목록으로 나열할 수 있음 (list) |
| W | Watch | 리소스를 감시할 수 있음 (watch) |
| C | Create | 새 리소스를 생성할 수 있음 (create) |
| U | Update | 기존 리소스를 수정할 수 있음 (update) |
| P | Patch | 리소스의 일부를 패치할 수 있음 (patch) |
| D | Delete | 리소스를 삭제할 수 있음 (delete) |
| DC | Delete Collection | 여러 개의 리소스를 삭제할 수 있음 (deletecollection) |
Krew는 kubectl을 확장하는 패키지 매니저로, 여러 유용한 플러그인을 쉽게 설치할 수 있습니다.
# 설치
kubectl krew install access-matrix rbac-tool rbac-view rolesum whoami
🔹 설명
access-matrix : 클러스터 및 네임스페이스 내 리소스 접근 권한을 매트릭스로 확인합니다.rbac-tool : RBAC 권한 조회 및 정책 규칙을 분석합니다.rolesum : 특정 사용자, 그룹 또는 서비스 어카운트에 대한 권한을 요약합니다.whoami : 현재 클러스터에서 인증된 주체(사용자)를 확인합니다.rbac-view : RBAC 권한을 웹 인터페이스로 시각화합니다.현재 클러스터에서 인증된 주체를 확인합니다.
# k8s 인증된 주체 확인
kubectl whoami
# 출력 예시
arn:aws:iam::9112...:user/admin

클러스터 및 네임스페이스 내 리소스에 대한 RBAC 권한을 매트릭스로 확인합니다.
# Show an RBAC access matrix for server resources
kubectl access-matrix -h
kubectl access-matrix # Review access to cluster-scoped resources
kubectl access-matrix --namespace default # Review access to namespaced resources in 'default'



RBAC 권한 조회 및 정책 규칙을 분석합니다.
# RBAC Lookup by subject (user/group/serviceaccount) name
kubectl rbac-tool -h
kubectl rbac-tool lookup
kubectl rbac-tool lookup system:masters
SUBJECT | SUBJECT TYPE | SCOPE | NAMESPACE | ROLE
+----------------+--------------+-------------+-----------+---------------+
system:masters | Group | ClusterRole | | cluster-admin



kubectl rbac-tool lookup system:nodes # eks:node-bootstrapper
kubectl rbac-tool lookup system:bootstrappers # eks:node-bootstrapper
kubectl describe ClusterRole eks:node-bootstrapper

# RBAC List Policy Rules For subject (user/group/serviceaccount) name
kubectl rbac-tool policy-rules
kubectl rbac-tool policy-rules -e '^system:.*'
kubectl rbac-tool policy-rules -e '^system:authenticated'



# Generate ClusterRole with all available permissions from the target cluster
kubectl rbac-tool show

# Shows the subject for the current context with which one authenticates with the cluster
kubectl rbac-tool whoami
# 출력 예시
{Username: "arn:aws:iam::911283...:user/admin", <<-- 과거 "kubernetes-admin"에서 변경됨
UID: "aws-iam-authenticator:911283.:AIDA5ILF2FJI...",
Groups: ["system:authenticated"], <<-- 과거 "system:master"는 안보임
Extra: {accessKeyId: ["AKIA5ILF2FJI....."],
arn: ["arn:aws:iam::9112834...:user/admin"],
canonicalArn: ["arn:aws:iam::9112834...:user/admin"],
principalId: ["AIDA5ILF2FJI...."],
sessionName: [""]}}
sigs.k8s.io/aws-iam-authenticator/principalId: ["AIDA5IL..."]}}

특정 사용자/그룹/서비스 어카운트의 RBAC을 요약(Summary)하여 확인할 수 있습니다.
# Summarize RBAC roles for subjects : ServiceAccount(default), User, Group
kubectl rolesum -h
kubectl rolesum aws-node -n kube-system # sa
kubectl rolesum -k User system:kube-proxy # user
kubectl rolesum -k Group system:masters # group
kubectl rolesum -k Group system:nodes
kubectl rolesum -k Group system:authenticated # 인증이 통과되면 system:authenticated 그룹에 포함된다.
# 출력 예시
Policies:
• [CRB] */system:basic-user ⟶ [CR] */system:basic-user
Resource Name Exclude Verbs G L W C U P D DC
selfsubjectaccessreviews.authorization.k8s.io [*] [-] [-] ✖ ✖ ✖ ✔ ✖ ✖ ✖ ✖
selfsubjectreviews.authentication.k8s.io [*] [-] [-] ✖ ✖ ✖ ✔ ✖ ✖ ✖ ✖
selfsubjectrulesreviews.authorization.k8s.io [*] [-] [-] ✖ ✖ ✖ ✔ ✖ ✖ ✖ ✖
• [CRB] */system:discovery ⟶ [CR] */system:discovery
• [CRB] */system:public-info-viewer ⟶ [CR] */system:public-info-viewer


RBAC 권한을 웹 UI에서 시각적으로 확인할 수 있습니다.
# [운영서버1 EC2 : 터미널1] A tool to visualize your RBAC permissions
# RBAC 뷰어 실행
kubectl rbac-view
# 출력 예시
INFO[0000] Getting K8s client
INFO[0000] serving RBAC View and http://localhost:8800
## 이후 해당 운영서버1 EC2 공인 IP:8800 웹 접속 : 최초 접속 후 정보 가져오는데 다시 시간 걸림 (2~3분 정도 후 화면 출력됨)
echo -e "RBAC View Web http://$(curl -s ipinfo.io/ip):8800"

