- 다른 서버에서 처럼 사용자를 이용하고 싶다면, 별도로 UserAccount 를 생성하여 사용할 수 있으나, 이는 별도의 인증 서버를 연결하여야 한다
일반적으로 ServiceAccount 를 사용한다
K8S -------------> linux
default ( admin ) root ( ~/.kube/config )
- 이를 통해 root 는 K8S admin 정보를 포함하고 있다
- 각 NS 별로 별도의 SA 를 생성하여 고객사에게 전달한다. 이때 고객사에서는 협의 사항에 있지 않은 서비스를 사용할 수 없도록 CREATE 와 같은 명령은 제거한다
- GET 과 같은 확인 명령어만 허용한다
Role -> 특정 NS 에서만 동작
ClusterRole -> Cluster 전체에서 사용할 수 있는 것 지정
- ClusterRole 의 경우 ClusterRoleBinding 이 필요하다
root@manager:~/k8slab# k get svc --as system:serviceaccount:default:testuser
Error from server (Forbidden): services is forbidden: User "system:serviceaccount:default:testuser" cannot list resource "services" in API group "" in the namespace "default"
- as system:serviceaccount 을 통해 default ns 의 testuser 의 권한을 일시적으로 주어 명령을 실행하였다
401 error : 인증 에러 - authentication - username/password 문제
403 error : 인가 에러 - authorization - 인증에 성공한 사용자에게 부여된 권한 문제
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: testuser
rules:
- apiGroups: [""]
resources: ["services", "pods"]
verbs: ["get", "list", "watch"]
root@manager:~/k8slab/sa# k apply -f role.yaml
role.rbac.authorization.k8s.io/testuser created
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: testuserrb
subjects:
- kind: ServiceAccount
name: testuser
namespace: default
roleRef:
kind: Role
name: testuser
apiGroup: rbac.authorization.k8s.io
- 이를 통해 다수의 사용자에게 똑같은 Role 을 적용시킬 수 있다
root@manager:~/k8slab/sa# k apply -f rolebinding.yaml
rolebinding.rbac.authorization.k8s.io/testuserrb created
root@manager:~/k8slab/sa# k get svc --as system:serviceaccount:default:testuser
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d
root@manager:~/k8slab/sa# k get pod --as system:serviceaccount:default:testuser
NAME READY STATUS RESTARTS AGE
nfs-nginx-854db57786-sml9w 1/1 Running 2 4d23h
nfs-pod-provisioner-98bd4898f-gqx2f 1/1 Running 2 4d23h
testpod 1/1 Running 2 4d18h
root@manager:~/k8slab/sa# k get deploy --as system:serviceaccount:default:testuser
Error from server (Forbidden): deployments.apps is forbidden: User "system:serviceaccount:default:testuser" cannot list resource "deployments" in API group "apps" in the namespace "default"
- svc 와 pod 는 get , list 권한을 주었으므로 확인이 가능하다
- 허나, deploy 는 권한을 주지 않았으므로 error 가 발생한다
접근 경로를 먼저 확인해보고, 생성한 SA 의 Token 을 이용하여 웹으로 접근했을 때, svc 와 pod 는 웹 상에서 결과를 확인할 수 있는지 여부를 살펴보자
- 권한 문제가 생긴다. 이는 토큰 정보 없이 접속했으므로 403 error 가 발생한다
root@manager:~/k8slab# curl https://localhost:6443 -k
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
"reason": "Forbidden",
"details": {
},
"code": 403
}
root@manager:~/k8slab/sa# curl http://localhost:8001/apis/node.k8s.io
{
"kind": "APIGroup",
"apiVersion": "v1",
"name": "node.k8s.io",
"versions": [
{
"groupVersion": "node.k8s.io/v1",
"version": "v1"
},
{
"groupVersion": "node.k8s.io/v1beta1",
"version": "v1beta1"
}
],
"preferredVersion": {
"groupVersion": "node.k8s.io/v1",
"version": "v1"
}
}
- 허나, 이 방법은 보안상 안 좋은 방법이다. 누구든지 접근할 수 있기 때문이다
root@manager:~/k8slab/sa# k get secret
NAME TYPE DATA AGE
default-token-229bg kubernetes.io/service-account-token 3 6d
nfs-pod-provisioner-sa-token-kb7v5 kubernetes.io/service-account-token 3 4d23h
testuser-token-r6bnm kubernetes.io/service-account-token 3 50m
export SECTOEKN=$(k get secret $SEC -o jsonpath='{.data.token}' | base64 -d )
curl https://localhost:6443/apis --header "Authorization: Bearer $SECTOEKN" -k
root@manager:~/k8slab/sa# curl https://localhost:6443/api/v1/namespaces/default/pods --header "Authorization: Bearer $SECTOEKN" -k
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/default/pods",
"resourceVersion": "143430"
},
"items": []
curl https://localhost:6443/api/v1/namespaces/default/pods/testpod1 --header "Authorization: Bearer $SECTOEKN" -k
curl -X GET https://localhost:6443/api/v1/namespaces/default/pods/testpod1 --header "Authorization: Bearer $SECTOEKN" -k
- GET 이 기본값이기에 따로 명시하지 않아도 GET 이 된다
curl -X DELETE https://localhost:6443/api/v1/namespaces/default/pods/testpod1 --header "Authorization: Bearer $SECTOEKN" -k
root@manager:~/k8slab/sa# curl https://localhost:6443/api/v1/namespaces/default/pods?watch=true --header "Authorization: Bearer $SECTOEKN" -k &
[2] 249333
ps -ef | grep curl # 실행중인 프로세스 확인, curl 프로세스 ID 를 확인하자
kill -9 249333 # curl 프로세스를 바로 종료 시켰다
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: testuser
rules:
- apiGroups: [""]
resources: ["services", "pods"]
verbs: ["get", "list", "watch","delete"]
root@manager:~/k8slab/sa# k apply -f role.yaml
role.rbac.authorization.k8s.io/testuser configured
curl -X DELETE https://localhost:6443/api/v1/namespaces/default/pods/testpod1 --header "Authorization: Bearer $SECTOEKN" -k
root@manager:~/k8slab/sa# k get pod
No resources found in default namespace.