Kubernetes Bearer Token 인증
Kubernetes 인증 관련 글 이동
1. Kubernetes 인증 ( Authentication ) 이론
2. Kubernetes 인증 ( Basic Authentication )
3. Kubernetes 인증 ( TLS )
4. Kubernetes 인증 ( Bearer Token )
5. Kubernetes 인증 ( Webhook )
6. Kubernetes 인증 ( Webhook 외부 인증 연동 )
7. Kubernetes 인증 ( Webhook 외부 인증 LDAP )
8. Kubernetes 인증 ( Proxy )
참고) 환경
Master Node server
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
api verison : 1.26
Worker Node server
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
api verison : 1.26
Kubernetes version
1.18
Bearer Token 인증, RBAC 권한관리, Service Account 사용자 방식으로 인증
[목표]
kubernetes 의 Service Account 를 사용해서
Service Account (SA)를 생성하고
SA의 Secret Token 으로 인증 받는 과정을 구성
1. [Bearer Token인증] kubernetss cluster 의 master node 에서 ServiceAccount 생성
(Kubernetes Master Node 에서 작업)
1.1. Service Account 생성
[iksoon-sa.yaml 예제]
apiVersion: v1 kind: ServiceAccount metadata: name: iksoon-sa namespace: iksoon-ns # service account 를 적용하는 namespace 설정 namespace 는 미리 생성되어 있어야함 |
[생성 결과]
2. Service Account의 secret token 값을 확인
(Kubernetes Master Node 에서 작업)
먼저 Service Account 에 해당하는 secret 값을 확인
명령어 : kubectl describe sa -n [설정한 namespace]
확인한 secret의 Token 값 확인
명령어 : kubectl describe secret [상위에서 확인한 secret 이름] -n [설정한 namespace]
3. [RBAC 권한관리] role, roleBinding 생성
(Kubernetes Master Node 에서 작업)
[role.yaml 파일 예시]
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: iksoon-role # 해당 Role 의 이름 namespace: iksoon-ns # Role 이 적용될 namespace 설정 # (role 규칙은 모두 해당 namespace 에 적용되고 해당 namespace 만 사용가능) # 해당 namespace 는 미리 생성되어있어야함 rules: # 권한 부여 - apiGroups: ["", "extensions", "apps"] resources: ["deployments", "pods", "replicasets"] verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # you can also use ["*"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: iksoon-rb namespace: iksoon-ns subjects: - kind: ServiceAccount # 사용자를 Service Account 로 사용하기위해 Service Account 로 설정함 name: iksoon-sa # 상위 Service Account 생성 시 name 와 동일하게 넣어줌 namespace : iksoon-ns # ServiceAccount에 해당하는 namespace roleRef: kind: Role name: iksoon-role # RoleBinding 에 적용될 Role name을 넣어줌 apiGroup: rbac.authorization.k8s.io |
[정상 생성 결과]
확인 명령어 : kubectl get role,roleBinding -n [role 에서 선택한 namespace]
예) kubectl get role,roleBinding -n iksoon-ns-a
4. Client 에서 kubeconfig.yaml 파일 작성
(kubectl 명령으로 붙고자하는 Client 에서 작업)
사전작업 : kubectl 을 다운해야함 (kubectl 설치 과정은 kubernetes 로컬 설치과정 문서 참고)
원하는 위치에 kubeconfig.yaml 파일 작성
4.1. 해당 yaml 파일 위치 환경변수 설정해야함
명령어 : export KUBECONFIG=/root/k8s/kubeconfig.conf
참고) 경로와 yaml 파일 이름은 고정이 아님, 환경변수 KUBECONFIG만 고정값
[적용 확인]
해당 환경변수가 설정되어 있으면
kubectl 이 KUBECONFIG 환경변수를 확인하고 동작함
[예제 1) /root/k8s/kubeconfig.conf]
apiVersion: v1 clusters: - cluster: insecure-skip-tls-verify: true certificate-authority-data: server: https://10.0.2.15:6443 name: kubernetes contexts: - context: cluster: kubernetes user: iksoon-sa name: iksoon-test@kubernetes current-context: iksoon-test@kubernetes kind: Config preferences: {} users: - name: iksoon-sa # 상위에서 생성한 Service Account 의 이름을 넣어줌 user: # 상위에서 확인한 Service Account 의 Secret 에 있는 Token 값을 넣어줌 token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkpjVFVTT1c3aWd2QmhKbHMtdkp5cE96VlRsYzRjWXN2UDRKWTBuNTdrR1EifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJpa3Nvb24tbnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiaWtzb29uLXNhLXRva2VuLTZoYnF2Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6Imlrc29vbi1zYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImM2MTgxOGUzLWUzYmQtNDFmYi05ZGY4LWQwZTE3ZWYxODNkOSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDppa3Nvb24tbnM6aWtzb29uLXNhIn0.igCYwY-L8roXeqH0Fm9XjuIipe_WyK6vD4mC2eEgWgcZiAgELMEu88oZuroijPlxixT4DxaFXxXUALbLuJzzlQeN9xZDJXqXwOHswA5BKefXIyWYS-V3R1QxLRreDXB5CSTYW0Jco6_s2Z2GHv_tH8x6Yh3p4E8Hpoxja1oyQFOoLOgS86S11YgBmtGOcVbHS_CiddvZP8LRea_geKlIMGXEsEtxH4a2vBcrU3HJP7lHQWmDXHNL1zQYuP6DsPBUaVPnyc4AgnX3NMAdeWZHOEd7XZ0d-8cRVPHVVkI_fOeiQkEeUPh4lFt1NIkBUc0LlmKYOhV3CpKqOG3nxqjGqQ |
5. 결과 확인
(kubectl 명령으로 붙고자하는 Client 에서 작업)
role에 설정한 namespace 와 권한에 해당하는 명령 실행 시
[정상적인 경우]
아래와 같이 명령어가 정상적으로 실행됨
[인증에 문제가 있는경우]
error: You must be logged in to the server (Unauthorized)
token 값과 user 값을 다시한번 확인해봐야함
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
참고
kubeconfig 사용 이유
https://kin3303.tistory.com/152
인증
https://kubernetes.io/docs/reference/access-authn-authz/authentication/
https://arisu1000.tistory.com/27847
https://blog.naver.com/alice_k106/221596406973
https://hyperconnect.github.io/2019/12/17/kubehook.html
https://www.youtube.com/watch?v=_vVdSaPi7e0
권한 (Cluster role Binding, role Binding)
https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
https://jonnung.dev/kubernetes/2020/06/18/kubernetes-user-authorizations/
https://nirsa.tistory.com/155?category=871751
https://nirsa.tistory.com/154?category=871751
https://v1-16.docs.kubernetes.io/docs/reference/access-authn-authz/rbac/
kubeconfig 파일 참고
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#config
https://codefarm.me/2019/02/01/access-kubernetes-api-with-client-certificates/
예시
https://coffeewhale.com/kubernetes/authentication/x509/2020/05/02/auth01/
https://coffeewhale.com/kubernetes/authentication/http-auth/2020/05/03/auth02/
'Kubernetes > Kubernetes 보안' 카테고리의 다른 글
Kubernetes 인증 ( Webhook 외부 인증 연동 ) (0) | 2020.08.29 |
---|---|
Kubernetes 인증 ( Webhook ) (0) | 2020.08.29 |
Kubernetes 인증 ( TLS ) (0) | 2020.08.23 |
Kubernetes 인증 ( Basic Authentication ) (0) | 2020.08.23 |
Kubernetes 인증(Authentication) 이론 (0) | 2020.08.23 |