|
| 1 | +--- |
| 2 | +title: Kelola Sertifikat TLS Pada Klaster |
| 3 | +content_template: templates/task |
| 4 | +--- |
| 5 | + |
| 6 | +<!-- overview --> |
| 7 | + |
| 8 | +Kubernetes menyediakan API `certificates.k8s.io` yang memungkinkan kamu membuat sertifikat |
| 9 | +TLS yang ditandatangani oleh Otoritas Sertifikat (CA) yang kamu kendalikan. CA dan sertifikat ini |
| 10 | +bisa digunakan oleh _workload_ untuk membangun kepercayaan. |
| 11 | + |
| 12 | +API `certificates.k8s.io` menggunakan protokol yang mirip dengan [konsep ACME](https://github.com/ietf-wg-acme/acme/). |
| 13 | + |
| 14 | +{{< note >}} |
| 15 | +Sertifikat yang dibuat menggunakan API `certificates.k8s.io` ditandatangani oleh CA |
| 16 | +khusus. Ini memungkinkan untuk mengkonfigurasi klaster kamu agar menggunakan CA _root_ klaster untuk tujuan ini, |
| 17 | +namun jangan pernah mengandalkan ini. Jangan berasumsi bahwa sertifikat ini akan melakukan validasi |
| 18 | +dengan CA _root_ klaster |
| 19 | +{{< /note >}} |
| 20 | + |
| 21 | + |
| 22 | + |
| 23 | + |
| 24 | +## {{% heading "prerequisites" %}} |
| 25 | + |
| 26 | + |
| 27 | +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} |
| 28 | + |
| 29 | + |
| 30 | + |
| 31 | +<!-- steps --> |
| 32 | + |
| 33 | +## Mempercayai TLS dalam Klaster |
| 34 | + |
| 35 | +Mempercayai CA khusus dari aplikasi yang berjalan sebagai Pod biasanya memerlukan |
| 36 | +beberapa tambahan konfigurasi aplikasi. Kamu harus menambahkan bundel sertifikat CA |
| 37 | +ke daftar sertifikat CA yang dipercaya klien atau server TLS. |
| 38 | +Misalnya, kamu akan melakukan ini dengan konfigurasi TLS golang dengan mengurai rantai sertifikat |
| 39 | +dan menambahkan sertifikat yang diurai ke `RootCAs` di _struct_ |
| 40 | +[`tls.Config`](https://godoc.org/crypto/tls#Config). |
| 41 | + |
| 42 | +Kamu bisa mendistribusikan sertifikat CA sebagai sebuah |
| 43 | +[ConfigMap](/docs/tasks/configure-pod-container/configure-pod-configmap) yang bisa diakses oleh Pod kamu. |
| 44 | + |
| 45 | +## Meminta Sertifikat |
| 46 | + |
| 47 | +Bagian berikut mendemonstrasikan cara membuat sertifikat TLS untuk sebuah |
| 48 | +Service kubernetes yang diakses melalui DNS. |
| 49 | + |
| 50 | +{{< note >}} |
| 51 | +Tutorial ini menggunakan CFSSL: PKI dan peralatan TLS dari Cloudflare [klik disini](https://blog.cloudflare.com/introducing-cfssl/) untuk mengetahui lebih jauh. |
| 52 | +{{< /note >}} |
| 53 | + |
| 54 | +## Unduh dan Pasang CFSSL |
| 55 | + |
| 56 | +Contoh ini menggunakan cfssl yang dapat diunduh pada |
| 57 | +[https://pkg.cfssl.org/](https://pkg.cfssl.org/). |
| 58 | + |
| 59 | +## Membuat CertificateSigningRequest |
| 60 | + |
| 61 | +Buat kunci pribadi dan CertificateSigningRequest (CSR) dengan menggunakan perintah berikut: |
| 62 | + |
| 63 | +```shell |
| 64 | +cat <<EOF | cfssl genkey - | cfssljson -bare server |
| 65 | +{ |
| 66 | + "hosts": [ |
| 67 | + "my-svc.my-namespace.svc.cluster.local", |
| 68 | + "my-pod.my-namespace.pod.cluster.local", |
| 69 | + "192.0.2.24", |
| 70 | + "10.0.34.2" |
| 71 | + ], |
| 72 | + "CN": "my-pod.my-namespace.pod.cluster.local", |
| 73 | + "key": { |
| 74 | + "algo": "ecdsa", |
| 75 | + "size": 256 |
| 76 | + } |
| 77 | +} |
| 78 | +EOF |
| 79 | +``` |
| 80 | + |
| 81 | +`192.0.2.24` adalah klaster IP Service, |
| 82 | +`my-svc.my-namespace.svc.cluster.local` adalah nama DNS Service, |
| 83 | +`10.0.34.2` adalah IP Pod dan `my-pod.my-namespace.pod.cluster.local` |
| 84 | +adalah nama DNS Pod. Kamu akan melihat keluaran berikut: |
| 85 | + |
| 86 | +``` |
| 87 | +2017/03/21 06:48:17 [INFO] generate received request |
| 88 | +2017/03/21 06:48:17 [INFO] received CSR |
| 89 | +2017/03/21 06:48:17 [INFO] generating key: ecdsa-256 |
| 90 | +2017/03/21 06:48:17 [INFO] encoded CSR |
| 91 | +``` |
| 92 | + |
| 93 | +Perintah ini menghasilkan dua berkas; Ini menghasilkan `server.csr` yang berisi permintaan sertifikasi PEM |
| 94 | +tersandi [pkcs#10](https://tools.ietf.org/html/rfc2986), |
| 95 | +dan `server-key.pem` yang berisi PEM kunci yang tersandi untuk sertifikat yang |
| 96 | +masih harus dibuat. |
| 97 | + |
| 98 | +## Membuat objek CertificateSigningRequest untuk dikirim ke API Kubernetes |
| 99 | +Buat sebuah yaml CSR dan kirim ke API Server dengan menggunakan perintah berikut: |
| 100 | + |
| 101 | +```shell |
| 102 | +cat <<EOF | kubectl apply -f - |
| 103 | +apiVersion: certificates.k8s.io/v1beta1 |
| 104 | +kind: CertificateSigningRequest |
| 105 | +metadata: |
| 106 | + name: my-svc.my-namespace |
| 107 | +spec: |
| 108 | + request: $(cat server.csr | base64 | tr -d '\n') |
| 109 | + usages: |
| 110 | + - digital signature |
| 111 | + - key encipherment |
| 112 | + - server auth |
| 113 | +EOF |
| 114 | +``` |
| 115 | + |
| 116 | +Perhatikan bahwa berkas `server.csr` yang dibuat pada langkah 1 merupakan base64 tersandi |
| 117 | +dan disimpan di _field_ `.spec.request`. Kami juga meminta |
| 118 | +sertifikat dengan penggunaan kunci "_digital signature_", "_key enchiperment_", dan "_server |
| 119 | +auth_". Kami mendukung semua penggunaan kunci dan penggunaan kunci yang diperpanjang yang terdaftar |
| 120 | +[di sini](https://godoc.org/k8s.io/api/certificates/v1beta1#KeyUsage) |
| 121 | +sehingga kamu dapat meminta sertifikat klien dan sertifikat lain menggunakan |
| 122 | +API yang sama. |
| 123 | + |
| 124 | +CSR semestinya bisa dilihat dari API pada status _Pending_. Kamu bisa melihatnya dengan menjalankan: |
| 125 | + |
| 126 | +```shell |
| 127 | +kubectl describe csr my-svc.my-namespace |
| 128 | +``` |
| 129 | + |
| 130 | +```none |
| 131 | +Name: my-svc.my-namespace |
| 132 | +Labels: <none> |
| 133 | +Annotations: <none> |
| 134 | +CreationTimestamp: Tue, 21 Mar 2017 07:03:51 -0700 |
| 135 | +Requesting User: [email protected] |
| 136 | +Status: Pending |
| 137 | +Subject: |
| 138 | + Common Name: my-svc.my-namespace.svc.cluster.local |
| 139 | + Serial Number: |
| 140 | +Subject Alternative Names: |
| 141 | + DNS Names: my-svc.my-namespace.svc.cluster.local |
| 142 | + IP Addresses: 192.0.2.24 |
| 143 | + 10.0.34.2 |
| 144 | +Events: <none> |
| 145 | +``` |
| 146 | + |
| 147 | +## Mendapatkan Persetujuan CertificateSigningRequest |
| 148 | + |
| 149 | +Penyetujuan CertificateSigningRequest dapat dilakukan dengan otomatis |
| 150 | +atau dilakukan sekali oleh administrator klaster. Informasi lebih lanjut tentang |
| 151 | +apa yang terjadi dibahas dibawah ini. |
| 152 | + |
| 153 | +## Unduh dan Gunakan Sertifikat |
| 154 | + |
| 155 | +Setelah CSR ditandatangani dan disetujui, kamu akan melihat: |
| 156 | + |
| 157 | +```shell |
| 158 | +kubectl get csr |
| 159 | +``` |
| 160 | + |
| 161 | +```none |
| 162 | +NAME AGE REQUESTOR CONDITION |
| 163 | +my-svc.my-namespace 10m [email protected] Approved,Issued |
| 164 | +``` |
| 165 | + |
| 166 | +Kamu bisa mengundur sertifikat yang telah diterbitkan dan menyimpannya ke berkas |
| 167 | +`server.crt` dengan menggunakan perintah berikut: |
| 168 | + |
| 169 | +```shell |
| 170 | +kubectl get csr my-svc.my-namespace -o jsonpath='{.status.certificate}' \ |
| 171 | + | base64 --decode > server.crt |
| 172 | +``` |
| 173 | + |
| 174 | +Sekarang kamu bisa menggunakan `server.crt` dan `server-key.pem` sebagai pasangan |
| 175 | +kunci untuk memulai server HTTPS kamu. |
| 176 | + |
| 177 | +## Penyetujuan CertificateSigningRequest |
| 178 | + |
| 179 | +Administrator Kubernetes (dengan izin yang cukup) dapat menyetujui secara manual |
| 180 | +(atau menolak) Certificate Signing Requests dengan menggunakan perintah `kubectl certificate |
| 181 | +approve` dan `kubectl certificate deny`. Namun jika kamu bermaksud |
| 182 | +untuk menggunakan API ini secara sering, kamu dapat mempertimbangkan untuk menulis |
| 183 | +Certificate _controller_ otomatis. |
| 184 | + |
| 185 | +Baik itu mesin atau manusia yang menggunakan kubectl seperti di atas, peran pemberi persetujuan adalah |
| 186 | +untuk memverifikasi bahwa CSR memenuhi dua persyaratan: |
| 187 | +1. Subjek CSR mengontrol kunci pribadi yang digunakan untuk menandatangani CSR. Ini |
| 188 | + mengatasi ancaman pihak ketiga yang menyamar sebagai subjek resmi. |
| 189 | + Pada contoh di atas, langkah ini adalah untuk memverifikasi bahwa Pod mengontrol |
| 190 | + kunci pribadi yang digunakan untuk menghasilkan CSR. |
| 191 | +2. Subjek CSR berwenang untuk bertindak dalam konteks yang diminta. Ini |
| 192 | + mengatasi ancaman subjek yang tidak diinginkan bergabung dengan klaster. Dalam |
| 193 | + contoh di atas, langkah ini untuk memverifikasi bahwa Pod diizinkan |
| 194 | + berpartisipasi dalam Service yang diminta. |
| 195 | + |
| 196 | +Jika dan hanya jika kedua persyaratan ini dipenuhi, pemberi persetujuan harus menyetujui |
| 197 | +CSR dan sebaliknya harus menolak CSR. |
| 198 | + |
| 199 | +## Peringatan tentang Izin Persetujuan |
| 200 | + |
| 201 | +Kemampuan untuk menyetujui CSR menentukan siapa yang mempercayai siapa di dalam lingkungan kamu. |
| 202 | +Kemampuan untuk menyetujui CSR tersebut seharusnya tidak diberikan secara luas. |
| 203 | +Persyaratan tantangan yang disebutkan di bagian sebelumnya dan |
| 204 | +dampak dari mengeluarkan sertifikat khusus, harus sepenuhnya dipahami |
| 205 | +sebelum memberikan izin ini. |
| 206 | + |
| 207 | +## Catatan Untuk Administrator Klaster |
| 208 | + |
| 209 | +Tutorial ini mengasumsikan bahwa penanda tangan diatur untuk melayani API sertifikat. |
| 210 | +Kubernetes _controller manager_ menyediakan implementasi bawaan dari penanda tangan. Untuk |
| 211 | +mengaktifkan, berikan parameter `--cluster-signed-cert-file` dan |
| 212 | +`--cluster-signed-key-file` ke _controller manager_ dengan _path_ ke |
| 213 | +pasangan kunci CA kamu. |
| 214 | + |
0 commit comments