반응형
Kubernetes 는 RBAC 이 디폴트 접근 제어 권한으로 User account 와 RBAC 을 적절히 사용하면 효과적인 접근 제어를 할 수 있습니다.
예를 들어, Kubernetes Cluster 에 접근할 수 있는 사용자 seungkyua 를 새로 만들고 해당 사용자는 seungkyua 네임스페이스에만 접근 가능하게 설정하고 싶은 경우가 있을 수 있습니다.
또한 seungkyua 네임스페이스 접근 안에서도 pods, replicasets, deployments, services 만 생성, 조회, 수정, 삭제권한만 주고 싶을 때도 있습니다.
이러한 세팅은 아래와 같은 절차를 거쳐야 합니다. 물론 Kubernetes 는 RBAC 사용으로 세팅되어 있다고 가정합니다.
- 신규 namespace 생성
- User account 생성 (client key 와 client crt 생성)
- 새로운 namespace 에 제한적으로 접근할 수 있는 권한 생성 (role 생성)
- 3번의 새로운 User account 와 3 번의 role 을 연결 (rolebinding 생성)
- kubectl 이 사용할 새로운 config context 를 만들고 연결
1. 신규 naemspace 생성
# kubectl create namespace seungkyua
2. 새로운 User account 생성
- client private key 생성
# openssl genrsa -out seungkyua.key 2048
- crt 생성을 위한 csr 생성
# openssl req -new -key seungkyua.key -subj "/CN=seungkyua/O=Kubernetes Korea Group" -out seungkyua.csr
- client cert 파일 생성
# openssl x509 -req -in seungkyua.csr -CA /etc/kubernetes/ssl/ca.crt -CAkey /etc/kubernetes/ssl/ca.key -CAcreateserial -out seungkyua.crt -days 10000
3. 새로운 namespace 로 접근 role 설정
# vi role.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: seungkyua-manager
namespace: seungkyua
rules:
- apiGroups:
- "" # core api
- "extensions"
- "apps"
resources:
- "deployments"
- "replicasets"
- "pods"
- "services"
verbs:
- "get"
- "list"
- "watch"
- "create"
- "update"
- "patch"
- "delete"
# kubectl create -f role.yaml
4. User 와 Role 을 연결 (rolebinding 생성)
# vi rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:
name: seungkyua-manager-rolebinding
namespace: seungkyua
subjects:
- kind: User # User or ServiceAccount
name: seungkyua
roleRef:
kind: Role
name: seungkyua-manager
apiGroup: rbac.authorization.k8s.io
# kubectl create -f rolebinding.yaml
5. Kubectl config context 생성
- 인증을 위한 사용자 정보 등록 (key, crt 로 접속)
# kubectl config set-credentials seungkyua --client-certificate=/root/ahnsk/private-certs/seungkyua.crt --client-key=/root/ahnsk/private-certs/seungkyua.key --embed-certs=true
- context 생성
# kubectl config get-clusters NAME cluster.local # kubectl config set-context seungkyua@k1 --cluster=cluster.local --user=seungkyua --namespace=seungkyua
- kubernetes 접속
# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@cluster.local cluster.local kubernetes-admin
seungkyua@k1 cluster.local seungkyua
# kubectl config use-context seungkyua@k1
# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
kubernetes-admin@cluster.local cluster.local kubernetes-admin
* seungkyua@k1 cluster.local seungkyua seungkyua
Kubernetes 에 접속하여 해당 계정이 해당 네임스페이스에만 접속 권한이 있는지 확인
# kubectl get pods
No resources found.
# kubectl get pods -n defaults
Error from server (Forbidden): pods is forbidden: User "seungkyua" cannot list resource "pods" in API group "" in the namespace "defaults"
반응형