Pengenalan kepada Kebenaran Kubernetes Konsul Hashicorp
Betul, selepas dikeluarkan Konsul Hashicorp 1.5.0 pada awal Mei 2019, di Konsul anda boleh membenarkan aplikasi dan perkhidmatan berjalan di Kubernetes secara asli.
Dalam tutorial ini kami akan membuat langkah demi langkah POC (Bukti konsep, PoC) yang menunjukkan ciri baharu ini. Anda dijangka mempunyai pengetahuan asas tentang Kubernetes dan Konsul Hashicorp. Walaupun anda boleh menggunakan mana-mana platform awan atau persekitaran di premis, dalam tutorial ini kami akan menggunakan Platform Awan Google.
Mengkaji
Jika kita pergi ke Dokumentasi konsul mengenai kaedah kebenarannya, kami akan mendapat gambaran keseluruhan pantas tentang tujuan dan kes penggunaannya, serta beberapa butiran teknikal dan gambaran keseluruhan logik. Saya sangat mengesyorkan membacanya sekurang-kurangnya sekali sebelum meneruskan, kerana saya kini akan menerangkan dan mengunyah semuanya.
Rajah 1: Gambaran keseluruhan rasmi kaedah kebenaran Konsul
Sudah tentu, terdapat maklumat yang berguna di sana, tetapi tiada panduan tentang cara benar-benar menggunakan semuanya. Jadi, seperti mana-mana orang yang waras, anda menjelajah Internet untuk mendapatkan panduan. Dan kemudian... Anda gagal. Ia berlaku. Mari kita betulkan ini.
Sebelum kita meneruskan untuk mencipta POC kita, mari kita kembali kepada gambaran keseluruhan kaedah kebenaran Konsul (Rajah 1) dan memperhalusinya dalam konteks Kubernetes.
seni bina
Dalam tutorial ini, kami akan mencipta pelayan Konsul pada mesin berasingan yang akan berkomunikasi dengan kluster Kubernetes dengan klien Konsul dipasang. Kami kemudiannya akan membuat aplikasi dummy kami dalam pod dan menggunakan kaedah kebenaran yang dikonfigurasikan kami untuk membaca dari kedai kunci/nilai Konsul kami.
Rajah di bawah memperincikan seni bina yang kami cipta dalam tutorial ini, serta logik di sebalik kaedah kebenaran, yang akan diterangkan kemudian.
Rajah 2: Gambaran Keseluruhan Kaedah Kebenaran Kubernetes
Nota ringkas: pelayan Konsul tidak perlu tinggal di luar gugusan Kubernetes untuk ini berfungsi. Tetapi ya, dia boleh melakukannya dengan cara ini dan itu.
Jadi, mengambil gambar rajah gambaran keseluruhan Konsul (Rajah 1) dan menggunakan Kubernetes padanya, kami mendapat gambar rajah di atas (Rajah 2), dan logiknya di sini adalah seperti berikut:
Setiap pod akan mempunyai akaun perkhidmatan yang dilampirkan padanya yang mengandungi token JWT yang dijana dan diketahui oleh Kubernetes. Token ini juga dimasukkan ke dalam pod secara lalai.
Aplikasi atau perkhidmatan kami di dalam pod memulakan arahan log masuk kepada pelanggan Konsul kami. Permintaan log masuk juga akan menyertakan token dan nama kami dicipta khas kaedah kebenaran (jenis Kubernetes). Langkah #2 ini sepadan dengan langkah 1 rajah Konsul (Skim 1).
Pelanggan Konsul kami kemudiannya akan memajukan permintaan ini kepada pelayan Konsul kami.
MAGIC! Di sinilah pelayan Konsul mengesahkan kesahihan permintaan, mengumpul maklumat tentang identiti permintaan dan membandingkannya dengan mana-mana peraturan pratakrif yang berkaitan. Di bawah adalah satu lagi rajah untuk menggambarkan ini. Langkah ini sepadan dengan langkah 3, 4 dan 5 rajah gambaran keseluruhan Konsul (Rajah 1).
Pelayan Konsul kami menjana token Konsul dengan kebenaran mengikut peraturan kaedah kebenaran kami yang ditentukan (yang telah kami tentukan) berkenaan identiti peminta. Ia kemudiannya akan menghantar semula token itu. Ini sepadan dengan langkah 6 rajah Konsul (Rajah 1).
Pelanggan Konsul kami memajukan token kepada permohonan atau perkhidmatan yang meminta.
Aplikasi atau perkhidmatan kami kini boleh menggunakan token Konsul ini untuk berkomunikasi dengan data Konsul kami, seperti yang ditentukan oleh keistimewaan token.
Keajaiban terbongkar!
Bagi anda yang tidak berpuas hati dengan hanya seekor arnab yang keluar dari topi dan ingin tahu bagaimana ia berfungsi... izinkan saya "tunjukkan kepada anda sejauh mana lubang Arnab'.
Seperti yang dinyatakan sebelum ini, langkah "ajaib" kami (Rajah 2: Langkah 4) ialah tempat pelayan Konsul mengesahkan permintaan, mengumpul maklumat tentang permintaan dan membandingkannya dengan mana-mana peraturan pratakrif yang berkaitan. Langkah ini sepadan dengan langkah 3, 4 dan 5 rajah gambaran keseluruhan Konsul (Rajah 1). Di bawah adalah gambar rajah (Rajah 3), tujuannya adalah untuk menunjukkan dengan jelas apa yang sebenarnya berlaku di bawah tudung kaedah kebenaran Kubernetes tertentu.
Rajah 3: Keajaiban terbongkar!
Sebagai titik permulaan, pelanggan Konsul kami memajukan permintaan log masuk ke pelayan Konsul kami dengan token akaun Kubernetes dan nama contoh khusus bagi kaedah kebenaran yang telah dibuat sebelum ini. Langkah ini sepadan dengan langkah 3 dalam penjelasan litar sebelumnya.
Kini pelayan Konsul (atau ketua) perlu mengesahkan ketulenan token yang diterima. Oleh itu, ia akan merujuk kluster Kubernetes (melalui pelanggan Konsul) dan, dengan kebenaran yang sesuai, kami akan mengetahui sama ada token itu tulen dan milik siapa ia.
Permintaan yang disahkan kemudian dikembalikan kepada ketua Konsul, dan pelayan Konsul mencari contoh kaedah kebenaran dengan nama yang ditentukan daripada permintaan log masuk (dan jenis Kubernetes).
Ketua konsul mengenal pasti contoh kaedah kebenaran yang ditentukan (jika ditemui) dan membaca set peraturan mengikat yang dilampirkan padanya. Ia kemudian membaca peraturan ini dan membandingkannya dengan atribut identiti yang disahkan.
TA-dah! Mari kita teruskan ke langkah 5 dalam penjelasan litar sebelumnya.
Jalankan pelayan Konsul pada mesin maya biasa
Mulai sekarang, kebanyakannya saya akan memberikan arahan tentang cara membuat POC ini, selalunya dalam titik peluru, tanpa penjelasan ayat penuh. Selain itu, seperti yang dinyatakan sebelum ini, saya akan menggunakan GCP untuk mencipta semua infrastruktur, tetapi anda boleh mencipta infrastruktur yang sama di tempat lain.
Mulakan mesin maya (contoh/pelayan).
Buat peraturan untuk tembok api (kumpulan keselamatan dalam AWS):
Saya suka memberikan nama mesin yang sama kepada kedua-dua peraturan dan tag rangkaian, dalam kes ini "skywiz-consul-server-poc".
Cari alamat IP komputer tempatan anda dan tambahkannya pada senarai alamat IP sumber supaya kami boleh mengakses antara muka pengguna (UI).
Buka port 8500 untuk UI. Klik Buat. Kami akan menukar tembok api ini semula tidak lama lagi [pautan].
Tambahkan peraturan tembok api pada contoh. Kembali ke papan pemuka VM pada Pelayan Konsul dan tambahkan "skywiz-consul-server-poc" pada medan tag rangkaian. Klik Simpan.
Pasang Konsul pada mesin maya, semak di sini. Ingat anda memerlukan versi Konsul β₯ 1.5 [pautan]
Mari kita buat Konsul nod tunggal - konfigurasi adalah seperti berikut.
groupadd --system consul
useradd -s /sbin/nologin --system -g consul consul
mkdir -p /var/lib/consul
chown -R consul:consul /var/lib/consul
chmod -R 775 /var/lib/consul
mkdir /etc/consul.d
chown -R consul:consul /etc/consul.d
Untuk panduan yang lebih terperinci tentang memasang Konsul dan menyediakan gugusan 3 nod, lihat di sini.
Cipta fail /etc/consul.d/agent.json seperti berikut [pautan]:
consul agent
-server
-ui
-client 0.0.0.0
-data-dir=/var/lib/consul
-bootstrap-expect=1
-config-dir=/etc/consul.d
Anda sepatutnya melihat sekumpulan output dan berakhir dengan "... kemas kini disekat oleh ACL."
Cari alamat IP luaran pelayan Konsul dan buka penyemak imbas dengan alamat IP ini pada port 8500. Pastikan UI dibuka.
Cuba tambah pasangan kunci/nilai. Mesti ada kesilapan. Ini kerana kami memuatkan pelayan Konsul dengan ACL dan melumpuhkan semua peraturan.
Kembali ke shell anda pada pelayan Konsul dan mulakan proses di latar belakang atau cara lain untuk menjalankannya dan masukkan yang berikut:
consul acl bootstrap
Cari nilai "SecretID" dan kembali ke UI. Dalam tab ACL, masukkan ID rahsia token yang baru anda salin. Salin SecretID di tempat lain, kami akan memerlukannya kemudian.
Sekarang tambahkan pasangan kunci/nilai. Untuk POC ini, tambahkan yang berikut: kunci: βcustom-ns/test_keyβ, nilai: βSaya dalam folder custom-ns!β
Melancarkan kluster Kubernetes untuk aplikasi kami dengan pelanggan Konsul sebagai Daemonset
Buat gugusan K8s (Kubernetes). Kami akan menciptanya dalam zon yang sama dengan pelayan untuk akses yang lebih pantas, dan supaya kami boleh menggunakan subnet yang sama untuk menyambung dengan mudah dengan alamat IP dalaman. Kami akan memanggilnya "skywiz-app-with-consul-client-poc".
Sebagai nota sampingan, berikut ialah tutorial bagus yang saya temui semasa menyediakan kluster POC Consul dengan Consul Connect.
Kami juga akan menggunakan carta helm Hashicorp dengan fail nilai lanjutan.
Pasang dan konfigurasikan Helm. Langkah konfigurasi:
Gunakan fail nilai berikut (nota saya paling banyak melumpuhkan):
### poc-helm-consul-values.yaml
global:
enabled: false
image: "consul:latest"
# Expose the Consul UI through this LoadBalancer
ui:
enabled: false
# Allow Consul to inject the Connect proxy into Kubernetes containers
connectInject:
enabled: false
# Configure a Consul client on Kubernetes nodes. GRPC listener is required for Connect.
client:
enabled: true
join: ["<PRIVATE_IP_CONSUL_SERVER>"]
extraConfig: |
{
"acl" : {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
# Minimal Consul configuration. Not suitable for production.
server:
enabled: false
# Sync Kubernetes and Consul services
syncCatalog:
enabled: false
Gunakan carta helm:
./helm install -f poc-helm-consul-values.yaml ./consul-helm - name skywiz-app-with-consul-client-poc
Apabila ia cuba dijalankan, ia memerlukan kebenaran untuk pelayan Konsul, jadi mari tambahkannya.
Perhatikan "Julat Alamat Pod" yang terdapat pada papan pemuka kluster dan rujuk kembali peraturan tembok api "skywiz-consul-server-poc" kami.
Tambahkan julat alamat untuk pod ke senarai alamat IP dan buka port 8301 dan 8300.
Pergi ke UI Konsul dan selepas beberapa minit anda akan melihat kluster kami muncul dalam tab nod.
Mengkonfigurasi Kaedah Kebenaran dengan Mengintegrasikan Konsul dengan Kubernetes
Kembali ke cangkerang pelayan Konsul dan eksport token yang anda simpan sebelum ini:
export CONSUL_HTTP_TOKEN=<SecretID>
Kami memerlukan maklumat daripada kluster Kubernetes kami untuk membuat contoh kaedah pengesahan:
kubernetes-host
kubectl get endpoints | grep kubernetes
kubernetes-service-account-jwt
kubectl get sa <helm_deployment_name>-consul-client -o yaml | grep "- name:"
kubectl get secret <secret_name_from_prev_command> -o yaml | grep token:
Token ini dikodkan base64, jadi nyahsulitnya menggunakan alat kegemaran anda [pautan]
kubernetes-ca-cert
kubectl get secret <secret_name_from_prev_command> -o yaml | grep ca.crt:
Ambil sijil "ca.crt" (selepas penyahkodan base64) dan tuliskannya ke dalam fail "ca.crt".
Sekarang nyatakan kaedah pengesahan, menggantikan ruang letak dengan nilai yang baru anda terima.
consul acl auth-method create
-type "kubernetes"
-name "auth-method-skywiz-consul-poc"
-description "This is an auth method using kubernetes for the cluster skywiz-app-with-consul-client-poc"
-kubernetes-host "<k8s_endpoint_retrieved earlier>"
[email protected]
-kubernetes-service-account-
jwt="<decoded_token_retrieved_earlier>"
Seterusnya kita perlu membuat peraturan dan melampirkannya pada peranan baharu. Untuk bahagian ini anda boleh menggunakan UI Konsul, tetapi kami akan menggunakan baris arahan.
Kemudian gunakan arahan terbina berikut untuk mencipta peta konfigurasi [pautan]. Sila ambil perhatian bahawa kami merujuk kepada nama perkhidmatan kami, gantikannya jika perlu.
Sekarang mari kita lihat keajaiban dalam tindakan!
Buat beberapa folder kunci lagi dengan kunci peringkat atas yang sama (iaitu. /sample_key) dan nilai pilihan anda. Buat dasar dan peranan yang sesuai untuk laluan utama baharu. Kami akan melakukan pengikatan kemudian.
Ujian ruang nama tersuai:
Mari buat ruang nama kita sendiri:
kubectl create namespace custom-ns
Mari buat pod dalam ruang nama baharu kami. Tulis konfigurasi untuk pod.
Anda boleh base64 menyahkod "Nilai" dan melihat bahawa ia sepadan dengan nilai dalam custom-ns/test_key dalam UI. Jika anda menggunakan nilai yang sama di atas dalam tutorial ini, nilai anda yang dikodkan ialah IkknbSBpbiB0aGUgY3VzdG9tLW5zIGZvbGRlciEi.
Ujian akaun perkhidmatan pengguna:
Cipta Akaun Perkhidmatan tersuai menggunakan arahan berikut [pautan].
Kebenaran ditolak. Oh, kami terlupa untuk menambah peraturan baharu yang mengikat dengan kebenaran yang sesuai, mari lakukannya sekarang.
Ulangi langkah sebelumnya di atas:
a) Buat Dasar yang sama untuk awalan βcustom-sa/β.
b) Cipta Peranan, panggil "peranan tersuai"
c) Lampirkan Polisi pada Peranan.
Buat Rule-Binding (hanya mungkin daripada cli/api). Perhatikan maksud berbeza bendera pemilih.
consul acl binding-rule create
-method=auth-method-skywiz-consul-poc
-bind-type=role
-bind-name='custom-sa-role'
-selector='serviceaccount.name=="custom-sa"'
Log masuk semula dari bekas "poc-ubuntu-custom-sa". Berjaya!
Anda juga boleh memastikan bahawa token ini tidak memberikan akses kepada kv dalam "custom-ns/". Hanya ulangi arahan di atas selepas menggantikan "custom-sa" dengan awalan "custom-ns".
Kebenaran ditolak.
Contoh tindanan:
Perlu diingat bahawa semua pemetaan yang mengikat peraturan akan ditambahkan pada token dengan hak ini.
Bekas kami "poc-ubuntu-custom-sa" berada dalam ruang nama lalai - jadi mari kita gunakannya untuk mengikat peraturan yang berbeza.
Ulangi langkah sebelumnya:
a) Buat Dasar yang sama untuk awalan kunci βlalai/β.
b) Cipta Peranan, namakannya "default-ns-role"
c) Lampirkan Polisi pada Peranan.
Buat Peraturan-Binding (hanya mungkin daripada cli/api)
consul acl binding-rule create
-method=auth-method-skywiz-consul-poc
-bind-type=role
-bind-name='default-ns-role'
-selector='serviceaccount.namespace=="default"'
Kembali ke bekas "poc-ubuntu-custom-sa" kami dan cuba akses laluan kv "lalai/".
Kebenaran ditolak.
Anda boleh melihat bukti kelayakan yang ditentukan untuk setiap token dalam UI di bawah ACL > Token. Seperti yang anda lihat, token semasa kami hanya mempunyai satu "peranan tersuai" yang dilampirkan padanya. Token yang sedang kami gunakan telah dijana semasa kami log masuk dan hanya ada satu peraturan yang mengikat yang sepadan dengan itu. Kami perlu log masuk semula dan menggunakan token baharu.
Pastikan anda boleh membaca dari kedua-dua laluan kv "custom-sa/" dan "default/".
Kejayaan!
Ini kerana "poc-ubuntu-custom-sa" kami sepadan dengan pengikatan peraturan "custom-sa" dan "default-ns".
Kesimpulan
TTL token mgmt?
Pada masa penulisan ini, tiada cara bersepadu untuk menentukan TTL untuk token yang dijana oleh kaedah kebenaran ini. Ia akan menjadi peluang yang hebat untuk menyediakan automasi yang selamat bagi kebenaran Konsul.
Terdapat pilihan untuk membuat token secara manual dengan TTL: