콘텐츠로 이동

2025 06 22

2025-06-22

k8s CSR(Certificate Signing Requests)

참고: https://velog.io/@gadian88/Certificate-Signing-Requests-CSR 참고: https://blog.naver.com/kmk1030/223007606920

  • CSR
    • CSR: 디지털 신분증을 만들기 위한 신청서 (공개키와 정보, 도메인 등)
      • 나 - 회사에 입사하고 싶어요 (CSR 생성)
      • 회사 - 신청서 보니 괜찮네요. 채용합니다 (CA가 서명하여 인증서 발급)
    • CSR 안에는 다음 항목이 들어있음
      • 이름
      • 조직/국가
      • 공개키
      • 사용 목적
    • CSR은 비공개키로 서명되어 있음.
  • 흐름
    1. 서버에서 개인키/공개키 생성
    2. CSR 생성 (공개키 + 정보포함, 개인키로 서명)
    3. CA에서 CSR 받고 정보확인하여 인증서에 서명
    4. 서버가 서명된 인증서 받음
  • 실습

    1. 개인키 생성

      $ openssl genrsa -out myuser.key 2048
      

    2. CSR 생성

      $ openssl req -new -key myuser.key -out myuser.csr
      You are about to be asked to enter information that will be incorporated
      into your certificate request.
      What you are about to enter is what is called a Distinguished Name or a DN.
      There are quite a few fields but you can leave some blank
      For some fields there will be a default value,
      If you enter '.', the field will be left blank.
      -----
      Country Name (2 letter code) [AU]:KO
      State or Province Name (full name) [Some-State]:kyeongki
      Locality Name (eg, city) []:seongnam
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:joelonsw
      Organizational Unit Name (eg, section) []:joelonsw
      Common Name (e.g. server FQDN or YOUR name) []:joelonsw
      Email Address []:joelonsw
      
      Please enter the following 'extra' attributes
      to be sent with your certificate request
      A challenge password []:kk
      String too short, must be at least 4 bytes long
      A challenge password []:123sjsj
      An optional company name []:joelonsw
      

    3. 생성한 CSR 파일 base64 인코딩

      $ cat myuser.csr | base64 | tr -d "\n"
      LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0...
      

    4. kubernetes에서 CertificateSigningRequest Manifest 작성, apply

      apiVersion: certificates.k8s.io/v1
      kind: CertificateSigningRequest
      metadata:
          name: myuser
      spec:
          request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0...
          signerName: kubernetes.io/kube-apiserver-client   # Certificates By API Server, Never auto-approve by kube-controller-manager
          expirationSeconds: 86400
          usages:
      
          - client auth
      

    5. 인증서 서명 요청 승인

      $ kubectl get csr
      $ kubectl certificate approve myuser
      

    6. Role 생성 및 Role 바인딩

      • 해당 사용자가 쿠버 클러스터에 접근할 수 있도록 Role 및 Role 바인딩 필요
      • Role
        $ kubectl create role developer --verb=create \
        --verb=list --verb=get --verb=update --verb=delete \
        --resources=pods
        
      • RoleBinding
        $ kubectl create rolebinding developer-binding-myuser \
        --role=developer --user=myuser
        
    7. kubeconfig 추가

      • 새로운 credential 추가 (myuser라는 이름의 사용자 자격증명을 kubeconfig에 등록)
        $ kubectl config set-credentials myuser --client-key=myuser.key \
        --client-certificate=myuser.crt --embed-certs=true
        
      • context 추가 (어떤 클러스터와 어떤 사용자 정보를 쓸지 묶어서 저장)
        $ kubectl config set-context myuser --cluster=kubernetes --user=myuser
        
      • 현재 사용할 컨텍스트 지정
        $ kubectl config use-context myuser
        
    8. 테스트

      $ kubectl auth can-i create pods --as=myuser -n=namespace
      

  • 파일 .csr vs 쿠버 오브젝트 CSR
    • .csr: openssl 에서 쓰는 PKI 인증서 신청 파일
    • CertificateSigningRequest: 쿠버에서 CSR을 리소스로 만든 것

k8s DNS

참고: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

  • Service
    • my-svc.my-namespace-svc.cluster-domain.example: 서비스의 ClusterIP 주소
  • Pod
    • 172-17-0-3.default.pod.cluster.local
    • nslookup에는 이걸 사용해도 됨: 172-17-0-3.default