[K8S] 쿠버네티스 RBAC 관련 리소스들 정리 (Role, RoleBinding, ClusterRole, ClusterRoleBinding, Service Account)

NewNewDaddy·2023년 12월 30일
0

DOCKER-KUBERNETES

목록 보기
5/10
post-thumbnail

0. RBAC(Role Based Access Control)

  • 쿠버네티스의 RBAC (Role-Based Access Control)은 쿠버네티스 클러스터 내의 자원에 대한 접근 권한을 제어하고 관리하기 위한 보안 메커니즘입니다. RBAC는 다양한 사용자, 서비스 계정 및 그룹에게 어떤 동작과 자원에 대한 권한을 부여하거나 제한하는 데 사용됩니다.

    • Authentication(인증) : 접근하려는 사용자가 권한이 있는지 없는지 판단
    • Authorization(허가) : 사용자가 특정 작업을 수행할 수 있는지 판단

1. Role

  • 정의 : Role은 특정 네임스페이스 내의 리소스에 대한 접근 권한을 정의합니다. Role을 사용하면 사용자나 그룹에게 특정 리소스에 대한 읽기, 쓰기, 수정 등의 권한을 부여할 수 있습니다.

  • 사용 예시: 예를 들어, 특정 네임스페이스 내의 파드만 조회할 수 있는 권한, 특정 서비스를 생성하거나 삭제할 수 있는 권한 등을 Role을 통해 정의할 수 있습니다.

  • 정의 방법

    
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: pod-reader
    rules:
    - apiGroups: [""]
      verbs: ["get", "watch", "list"] # 권한을 줄 API 종류
      resources: ["pods", "pods/log"] # 권한을 주고자하는 액션
      resourceNames: ["nginx"] # 권한을 주고자하는 특정 리소스

2. RoleBinding

  • 정의: RoleBinding은 특정 Role을 사용자, 그룹, 또는 ServiceAccount에 연결합니다. 즉, RoleBinding을 통해 누가 해당 Role에 정의된 권한을 사용할 수 있는지 결정합니다.

  • 사용 예시: 만약 특정 사용자가 특정 네임스페이스 내의 파드를 조회할 수 있도록 하고 싶다면, 해당 사용자를 해당 권한을 가진 Role에 연결하는 RoleBinding을 생성합니다.

  • 정의 방법

    
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    namespace: [NAMESPACE NAME]
    metadata:
      name: read-pods
    
    # Role을 적용할 USER, GROUP 혹은 SERVICE ACCOUNT
    subjects:
    - kind: User
      name: [USER NAME]
      apiGroup: rbac.authorization.k8s.io
    - kind: Group
      name: [GROUP NAME]
      apiGroup: rbac.authorization.k8s.io
    - kind: ServiceAccount
      name: [SERVICE ACCOUNT NAME]
    
    # subjects에 명시된 내용에 적용할 Role
    roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io

3. ClusterRole

  • 정의: ClusterRole은 클러스터 전체에 걸쳐 특정 리소스에 대한 접근 권한을 정의합니다. ClusterRole은 네임스페이스를 넘어서는 리소스에 대한 권한(예: 노드) 또는 클러스터 전체 리소스(예: 시크릿)에 대한 권한을 부여할 수 있습니다.

  • 사용 예시: 예를 들어, 클러스터 전체의 모든 파드를 조회하거나, 클러스터 레벨의 리소스(노드, 퍼시스턴트볼륨 등)에 대한 관리 권한을 부여할 때 사용합니다.

  • 정의 방법

    
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: cluster-pod-reader
    rules:
    - apiGroups: [""]
      verbs: ["get", "watch", "list"] # 권한을 주고자하는 액션
      resources: ["pods", "pods/log"] # 권한을 주고자하는 특정 리소스

4. ClusterRoleBinding

  • 정의: ClusterRoleBinding은 특정 ClusterRole을 사용자, 그룹, 또는 ServiceAccount에 연결합니다. 이를 통해 해당 역할에 정의된 권한을 전체 클러스터에 걸쳐 사용할 수 있는 주체를 지정합니다.

  • 사용 예시: RoleBinding으로는 특정 namespace 내의 리소스 권한만 통제할 수 있기 때문에 전체 클러스터의 리소스에 대한 관리 권한을 특정 사용자나 서비스 계정에 부여하고 싶을 때 ClusterRoleBinding을 사용합니다.

  • 정의 방법

    
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: pod-reader-global
    subjects:
    - kind: User
      name: [USER NAME]
      apiGroup: rbac.authorization.k8s.io
    - kind: Group
      name: [GROUP NAME]
      apiGroup: rbac.authorization.k8s.io
    - kind: ServiceAccount
      name: [SERVICE ACCOUNT NAME]
    
    # subjects에 명시된 내용에 적용할 Role
    roleRef:
      kind: ClusterRole
      name: cluster-pod-reader
      apiGroup: rbac.authorization.k8s.io

5. ServiceAccount

  • 정의: ServiceAccount는 파드가 Kubernetes API와 상호작용할 때 사용하는 계정입니다. 각 파드는 특정 ServiceAccount과 연결되어 있으며, 이 계정을 통해 파드는 Kubernetes API에 접근합니다.

  • 사용 예시: 파드가 클러스터 내 다른 리소스를 조회하거나 조작할 필요가 있는 경우, 해당 작업을 수행할 권한을 가진 ServiceAccount를 파드와 연결합니다.

  • 정의 방법

    
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: [SERVICE ACCOUNT NAME]
  • User Account와 비교

    속성User AccountService Account
    식별개인 사용자 또는 인증 프로바이더에서 생성된 사용자 계정Kubernetes 내부 서비스 및 워크로드에 사용되는 계정
    주요 용도클러스터 관리 및 리소스 조작을 위한 사용자 인증Pod 내부에서 클러스터 리소스에 접근하기 위한 인증
    권한 범위권한은 Role-based Access Control (RBAC) 또는 다른 인증 메커니즘을 통해 관리됨Service Account에는 자동으로 제한된 권한 부여
    이름 관리일반적으로 사용자 이름 또는 식별자로 식별됨자동 생성되는 이름 (예: "default")
    인증 방법보통 패스워드, 토큰 또는 인증 키를 사용하여 인증토큰 기반의 인증 사용 (Service Account 토큰 자동 생성)
    Pod와의 연관성직접적으로 관련 없음Service Account를 특정 Pod에 연결하여 Pod가 해당 계정을 사용할 수 있도록 함
profile
데이터 엔지니어의 작업공간 / #PYTHON #SPARK #AWS #NCLOUD

0개의 댓글