이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Kubernetes/Kubernetes 보안

Kubernetes 인증 ( Bearer Token )

이쿠우우 2020. 8. 29. 16:21
반응형

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 값을 넣어줌
    tokeneyJhbGciOiJSUzI1NiIsImtpZCI6IkpjVFVTT1c3aWd2QmhKbHMtdkp5cE96VlRsYzRjWXN2UDRKWTBuNTdrR1EifQ.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://bcho.tistory.com/1272

https://blog.naver.com/alice_k106/221596406973

https://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221492934710&redirect=Dlog&widgetTypeCall=true&directAccess=false

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/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형