귀찮게하기/DevOps-SRE

[Kubernetes] RBAC

게임이 더 좋아 2025. 4. 5. 16:54
반응형
728x170

RBAC (Role-Based Access Control)란?

RBAC는 Kubernetes 내 리소스에 대한 접근을 제어하기 위한 권한 기반 접근 제어

 

 

 

RBAC의 구성 요소

1. Role / ClusterRole

  • Role: 특정 namespace 내 권한 정의
  • ClusterRole: 클러스터 전체 혹은 여러 namespace에 걸친 권한 정의
# Role 예시
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

2. RoleBinding / ClusterRoleBinding

  • RoleBinding: Role을 특정 사용자, 그룹 또는 ServiceAccount에 namespace 단위로 연결
  • ClusterRoleBinding: ClusterRole을 클러스터 전체에 연결
# RoleBinding 예시
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: dev
subjects:
- kind: User
  name: alice
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

3. ServiceAccount

  • Kubernetes 내부에서 Pod가 API 서버와 통신할 때 사용하는 계정
  • 기본적으로 네임스페이스별로 자동 생성됨 (default ServiceAccount)
kubectl create serviceaccount my-sa -n dev

RBAC 구성 및 확인

클러스터 내 역할 및 바인딩 목록 조회

# 모든 Role 확인
kubectl get roles --all-namespaces

# 모든 RoleBinding 확인
kubectl get rolebindings --all-namespaces

# 모든 ClusterRole 확인
kubectl get clusterroles

# 모든 ClusterRoleBinding 확인
kubectl get clusterrolebindings

 

특정 Role/Binding 상세 확인

kubectl describe role pod-reader -n dev
kubectl describe rolebinding read-pods -n dev

 

ServiceAccount에 역할 부여

# 네임스페이스 생성
kubectl create namespace dev

# ServiceAccount 생성
kubectl create serviceaccount sa-reader -n dev

# Role 생성
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]
EOF

# RoleBinding 생성
kubectl create rolebinding rb-pod-reader \
  --role=pod-reader \
  --serviceaccount=dev:sa-reader \
  -n dev

권한 테스트 및 오류 확인

# sa-reader가 Pod 목록 조회 가능 여부 확인
kubectl auth can-i list pods --as=system:serviceaccount:dev:sa-reader -n dev
# 예상 출력: yes

# sa-reader가 Pod 삭제 가능 여부 확인
kubectl auth can-i delete pods --as=system:serviceaccount:dev:sa-reader -n dev
# 예상 출력: no

# 권한 부족 시나리오 테스트 (직접 Pod 접근 시도)
kubectl get pods -n dev --as=system:serviceaccount:dev:sa-reader
# 성공 시 Pod 목록 출력

 

 


실제 환경에서는

  • 최소 권한 원칙 (Least Privilege Principle)
  • 정기적인 권한 감사 및 불필요한 권한 제거
  • 네임스페이스 별 권한 분리
  • kubectl auth can-i 명령으로 권한 확인 및 디버깅

실제 환경

+------------------+       +------------------+       +------------------+
|      Role        |<----->|   RoleBinding    |<----->|  ServiceAccount  |
| (Namespace 내    |       | (역할과 주체 연결)|       | (Pod의 신원)     |
| 권한 정의)       |       +------------------+       +------------------+
+------------------+                |                        |
       |                            |                        |
       | Defines Permissions        | Binds to                |
       |                            |                        |
       v                            v                        v
+------------------+       +------------------+       +------------------+
| Kubernetes       |       | Users / Groups   |       | Pods             |
| Resources        |       | (인간 사용자)     |       | (워크로드 실행)   |
| (Pods, ConfigMap)|       +------------------+       +------------------+
| etc.)            |                                          |
+------------------+                                          |
       |                                                     |
       | In EKS: AWS IAM Role                                |
       | Assumed via IRSA                                    |
       v                                                     v
+------------------+                                 +------------------+
| AWS Resources    |<--------------------------------| AWS IAM Role     |
| (S3, DynamoDB,   |                                 | (EKS에서 Pod에   |
| etc.)            |                                 | 연결)            |
+------------------+                                 +------------------+
  • Role: 네임스페이스 내에서 특정 리소스(예: Pods)에 대한 권한(get, list 등)을 정의
  • RoleBinding: Role을 특정 주체(사용자, 그룹, ServiceAccount)에 연결
  • ServiceAccount: Pod가 Kubernetes API와 통신할 때 사용하는 어카운트
  • EKS에서 AWS 리소스 접근: ServiceAccount에 AWS IAM Role을 연결(IRSA: IAM Roles for Service Accounts)하여 AWS 리소스(S3, DynamoDB 등)에 접근
    • IRSA는 ServiceAccount와 AWS IAM Role을 연결하는 메커니즘으로, Pod가 AWS SDK/API를 호출할 때 필요한 권한을 부여

 


 

예시

  • dev 네임스페이스에서 Pod 목록을 조회할 수 있는 권한 부여
  • Pod가 AWS S3 버킷(my-bucket)에 접근할 수 있도록 설정

 

 

1. Role 생성

dev 네임스페이스에서 Pod를 조회할 수 있는 권한을 정의

# pod-reader-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list"]

2. ServiceAccount 생성

Pod가 사용할 ServiceAccount를 생성

EKS에서 AWS IAM Role과 연결하려면 Annotation을 추가

# s3-access-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: dev
  name: s3-access-sa
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/eks-s3-access-role
  • eks.amazonaws.com/role-arn은 AWS IAM Role의 ARN을 지정하며, IRSA를 통해 이 ServiceAccount가 해당 IAM Role을 assume

 

3. RoleBinding 생성

pod-reader Role을 s3-access-sa ServiceAccount에 연결

# pod-reader-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: dev
  name: pod-reader-binding
subjects:
- kind: ServiceAccount
  name: s3-access-sa
  namespace: dev
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

4. AWS IAM Role 및 정책 (EKS에서 S3 접근)

AWS IAM Role을 생성하고, S3 버킷에 접근할 수 있는 정책

# IAM 정책 (s3-access-policy.json)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ]
    }
  ]
}

IAM Role 생성 후, EKS 클러스터의 OIDC 제공자와 신뢰 관계를 설정

# IAM Role 신뢰 관계 (trust-policy.json)
{
"Version": "2012-10-17",
"Statement": [
  {
    "Effect": "Allow",
    "Principal": {
      "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716B304"
    },
    "Action": "sts:AssumeRoleWithWebIdentity",
    "Condition": {
      "StringEquals": {
        "oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716B304:sub": "system:serviceaccount:dev:s3-access-sa"
      }
    }
  }
]
}

5. Pod에서 테스트

ServiceAccount를 사용하는 Pod를 배포해 S3 접근을 테스트

# test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  namespace: dev
  name: s3-test-pod
spec:
  serviceAccountName: s3-access-sa
  containers:
  - name: aws-cli
    image: amazon/aws-cli
    command: ["sh", "-c", "aws s3 ls s3://my-bucket && sleep 3600"]
  • 실행:
    kubectl apply -f test-pod.yaml
    kubectl logs s3-test-pod -n dev
    • 성공 시 my-bucket의 객체 목록이 출력

 

6. 권한 확인

Kubernetes와 AWS 권한이 제대로 작동하는지 확인

# Kubernetes 권한 확인
kubectl auth can-i list pods --as=system:serviceaccount:dev:s3-access-sa -n dev
# 출력: yes

# AWS S3 접근 확인 (Pod 내부에서)
kubectl exec -it s3-test-pod -n dev -- aws s3 ls s3://my-bucket

 

참고 문서 및 리소스

728x90
반응형
그리드형

'귀찮게하기 > DevOps-SRE' 카테고리의 다른 글

[Kubernetes] ingress - external dns - route53(cloud dns server)  (0) 2025.04.05
DevOps - Argo CD  (0) 2025.03.31
DevOps - Helm  (0) 2025.03.31
DevOps - ArgoCD APP of APPS  (0) 2025.03.18
내 컴퓨터가 해킹당했다면?  (0) 2025.02.16