Kubernetes Role Based Access Control

강재민·2022년 5월 26일
0

Kubernetes

목록 보기
17/29
post-thumbnail

Kubernetes설치


Chocolatey 설치


Kubeconfig

~/.kube/config

apiVersion: v1
kind: Config
preferences: {}
clusters:
- name: cluster.local
  cluster:
    certificate-authority-data: LS0tLS1...
    server: https://127.0.0.1:6443
- name: mycluster
  cluster:
    server: https://1.2.3.4:6443
users:
- name: myadmin
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1...
    client-key-data: LS0tLS1...
contexts:
- context:
    cluster: mycluster
    user: myadmin
  name: myadmin@mycluster
- context:
    cluster: cluster.local
    user: kubernetes-admin
  name: kubernetes-admin@cluster.local
current-context: kubernetes-admin@cluster.local
kubectl config view

view를 통해서도 내용을 확인할수 있으며 이 때는 인증정보는 가려진다.

kubectl config get-clusters
kubectl config get-contexts
kubectl config get-users

이렇게 클러스터 사용자를 변경할 수 있다. 이후에 해당 사용자에 역할을 부여해서 특정 활동만 가능하게 만든다.

여기서 사용자와 주소를 알 수 있다.

kubectl config use-context myadmin@mycluster

관리자 권한으로 Powershell 열고

choco install kubernetes-cli --version=1.22.4
y
kubectl


해당 파일내용을 다 복사해서

mkdir ~/.kube
code .config

### 이곳에 붙여넣고

kubectl get nodes

### 이렇게 외부에서 인증을 통해 접근이 가능하다.

인증 Authentication

쿠버네티스의 사용자

  • Service Account(sa): 쿠버네티스가 관리하는 SA 사용자
    - 사용자 X
    - Pod 사용
  • Normal User: 일반 사용자(쿠버네티스가 관리 X)
    - 사용자 O
    - Pod X

인증 방법:

­https://jwt.io/
The suggested pronunciation of JWT is the same as the English word "jot".

해당 페이지에

이 인증 정보를 base64 디코딩한 후 집어넣으면

이렇게 json형식의 설정값들을 확인할 수 있다


RBAC

참고자료
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
https://kubernetes.io/ko/docs/reference/access-authn-authz/authorization/
  • Role: 권한(NS)
  • ClusterRole: 권한(Global)
  • RoleBinding
    - Role <-> RoleBinding <-> SA/User
  • ClusterRoleBinding
    - ClusterRole <-> ClusterRoleBinding <-> SA/User@

요청 동사 (HTTP방식을 사용한다.)

  • create
    - kubectl create, kubectl apply
  • get
    - kubectl get po myweb
  • list
    - kubectl get pods
  • watch
    - kubectl get po -w
  • update
    - kubectl edit, replace
  • patch
    - kubectl patch
  • delete
    - kubectl delete po myweb
  • deletecollection
    - kubectl delete po --all

ClusterRole

  • view: 읽을 수 있는 권한
  • edit: 생성/삭제/변경 할 수 있는 권한
  • admin: 모든것 관리(-RBAC: ClusterRole 제외)
  • cluster-admin: 모든것 관리

SA

kubectl create sa <NAME>

사용자 생성을 위한 x509 인증서

Private Key

openssl genrsa -out myuser.key 2048

x509 인증서 요청 생성

openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser"
cat myuser.csr | base64 | tr -d "\n"

### -tr은 트림이고 \n을 다 잘라낸다는 뜻임

csr.yaml

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: myuser-csr
spec:
  usages:
  - client auth
  signerName: kubernetes.io/kube-apiserver-client
  request: LS0tLS1CRUdJTiB
kubectl create -f csr.yaml
kubectl get csr

상태: Pending

kubectl certificate approve myuser-csr
kubectl get csr

상태: Approved, Issued

kubectl get csr myuser-csr -o yaml

status.certificates

kubectl get csr myuser-csr -o jsonpath='{.status.certificate}' | base64 -d > myuser.crt

### 자체서명이아닌 CertificateSigningRequest에 의해 서명을 받을 수 있다.
### 그리고 서명받은 인증서를 myuser.crt로 만들었다.

인증서를 볼 수 있다..
Issuer 발급자
Subject 발급대상
그 밑에가 공개키..

Kubeconfig 사용자 생성

kubectl config set-credentials myuser --client-certificate=myuser.crt --client-key=myuser.key --embed-certs=true

### --embed 옵션을 통해 나중에 디렉토리 구조가 바뀌더라도 문제없도록
### 파일로 인증서를 가리키지않고 바로 그 값을 내장하게된다.

Kubeconfig 컨텍스트 생성

kubectl config set-context myuser@cluster.local --cluster=cluster.local --user=myuser --namespace=default
kubectl config get-users
kubectl config get-clusters
kubectl config get-contexts
kubectl config use-context myuser@cluster.local

context를 바꿔서 get pods가 안된다.
role을 생성해서 바인딩시켜주어야 하기 때문이다.

kubectl config use-context kubernetes-admin@cluster.local

### 다시 원래 context로 돌아와야 이후 작업이 가능하다.


클러스터 롤 바인딩 생성

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: myuser-view-crb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: view
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: myuser

0개의 댓글