쿠버네티스에서는 Authenticate/Authorization/Admission Control 이라는 세 단계를 통해서 리소스가 등록된다.

Authenticate

Authentication 에서는 사용자명과 패스워드, 사용자명과 토큰으로 정상 사용자인지 확인한다. 그 외에 Certificates, External Authentication providers(LDAP 등), Service Accounts 을 사용하는 것도 가능하다.

kube-apiserver Basic authenticate 예시

- Auth file

# Static Password File
# user-details.csv
password123,user1,u0001
password123,user2,u0002
password123,user3,u0003
password123,user4,u0004
password123,user5,u0005

- curl -v -k https://master-node-ip:6443/api/v1/pods -u "user1:password123"


# Static Token File
# user-token-details.csv
# --token-auth-file=user-details.csv
KpjCVbI7rCFAHYPkByTIzRb7gu1cUc4B,user10,u0010,group1
rJjncHmvtXHc6MlWQddhtvNyyhgTdxSC,user11,u0011,group1
mjpOFIEiFOkL9toikaRNtt59ePtczZSq,user12,u0012,group2
PG41IXhs7QjqwWkmBkvgGT9glOyUqZij,user13,u0013,group2

- curl -v -k https://master-node-ip:6443/api/v1/pods --header "Authorization: Bearer KpjCVbI7rCFAHYPkBzRb7gu1cUc4B"

/etc/kubernetes/manifests/kube-apiserver.yaml : basic-auth-file

apiVersion: v1
kind: Pod
metadata:
	creationTimestamp: null
	name: kube-apiserver
	namespace: kube-system
spec:
	containers:
	- command:
		- kube-apiserver
		- --authorization-mode=Node,RBAC
		- --advertise-address=172.17.0.107
        - --allow-privileged=true
        - --enable-admission-plugins=NodeRestriction
        - --enable-bootstrap-token-auth=true
        - --basic-auth-file=user-details.csv
        image: k8s.gcr.io/kube-apiserver-amd64:v1.11.3
        name: kube-apiserver

 

Kubeadm basic authentication 예시

/tmp/users/user-details.csv

# User File Contents
password123,user1,u0001
password123,user2,u0002
password123,user3,u0003
password123,user4,u0004
password123,user5,u0005

 

Edit the kube-apiserver static pod configured by kubeadm to pass in the user details.

The file is located at /etc/kubernetes/manifests/kube-apiserver.yaml

 

Change Volume Mounts : /tmp/users

apiVersion: v1
kind: Pod
metadata:
name: kube-apiserver
namespace: kube-system
spec:
  containers:
  - command:
      - kube-apiserver
      <content-hidden>
  image: k8s.gcr.io/kube-apiserver-amd64:v1.11.3
  name: kube-apiserver
  volumeMounts:
  - mountPath: /tmp/users
    name: usr-details
    readOnly: true
  
  volumes:
  - hostPath:
    path: /tmp/users
    type: DirectoryOrCreate
    name: usr-details

 

Modify the kube-apiserver startup options to include the basic-auth file

apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
name: kube-apiserver
namespace: kube-system
spec:
  containers:
  - command:
      - kube-apiserver
      - --authorization-mode=Node,RBAC
      <content-hidden>
      - --basic-auth-file=/tmp/users/user-details.csv

 

Create the necessary roles and role bindings for these users : user1

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
 
---
# This role binding allows "user1" to read pods in the "default" namespace.
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-pods
  namespace: default

subjects:
- kind: User
  name: user1 # Name is case sensitive
  apiGroup: rbac.authorization.k8s.io

roleRef:
  kind: Role #this must be Role or ClusterRole
  name: pod-reader # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io

 

Once created, you may authenticate into the kube-api server using the users credentials

 

curl -v -k https://localhost:6443/api/v1/pods -u "user1:password123"

 


Authorization

Authorization 에서는 그 사용자가 하고자 하는 요청에 대해 실행 가능한 권한이 있는지를 제어한다.

 

RBAC(Role Based Access Control)는 어떤 조작을 허용하는지를 결정하는 롤을 생성하고 서비스 어카운트 등의 사용자에게 롤을 연결하여(롤바인딩) 권한을 부여한다. 또 AggregationRule을 사용하여 여러 롤을 집약한 롤을 생성할 수 있어 롤 관리성을 향상시킬 수 있다.

 

롤과 롤바인딩에는 네임스페이스 수준의 리소스(롤과 롤바인딩)와 클러스터 수준의 리소스(클러스터롤과 클러스터롤바인딩)가 있다.

 

kube-apiserver에서 RBAC 설정

kube-apiserver authorization-mode : AlwaysAllow or Node, RBAC, Webhook ...

ExecStart=/usr/local/bin/kube-apiserver \\
--advertise-address=${INTERNAL_IP} \\
--allow-privileged=true \\
--apiserver-count=3 \\
--authorization-mode=AlwaysAllow, RBAC, Webhook \\
--bind-address=0.0.0.0 \\

 

Role 정의

- kubectl get roles

- kubectl describe role {role_name}

 

apiGroups, resources, verbs 세 가지를 지정하고, apiGroups와 resources로 지정된 리소스에 대해 verbs 권한을 인가한다.

종류 개요
* 모두 처리
create 생성
delete 삭제
get 조회
list 목록 조회
patch 일부 업데이트
update 업데이트
watch 변경 감시

 

 

레플리카셋/디폴로이먼트/디플로이먼트의 스케일에 대해 모든 권한을 사용할 수 있는 롤을 기본 네임스페이스로 생성

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: sample-role
  namespace: default
rules:
- apiGroups:
  - apps
  - extensions
  resources:
  - replicasets
  - deployments
  - deployments/scale
  verbs:
  - "*"

특정 리소스에 대해서 접근권한을 줄수도 있다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: developer
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["list“, "get", “create“, “update“, “delete"]
  resourceNames: ["blue", "orange"]

 

롤 바인딩 정의

- kubectl get rolebindings

- kubectl describe rolebindings {role_bindings_name}

 

롤바인딩은 네임스페이스에 연결되는 리소스다. 사용자에 대해 특정 네임스페이스에서 롤 또는 클러스터롤에 정의한 권한을 부여한다.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: sample-rolebinding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: sample-role
subjects:
- kind: ServiceAccount
  name: sample-serviceaccount
  namespace: default
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: devuser-developer-binding
subjects:
- kind: User
  name: dev-user
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer
  apiGroup: rbac.authorization.k8s.io

클러스터롤 정의

- kubectl get clusterroles xxx

 

클러스터롤은 rules에 nonResourceUrls를 지정할 수 있다는 점과 metadata.namespace를 지정할 수 없다는 점(전 네임스페이스에 적용된다)이 일반 롤과 다른점이다. nonResourceUrls는 헬스 체크용 엔드포인트나 버전 정보 표시용 엔드포인트의 URL이다.

 

모든 네임스페이스의 레플리카셋과 디폴로이먼트에 대해 get을 할 수 있는 권한과 /healthz와 /version의 Get 요청을 할 수 있는 클러스터롤을 생성한다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: sample-clusterrole
rules:
- apiGroups:
  - apps
  - extensions
  resources:
  - replicasets
  - deployments
  verbs:
  - get
  - list
  - watch
- nonResourceURLs:
  - /healthz
  - /healthz/*
  - /version
  verbs:
  - get

 

클러스터롤의 Aggregation

클러스터롤에만 여러 클러스터롤의 정의를 읽어오는 Aggregation 기능이 있다. Aggregation은 클러스터롤에 정의된 레이블을 기반으로 이루어지며, 집계되는 쪽 클러스터롤에 정의된 롤은 반영되지 않는다.

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sub-clusterrole1
  labels:
    app: sample-rbac
rules:
- apiGroups: [""]
  resources: ["deployments"]
  verbs: ["get"]

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sub-clusterrole2
  labels:
    app: sample-rbac
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get"]

---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: sample-aggregated-clusterrole
aggregationRule:
  clusterRoleSelectors:
  - matchLabels:
      app: sample-rbac
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get"]

클러스터롤 바인딩 정의

클러스터롤바인딩은 네임스페이스에 연결되지 않은 클러스터 수준의 리소스다. 사용자에 대해 모든 네임스페이스에서 클러스터롤로 정의된 권한을 부여한다.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: sample-clusterrolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: sample-clusterrole
subjects:
- kind: ServiceAccount
  name: sample-serviceaccount
  namespace: default

 

 

 

유저가 접근 권한이 있는지 확인하고 싶다면?

 

Check Access

- kubectl auth can-i create deployments

- kubectl auth can-i delete nodes

- kubectl auth can-i create deployments --as dev-user

- kubectl auth can-i create pods --as dev-user --namespaces test

- kubectl auth can-i list storageclasses --as dev


참고

어드미션 컨트롤

어드미션 컨트롤 단계에서는 별도로 그 요청을 허가할지 판단하거나 요청받은 리소스를 변경하여 등록할 수 있다. 따라서 쿠버네티스 클러스터 관리자가 임의의 상태로 수정할 수 있으므로, 리소스의 limit가 등록되어 있지 않을 경우 등록하거나 리소스 쿼터 체크 처리를 이 단계에서 수행할 수 있다.

 

어드미션 컨트롤은 플러그인 형태로 되어 있어 ResourceQuota, PodSecurityPolicy 등을 제공한다.

 

Get API groups and resource names

root@controlplane:~# kubectl api-resources
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus
configmaps                        cm           v1                                     true         ConfigMap
endpoints                         ep           v1                                     true         Endpoints
events                            ev           v1                                     true         Event
limitranges                       limits       v1                                     true         LimitRange
namespaces                        ns           v1                                     false        Namespace
nodes                             no           v1                                     false        Node
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim
persistentvolumes                 pv           v1                                     false        PersistentVolume
pods                              po           v1                                     true         Pod
podtemplates                                   v1                                     true         PodTemplate
replicationcontrollers            rc           v1                                     true         ReplicationController
resourcequotas                    quota        v1                                     true         ResourceQuota
secrets                                        v1                                     true         Secret
serviceaccounts                   sa           v1                                     true         ServiceAccount
services                          svc          v1                                     true         Service
mutatingwebhookconfigurations                  admissionregistration.k8s.io/v1        false        MutatingWebhookConfiguration
validatingwebhookconfigurations                admissionregistration.k8s.io/v1        false        ValidatingWebhookConfiguration
customresourcedefinitions         crd,crds     apiextensions.k8s.io/v1                false        CustomResourceDefinition
apiservices                                    apiregistration.k8s.io/v1              false        APIService
controllerrevisions                            apps/v1                                true         ControllerRevision
daemonsets                        ds           apps/v1                                true         DaemonSet
deployments                       deploy       apps/v1                                true         Deployment
replicasets                       rs           apps/v1                                true         ReplicaSet
statefulsets                      sts          apps/v1                                true         StatefulSet
tokenreviews                                   authentication.k8s.io/v1               false        TokenReview
localsubjectaccessreviews                      authorization.k8s.io/v1                true         LocalSubjectAccessReview
selfsubjectaccessreviews                       authorization.k8s.io/v1                false        SelfSubjectAccessReview
selfsubjectrulesreviews                        authorization.k8s.io/v1                false        SelfSubjectRulesReview
subjectaccessreviews                           authorization.k8s.io/v1                false        SubjectAccessReview
horizontalpodautoscalers          hpa          autoscaling/v1                         true         HorizontalPodAutoscaler
cronjobs                          cj           batch/v1beta1                          true         CronJob
jobs                                           batch/v1                               true         Job
certificatesigningrequests        csr          certificates.k8s.io/v1                 false        CertificateSigningRequest
leases                                         coordination.k8s.io/v1                 true         Lease
endpointslices                                 discovery.k8s.io/v1beta1               true         EndpointSlice
events                            ev           events.k8s.io/v1                       true         Event
ingresses                         ing          extensions/v1beta1                     true         Ingress
flowschemas                                    flowcontrol.apiserver.k8s.io/v1beta1   false        FlowSchema
prioritylevelconfigurations                    flowcontrol.apiserver.k8s.io/v1beta1   false        PriorityLevelConfiguration
ingressclasses                                 networking.k8s.io/v1                   false        IngressClass
ingresses                         ing          networking.k8s.io/v1                   true         Ingress
networkpolicies                   netpol       networking.k8s.io/v1                   true         NetworkPolicy
runtimeclasses                                 node.k8s.io/v1                         false        RuntimeClass
poddisruptionbudgets              pdb          policy/v1beta1                         true         PodDisruptionBudget
podsecuritypolicies               psp          policy/v1beta1                         false        PodSecurityPolicy
clusterrolebindings                            rbac.authorization.k8s.io/v1           false        ClusterRoleBinding
clusterroles                                   rbac.authorization.k8s.io/v1           false        ClusterRole
rolebindings                                   rbac.authorization.k8s.io/v1           true         RoleBinding
roles                                          rbac.authorization.k8s.io/v1           true         Role
priorityclasses                   pc           scheduling.k8s.io/v1                   false        PriorityClass
csidrivers                                     storage.k8s.io/v1                      false        CSIDriver
csinodes                                       storage.k8s.io/v1                      false        CSINode
storageclasses                    sc           storage.k8s.io/v1                      false        StorageClass
volumeattachments                              storage.k8s.io/v1                      false        VolumeAttachment

 

Security Context

컨테이너에 대한 보안 설정. 설정가능한 항목은 아래 표와 같다.

종류 개요
privileged 특수 권한을 가진 컨테이너로 실행
capabilites Capabilites의 추가와 삭제
allowPrivilegeEscalation 컨테이너 실행 시 상위 프로세스보다 많은 권한을 부여할지 여부
readOnlyRootFilesystem root 파일 시스템을 읽기 전용으로 할지 여부
runAsUser 실행 사용자
runAsGroup 실행 그룹
runAsNonRoot root에서 실행을 거부
seLinuxoptions SELinux 옵션
apiVersion: v1
kind: Pod
metadata:
  name: web-pod
spec:
  #Globally take effect on all pods
  runAsUser: 1000
  containers:
    - name: ubuntu
      image: ubuntu
      command: ["sleep", "3600"]
      securityContext:
        runAsUser: 1000
        capabilities:
          add: ["MAC_ADMIN"]
          drop: ["AUDIT_WRITE"]

* Capabilities are only supported at the container level and not at the POD level

 

 

Q. What is the user used to execute the sleep process within the 'ubuntu-sleeper' pod?

kubectl exec ubuntu-sleeper -- whoami 

> root

출처

- [강의] udemy - Certified Kubernetes Administrator

- [책] 쿠버네티스 완벽 가이드(마사야 아오야마 지음, 박상욱 옮김)

'클라우드 컴퓨팅 > 쿠버네티스' 카테고리의 다른 글

Docker Network  (0) 2021.12.05
Kubernetes Storage  (0) 2021.11.22
Kubernetes TLS/PKI 살펴보기  (0) 2021.11.08
Kubernetes Monitoring with Prometheus  (0) 2021.10.27
Helm으로 매니페스트 범용화하기  (0) 2021.10.26

+ Recent posts