|
| 1 | +--- |
| 2 | +title: 클러스터에서 TLS 인증서 관리 |
| 3 | +content_type: task |
| 4 | +--- |
| 5 | + |
| 6 | +<!-- overview --> |
| 7 | + |
| 8 | +쿠버네티스는 사용자가 제어하는 인증 기관 (CA)에서 서명한 TLS 인증서를 |
| 9 | +프로비저닝 할 수 있는 `certificates.k8s.io` API를 제공한다. |
| 10 | +이러한 CA 및 인증서는 워크로드 간의 신뢰 관계를 구성하는 용도로 사용할 수 있다. |
| 11 | + |
| 12 | +`certificates.k8s.io` API는 [ACME 초안](https://github.com/ietf-wg-acme/acme/)과 |
| 13 | +유사한 프로토콜을 사용한다. |
| 14 | + |
| 15 | +{{< note >}} |
| 16 | +`certificates.k8s.io` API를 사용하여 생성된 인증서는 전용 CA로 서명된다. |
| 17 | +이러한 목적을 위해 클러스터 루트 CA를 사용하도록 클러스터를 |
| 18 | +구성할 수 있지만, 절대 이에 의존해서는 안된다. |
| 19 | +해당 인증서가 클러스터 루트 CA에 대해 유효성을 검사한다고 가정하면 안된다. |
| 20 | +{{< /note >}} |
| 21 | + |
| 22 | + |
| 23 | + |
| 24 | + |
| 25 | +## {{% heading "prerequisites" %}} |
| 26 | + |
| 27 | + |
| 28 | +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} |
| 29 | + |
| 30 | + |
| 31 | + |
| 32 | +<!-- steps --> |
| 33 | + |
| 34 | +## 클러스터에서 TLS 신뢰 |
| 35 | + |
| 36 | +파드로 실행되는 애플리케이션에서 사용자 정의 CA를 신뢰하려면 |
| 37 | +일반적으로 몇 가지 추가 애플리케이션 구성이 필요하다. |
| 38 | +TLS 클라이언트 또는 서버가 신뢰하는 CA 인증서 목록에 |
| 39 | +CA 인증서 번들을 추가해야 한다. |
| 40 | +예를 들어 인증서 체인을 파싱하고, 파싱된 인증서를 [`tls.Config`](https://godoc.org/crypto/tls#Config) 구조체의 |
| 41 | +`RootCAs` 필드에 추가하여, golang TLS 구성으로 이를 수행할 수 있다. |
| 42 | + |
| 43 | +CA 인증서를 파드에서 사용할 수 있는 |
| 44 | +[ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap)으로 |
| 45 | +배포할 수 있다. |
| 46 | + |
| 47 | +## 인증서 요청 |
| 48 | + |
| 49 | +다음 섹션에서는 DNS를 통해 액세스되는 쿠버네티스 서비스의 |
| 50 | +TLS 인증서를 생성하는 방법을 보여준다. |
| 51 | + |
| 52 | +{{< note >}} |
| 53 | +이 튜토리얼에서는 CFSSL을 사용한다. [여기를 클릭](https://blog.cloudflare.com/introducing-cfssl/)하여 Cloudflare의 PKI 및 TLS 툴킷을 자세히 알아본다. |
| 54 | +{{< /note >}} |
| 55 | + |
| 56 | +## CFSSL 다운로드 및 설치 |
| 57 | + |
| 58 | +이 예제에 사용된 cfssl 도구는 |
| 59 | +[https://github.com/cloudflare/cfssl/releases](https://github.com/cloudflare/cfssl/releases)에서 다운로드 할 수 있다. |
| 60 | + |
| 61 | +## 인증서 서명 요청 (CSR) 생성 |
| 62 | + |
| 63 | +다음 명령을 실행하여 개인 키 및 인증서 서명 요청(또는 CSR)을 |
| 64 | +생성한다. |
| 65 | + |
| 66 | +```shell |
| 67 | +cat <<EOF | cfssl genkey - | cfssljson -bare server |
| 68 | +{ |
| 69 | + "hosts": [ |
| 70 | + "my-svc.my-namespace.svc.cluster.local", |
| 71 | + "my-pod.my-namespace.pod.cluster.local", |
| 72 | + "192.0.2.24", |
| 73 | + "10.0.34.2" |
| 74 | + ], |
| 75 | + "CN": "system:node:my-pod.my-namespace.pod.cluster.local", |
| 76 | + "key": { |
| 77 | + "algo": "ecdsa", |
| 78 | + "size": 256 |
| 79 | + }, |
| 80 | + "names": [ |
| 81 | + { |
| 82 | + "O": "system:nodes" |
| 83 | + } |
| 84 | + ] |
| 85 | +} |
| 86 | +EOF |
| 87 | +``` |
| 88 | + |
| 89 | +여기서 `192.0.2.24`는 서비스의 클러스터 IP, |
| 90 | +`my-svc.my-namespace.svc.cluster.local`은 서비스의 DNS 이름, |
| 91 | +`10.0.34.2`는 파드의 IP,`my-pod.my- namespace.pod.cluster.local`은 |
| 92 | +파드의 DNS 이름이다. 다음 출력이 표시되어야 한다. |
| 93 | + |
| 94 | +``` |
| 95 | +2017/03/21 06:48:17 [INFO] generate received request |
| 96 | +2017/03/21 06:48:17 [INFO] received CSR |
| 97 | +2017/03/21 06:48:17 [INFO] generating key: ecdsa-256 |
| 98 | +2017/03/21 06:48:17 [INFO] encoded CSR |
| 99 | +``` |
| 100 | + |
| 101 | +이 명령은 두 개의 파일을 생성한다. PEM으로 |
| 102 | +인코딩된 [pkcs#10](https://tools.ietf.org/html/rfc2986) |
| 103 | +인증 요청이 포함된 `server.csr`과 생성할 인증서 키를 PEM 인코딩한 값이 |
| 104 | +포함된 `server-key.pem`을 생성한다. |
| 105 | + |
| 106 | +## 쿠버네티스 API로 보낼 인증서 서명 요청 객체 만들기 |
| 107 | + |
| 108 | +CSR yaml blob을 생성하고 다음 명령을 실행하여 |
| 109 | +apiserver로 보낸다. |
| 110 | + |
| 111 | +```shell |
| 112 | +cat <<EOF | kubectl apply -f - |
| 113 | +apiVersion: certificates.k8s.io/v1 |
| 114 | +kind: CertificateSigningRequest |
| 115 | +metadata: |
| 116 | + name: my-svc.my-namespace |
| 117 | +spec: |
| 118 | + request: $(cat server.csr | base64 | tr -d '\n') |
| 119 | + signerName: kubernetes.io/kubelet-serving |
| 120 | + usages: |
| 121 | + - digital signature |
| 122 | + - key encipherment |
| 123 | + - server auth |
| 124 | +EOF |
| 125 | +``` |
| 126 | + |
| 127 | +1단계에서 만든 `server.csr` 파일은 base64로 인코딩되고 |
| 128 | +`.spec.request` 필드에 숨겨져 있다. |
| 129 | +또한 `kubernetes.io/kubelet-serving` 서명자가 서명한 |
| 130 | +"digitalSignature", "keyEnciperment" 및 "serverAuth" 키 사용(keyUsage)이 있는 인증서를 요청한다. |
| 131 | +특정 `signerName`을 요청해야 한다. |
| 132 | +자세한 내용은 [지원되는 서명자 이름](/docs/reference/access-authn-authz/certificate-signing-requests/#signers) |
| 133 | +문서를 참조한다. |
| 134 | + |
| 135 | +이제 CSR이 API에서 보류 상태로 표시되어야 한다. 다음을 실행하여 |
| 136 | +확인할 수 있다. |
| 137 | + |
| 138 | +```shell |
| 139 | +kubectl describe csr my-svc.my-namespace |
| 140 | +``` |
| 141 | + |
| 142 | +```none |
| 143 | +Name: my-svc.my-namespace |
| 144 | +Labels: <none> |
| 145 | +Annotations: <none> |
| 146 | +CreationTimestamp: Tue, 21 Mar 2017 07:03:51 -0700 |
| 147 | +Requesting User: [email protected] |
| 148 | +Status: Pending |
| 149 | +Subject: |
| 150 | + Common Name: my-svc.my-namespace.svc.cluster.local |
| 151 | + Serial Number: |
| 152 | +Subject Alternative Names: |
| 153 | + DNS Names: my-svc.my-namespace.svc.cluster.local |
| 154 | + IP Addresses: 192.0.2.24 |
| 155 | + 10.0.34.2 |
| 156 | +Events: <none> |
| 157 | +``` |
| 158 | + |
| 159 | +## 인증서 서명 요청 승인 받기 |
| 160 | + |
| 161 | +인증서 서명 요청을 승인하는 것은 자동화된 승인 프로세스나 |
| 162 | +클러스터 관리자에 의해 일회성으로 수행한다. 여기에 |
| 163 | +관련된 내용에 대한 자세한 내용은 아래에서 설명한다. |
| 164 | + |
| 165 | +## 인증서 다운로드 및 사용 |
| 166 | + |
| 167 | +CSR이 서명되고 승인되면 다음이 표시된다. |
| 168 | + |
| 169 | +```shell |
| 170 | +kubectl get csr |
| 171 | +``` |
| 172 | + |
| 173 | +```none |
| 174 | +NAME AGE REQUESTOR CONDITION |
| 175 | +my-svc.my-namespace 10m [email protected] Approved,Issued |
| 176 | +``` |
| 177 | + |
| 178 | +다음을 실행하여 발급된 인증서를 다운로드하고 `server.crt` 파일에 |
| 179 | +저장할 수 있다. |
| 180 | + |
| 181 | +```shell |
| 182 | +kubectl get csr my-svc.my-namespace -o jsonpath='{.status.certificate}' \ |
| 183 | + | base64 --decode > server.crt |
| 184 | +``` |
| 185 | + |
| 186 | +이제 `server.crt` 및 `server-key.pem`을 키페어(keypair)로 사용하여 |
| 187 | +HTTPS 서버를 시작할 수 있다. |
| 188 | + |
| 189 | +## 인증서 서명 요청 승인 |
| 190 | + |
| 191 | +(적절한 권한이 있는) 쿠버네티스 관리자는 |
| 192 | +`kubectl certificate approve` 과 `kubectl certificate deny` |
| 193 | +명령을 사용하여 인증서 서명 요청을 수동으로 승인 (또는 거부) 할 수 있다. |
| 194 | +그러나 이 API를 많이 사용한다면, |
| 195 | +자동화된 인증서 컨트롤러 작성을 고려할 수 있다. |
| 196 | + |
| 197 | +위와 같이 kubectl을 사용하는 시스템이든 사람이든, 승인자의 역할은 |
| 198 | +CSR이 다음 두 가지 요구 사항을 충족하는지 확인하는 것이다. |
| 199 | + |
| 200 | +1. CSR은 CSR에 서명하는 데 사용되는 개인 키를 제어하는 것이다. 이는 |
| 201 | + 승인된 대상으로 가장하는 제 3자의 위협을 해결한다. 위의 예에서 |
| 202 | + 이 단계는 파드(pod)가 CSR을 생성하는 데 |
| 203 | + 사용되는 개인 키를 제어하는지 확인하는 것이다. |
| 204 | +2. CSR은 요청된 상황에서 작동할 권한이 있다. 이것은 |
| 205 | + 원하지 않는 대상이 클러스터에 합류(join)하는 위협을 |
| 206 | + 해결한다. 위의 예에서, 이 단계는 |
| 207 | + 파드가 요청된 서비스에 참여할 수 있는지 확인하는 것이다. |
| 208 | + |
| 209 | +이 두 가지 요구 사항이 충족되는 경우에만, 승인자가 CSR을 승인하고 |
| 210 | +그렇지 않으면 CSR을 거부해야 한다. |
| 211 | + |
| 212 | +## 승인 허가에 대한 경고문 |
| 213 | + |
| 214 | +CSR을 승인하는 능력은 환경 내에서 누구를 신뢰하는지 결정한다. CSR 승인 |
| 215 | +능력은 광범위하거나 가볍게 부여해서는 안된다. 이 권한을 |
| 216 | +부여하기 전에 이전 섹션에서 언급한 |
| 217 | +요청의 요구 사항과 특정 인증서 발급의 영향을 |
| 218 | +완전히 이해해야 한다. |
| 219 | + |
| 220 | +## 클러스터 관리자를 위한 참고 사항 |
| 221 | + |
| 222 | +이 가이드에서는 서명자가 인증서 API를 제공하도록 설정되었다고 가정한다. 쿠버네티스 |
| 223 | +컨트롤러 관리자는 서명자의 기본 구현을 제공한다. 이를 |
| 224 | +활성화하려면 인증 기관(CA)의 키 쌍에 대한 경로와 함께 `--cluster-signing-cert-file` 와 |
| 225 | +`--cluster-signing-key-file` 매개 변수를 |
| 226 | +컨트롤러 관리자에 전달한다. |
0 commit comments