개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 클러스터 유지와 보안, 트러블슈팅 - TLS 인증서를 활용한 통신 이해

nineDeveloper 2021. 1. 20.
728x90

TLS 인증서를 활용한 통신 이해


SSL 통신 과정 이해

  • 응용계층인 HTTP와 TCP계층사이에서 작동,
  • 어플리케이션에 독립적 -> HTTP제어를 통한 유연성
  • 데이터의 암호화 (기밀성), 데이터 무결성, 서버인증기능, 클라이언트 인증기능


Certificate를 보장하는 방법! 인증기관(CA)

그림 출처: https://docs.pexip.com/admin/certificate_management.htm#infinity_usage


kubernetes의 인증서 위치

$ sudo ls /etc/kubernetes/pki
apiserver-etcd-client.crt  apiserver-kubelet-client.crt  apiserver.crt    ca.crt    etcd            front-proxy-ca.key        front-proxy-client.key  sa.pub
apiserver-etcd-client.key  apiserver-kubelet-client.key  apiserver.key    ca.key    front-proxy-ca.crt  front-proxy-client.crt  sa.key

$ sudo ls /etc/kubernetes/pki/etcd
ca.crt    ca.key    healthcheck-client.crt    healthcheck-client.key    peer.crt  peer.key  server.crt    server.key

정확한 TLS 인증서 사용 점검

  • 적절한 키를 사용하는지 확인하려면 manifests 파일에서 실행하는 certificate 확인 필요
  • 적절한 키를 사용하지 않으면 에러가 발생
  • 인증서의 인증기간은 1년이므로 만료전에 반드시 확인할 것
$ sudo ls /etc/kubernetes/manifests/
etcd.yaml  kube-apiserver.yaml    kube-controller-manager.yaml  kube-scheduler.yaml
  • Kubelet의 위치는 조금 다름
$ sudo ls /var/lib/kubelet/pki
kubelet-client-2019-07-09-12-44-22.pem kubelet.crt
kubelet-client-2019-07-09-12-44-54.pem kubelet.key
kubelet-client-current.pem

$ sudo ls /var/lib/kubelet/
config.yaml  cpu_manager_state    device-plugins    kubeadm-flags.env  pki    plugins  plugins_registry  pod-resources  pods

$ sudo cat /var/lib/kubelet/config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt
...

TLS 인증서를 올바르지 않을 때 발생하는 현상 확인하기

  • 먼저 현재 MASTER 노드의 상태를 스냅샷으로 저장하라
  • Kube-apiserver.yaml을 찾아 특정 경로를 수정하는 방식으로 certificate를 찾을 수 없도록 만들어라

인증서 정보 확인하기

  • Issuer: CA 인증기관
  • Validity: 사용가능기간
  • Subject: 승인받은사람
  • Subject Public Key Info: 인증서의 공개키
$ sudo openssl x509 -in <certificate> -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 4587057929670179001 (0x3fa880e23e2138b9)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = etcd-ca
        Validity
            Not Before: Dec 26 12:33:52 2020 GMT
            Not After : Jan 19 08:14:07 2022 GMT
        Subject: O = system:masters, CN = kube-apiserver-etcd-client
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:b0:1e:03:6f:97:9e:c9:49:11:84:86:72:1d:cf:
                    f3:13:84:df:f9:31:d3:2b:f8:4b:ab:b7:ff:65:58:
                    4c:09:ae:d9:c5:4d:28:7f:45:48:50:3f:6d:d2:79:
                    59:9b:f0:8c:dd:f1:ac:95:db:9b:7f:d7:87:29:da:
                    ...

인증서 목록

인증서 사용기간은 1년 conf 는 파일 내부에 인증서가 있음
각각의 CA 인증기관이 다름

CERTIFICATE RESIDUAL TIME Certificate Path CERTIFICATE AUTHORITY
admin.conf 365d /etc/kubernetes
apiserver 365d /etc/kubernetes/pki ca
apiserver-etcd-client 365d /etc/kubernetes/pki/etcd etcd-ca
apiserver-kubelet-client 365d /etc/kubernetes/pki ca
controller-manager.conf 365d /etc/kubernetes/pki
etcd-healthcheck-client 365d /etc/kubernetes/pki/etcd etcd-ca
etcd-peer 365d /etc/kubernetes/pki/etcd etcd-ca
etcd-server 365d /etc/kubernetes/pki/etcd etcd-ca
front-proxy-client 365d /etc/kubernetes/pki front-proxy-ca
scheduler.conf 365d /etc/kubernetes

CA 목록

CA는 사용기간이 10년

CERTIFICATE AUTHORITY RESIDUAL TIME Certificate Path
ca 10y /etc/kubernetes/pki
etcd-ca 10y /etc/kubernetes/pki/etcd
front-proxy-ca 10y /etc/kubernetes/pki

참고: front-proxy 인증서는 kube-proxy에서 API 서버 확장을 지원할 때만 kube-proxy에서 필요하다


모든 인증서 갱신하기


실습

  • 인증서 목록 정보 및 기간 정보 확인 명령어
    • kubeadm alpha certs check-expiration
$ sudo kubeadm alpha certs check-expiration
Command "check-expiration" is deprecated, please use the same command under "kubeadm certs"
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Jan 19, 2022 08:15 UTC   364d                                    no
apiserver                  Jan 19, 2022 08:14 UTC   364d            ca                      no
apiserver-etcd-client      Jan 19, 2022 08:14 UTC   364d            etcd-ca                 no
apiserver-kubelet-client   Jan 19, 2022 08:14 UTC   364d            ca                      no
controller-manager.conf    Dec 26, 2021 12:33 UTC   340d                                    no
etcd-healthcheck-client    Dec 26, 2021 12:33 UTC   340d            etcd-ca                 no
etcd-peer                  Dec 26, 2021 12:33 UTC   340d            etcd-ca                 no
etcd-server                Dec 26, 2021 12:33 UTC   340d            etcd-ca                 no
front-proxy-client         Jan 19, 2022 08:14 UTC   364d            front-proxy-ca          no
scheduler.conf             Dec 26, 2021 12:33 UTC   340d                                    no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Dec 24, 2030 12:33 UTC   9y              no
etcd-ca                 Dec 24, 2030 12:33 UTC   9y              no
front-proxy-ca          Dec 24, 2030 12:33 UTC   9y              no

인증서 전체 목록 갱신
CA 인증서 기간은 갱신되지 않음

클라이언트 들의 경우 클라이언트 컨테이너들에서 필요할때 파일을 받아들여서 갱신함

$ sudo kubeadm alpha certs renew all

연습문제

  • Apiserver가 사용하는 ca.crt 정보를 텍스트 형태로 출력하라
  • ca.crt의 CN은 무엇인가?
  • ca.crt를 이슈화한 CN은 무엇인가?
728x90

댓글

💲 추천 글