새소식

AWS/EKS

[PKOS Study 5주차] k8s Security - RBAC

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 PKOS 2기 Study 내용 요약

해당 Kubernetes Study 는 '24단계 실습으로 정복하는 쿠버네티스' 책을 기반으로 진행 중입니다.

 

이번 포스팅에서는 쿠버네티스 RBAC(Role Based Access Contol) 에 대해 알아보겠습니다.

 

1. RBAC

RBAC 은 쿠버네티스 인가(Authorization) 방식 중 하나

  • 인증(Authentication) : 로그인 등의 절차를 걸쳐 사용자가 누구인지 확인하는 과정
  • 인가(Authorization) : 인증 과정을 거친 사용자가 어떤 권한을 가지는지 확인하는 과정

 

  • RBAC 구성 요소
  1. Role / ClusterRole / Service Account
    - 롤 & 클러스터롤은 쿠버네티스 리소스에 부여되는 권한 / ServiceAccount(SA)는 리소스의 역할
  2. RoleBinding / ClusterRoleBinding
    - 특정 네임스페이스에 한정된 권한 '부여' / 클러스터 전체 수준의 권한 '부여'

 

1.1. Service Account

 

# Namespace 생성
kubectl create ns dev-team
kubectl create ns infra-team

# 네임스페이스에 각각 서비스 어카운트 생성
kubectl create sa dev-k8s -n dev-team
kubectl create sa infra-k8s -n infra-team

 

# dev-team Namespace 에 파드 생성
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: dev-kubectl
  namespace: dev-team
spec:
  serviceAccountName: dev-k8s
  containers:
  - name: kubectl-pod
    image: bitnami/kubectl:1.24.10
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF

# infra-team Namespace 에 파드 생성
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: infra-kubectl
  namespace: infra-team
spec:
  serviceAccountName: infra-k8s
  containers:
  - name: kubectl-pod
    image: bitnami/kubectl:1.24.10
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF

 

# Service Account 적용 확인
kubectl get pod -o dev-kubectl -n dev-team -o yaml | grep -i serviceaccount
kubectl get pod -o infra-kubectl -n infra-team -o yaml | grep -i serviceaccount

 

 

 

# Pod 접속 별칭 설정
alias k1='kubectl exec -it dev-kubectl -n dev-team -- kubectl'
alias k2='kubectl exec -it infra-kubectl -n infra-team -- kubectl'

# 권한 테스트
k1 run nginx --image nginx:1.20-alpine
k1 get pods -n kube-system

 

 

해당 Service Account 가 Pod 를 조회하고 생성할 수 있는 권한이 없는 것을 알 수 있다.

ServiceAccount 에 Pod 권한을 부여하기 위해서는 Role 이 필요하다.

 

1.2. Role

사용 가능한 Verb
  1. *(모두 처리)
  2. create(생성)
  3. delete(삭제)
  4. get(조회)
  5. list(목록조회)
  6. patch(일부업데이트)
  7. update(업데이트)
  8. watch(변경감시)

 

# dev-team Role 생성 - List(조회) 권한
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: role-dev-team
  namespace: dev-team
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["list"]
EOF

# infra-team Role 생성 - 모든 권한
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: role-infra-team
  namespace: infra-team
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
EOF

 

# Role 상세 내역 확인
kubectl describe roles role-dev-team -n dev-team

 

 

1.3. RoleBinding

  • 서비스어카운트 <-> 롤 간 서로 연동
# dev-team 롤바인딩 생성
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: roleB-dev-team
  namespace: dev-team
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: role-dev-team
subjects:
- kind: ServiceAccount
  name: dev-k8s
  namespace: dev-team
EOF

# infra-team 롤바인딩 생성
cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: roleB-infra-team
  namespace: infra-team
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: role-infra-team
subjects:
- kind: ServiceAccount
  name: infra-k8s
  namespace: infra-team
EOF

 

# RoleBinding 상세 내역 확인
kubectl describe rolebindings roleB-dev-team -n dev-team

 

 

다시 처음과 같이 Pod 에서 권한 테스트 실행

# Pod 생성 (create)
k1 run nginx --image nginx:1.20-alpine

# Pod 조회 (list)
k1 get pods

# Pod 삭제 (delete)
k1 delete pods nginx

 

  • 명령어 중 Role 을 통해 권한을 부여한 Pod 조회(list) 만 가능한 것을 확인할 수 있다.

 

Contents

포스팅 주소를 복사했습니다