Kata pengantar
Karena layanan sebelumnya semuanya ada di intranet, konfigurasi kluster Zookeeper semuanya adalah IP intranet, dan jaringan eksternal tidak membuka port yang relevan. Baru -baru ini, karena peningkatan bisnis, kami telah membeli layanan Alibaba Cloud dan perlu membuka layanan zookeeper kepada publik.
pertanyaan
Zookeeper+Dubbo, Bagaimana cara mengatur otentikasi keamanan? Saya tidak ingin layanan lain terhubung ke Zookeeper karena server Zookeeper ini ada di jaringan eksternal.
Permintaan dokumentasi resmi:
Zookeeper adalah sub-proyek Apacahe Hadoop. Ini adalah layanan direktori jenis pohon yang mendukung perubahan dorongan. Ini cocok sebagai pusat pendaftaran untuk layanan Dubbo. Ini memiliki intensitas industri yang tinggi dan dapat digunakan di lingkungan produksi. Disarankan untuk menggunakannya.
Deskripsi Proses:
• Ketika penyedia layanan dimulai: Tulis alamat URL Anda sendiri ke direktori /dubbo/com.foo.barservice/providers
• Ketika konsumen layanan dimulai: Berlangganan ke alamat URL penyedia di /dubbo/com.foo.barservice/providers Directory. Dan tulis alamat URL Anda sendiri ke direktori /dubbo/com.foo.barservice/consumers
• Ketika pusat pemantauan dimulai: Berlangganan semua alamat URL penyedia dan konsumen di /dubbo/com.foo.barservice Directory
Mendukung fungsi -fungsi berikut:
• Ketika penyedia memiliki shutdown abnormal seperti pemadaman listrik, pusat pendaftaran dapat secara otomatis menghapus informasi penyedia.
• Ketika pusat pendaftaran dimulai kembali, data pendaftaran dapat dipulihkan secara otomatis dan permintaan berlangganan dapat berlangganan.
• Ketika sesi berakhir, data pendaftaran dapat dipulihkan secara otomatis dan permintaan berlangganan dapat berlangganan.
• Saat mengatur <dubbo: periksa registri = "false" />, permintaan pendaftaran dan langganan gagal dicatat, dan latar belakangnya tepat waktu untuk mencoba lagi
• Informasi login Zookeeper dapat diatur melalui <dubbo: registry username = "admin" kata sandi = "1234" />
• Node root zookeeper dapat diatur melalui <dubbo: grup registry = "dubbo" />. Jika Anda tidak mengaturnya, Anda akan menggunakan pohon tanpa akar.
• Mendukung * karakter wildcard <dubbo: grup referensi = "" versi = "" /> untuk berlangganan semua grup dan semua versi layanan
Pasal 5 dari dokumen situs web resmi dengan jelas menyatakan bahwa informasi login Zookeeper dapat diatur melalui nama pengguna dan kata sandi.
Berikut ini adalah deskripsi parameter registri:
Namun, jika Anda mengatur ACL melalui Digest di ZooKeeper dan kemudian mengkonfigurasi pengguna dan kata sandi yang sesuai di Dubbo Registry, layanan tidak akan terdaftar di ZooKeeper dan akan melaporkan keepererRorCode = kesalahan NOAuth.
Namun, ketika saya memeriksa kode sumber terkait ZooKeeperregistry, saya tidak menemukan otentikasi yang relevan. Saya jarang mengajukan pertanyaan serupa di seluruh jaringan, dan pertanyaan ini tampaknya tidak diperhatikan.
ACL di Zookeeper
Ringkasan
Dalam sistem file tradisional, ACL dibagi menjadi dua dimensi, satu adalah kelompok dan yang lainnya adalah izin. Subdirektori/file mewarisi ACL dari direktori induk secara default. Di Zookeeper, ACL Node tidak memiliki hubungan warisan dan dikendalikan secara independen. ACL Zookeeper dapat dipahami dari tiga dimensi: satu adalah skema; yang kedua adalah pengguna; dan yang ketiga adalah izin, yang biasanya dinyatakan sebagai
Skema: ID: Izin
Berikut ini diperkenalkan dari ketiga aspek ini:
Skema: Skema sesuai dengan skema mana yang digunakan untuk mengelola izin. Zookeeper mengimplementasikan skema ACL pluggable, yang dapat memperluas mekanisme ACL dengan memperluas skema. Zookeeper-3.4.4 mendukung skema berikut secara default:
Dunia: Hanya ada satu ID di bawahnya, disebut siapa saja, dunia: siapa pun mewakili siapa pun, dan simpul di ZooKeeper yang memiliki izin kepada semua orang milik dunia: siapa pun
AUTH: Tidak memerlukan ID, selama pengguna melalui otentikasi memiliki izin (Zookeeper mendukung otentikasi melalui Kerberos, dan juga mendukung otentikasi dalam bentuk nama pengguna/kata sandi)
Digest: ID yang sesuai adalah nama pengguna: base64 (sha1 (kata sandi)), perlu melewati otentikasi dalam bentuk nama pengguna: kata sandi
IP: ID yang sesuai adalah alamat IP klien. Saat mengaturnya, Anda dapat mengatur segmen IP, seperti IP: 192.168.1.0/16, yang berarti bahwa segmen IP cocok dengan 16 bit pertama
Super: Dalam skema ini, ID yang sesuai memiliki izin super dan dapat melakukan apa saja (CDRWA)
Izin: Zookeeper saat ini mendukung izin berikut:
Buat (c): Buat izin, Anda dapat membuat simpul anak di bawah node saat ini
Hapus (d): Hapus izin, Anda dapat menghapus node saat ini
Baca (r): Baca Izin, Anda bisa mendapatkan data dari node saat ini, Anda dapat mendaftarkan semua node anak di node saat ini
Tulis (w): Tulis izin, Anda dapat menulis data ke node saat ini
Admin (a): izin admin, Anda dapat mengatur izin dari node saat ini
Manajemen klien
Kami dapat terhubung ke klien melalui perintah berikut:
./zkcli.sh
membantu
[ZK: LocalHost: 2181 (Terhubung) 2] HelpZOokeeper -Server Host: Port CMD Args Connect Host: Port Get Path [Watch] LS Path [tonton] Data Path [Versi] RMR Path Delquota [-N | -B] Jalur QUIT Printwatch CLOING ON | OFF Buat [-s] [-e] PATTRUT PATTRUT PATTRA] PATH PATTR2 LITED 2 DAFTAR PATH-PATTA [-S] [-E] PATTRUT PATTRA] PATH-PATTRA [-S] PATTRU PATTRU Path Getacl Path Sync Path Redo CMDNO SDUDAUTH SCHEME AUTH AUTH PATH DELETE [VERSI] SETQUOTA -N | -B VAL PATH
Operasi sederhana
[zk: localhost:2181(CONNECTED) 12] ls /[dubbo, test, zookeeper][zk: localhost:2181(CONNECTED) 13] create /itstyle data ip:192.168.1.190:cdrwCreated /itstyle[zk: localhost:2181(CONNECTED) 14] getAcl /itstyle'ip ,'192.168.1.190: cdrw
Kode Operasi ZKClient
impor java.security.nosuchalgorithmException; impor java.util.arraylist; impor java.util.list; impor java.util.map; org.i0itec.zkclient.zkclient; impor org.apache.zooKeeper.zoodefs; org.apache.zooKeeper.data.id; impor org.apache.zookeepereper.data.stat; impor org.apache.zookeeper.server.auth.digestAuthenticationProvider; Kelas Publik Acl {Private Static String Zkaddress = "192.1688.1.19:19.19" private static final string testNode = "/dubbo"; Private Static Final String readauth = "baca-pengguna: 123456"; private static final string writeAuth = "write-user: 123456"; string final private static deleteAuth = "delete-user: 123456"; string final statis pribadi allAuth = "Super-User: 123456"; Private Static Final String adminuth = "Admin-User: 123456"; Private Static Final String Digest = "Digest"; private static void initnode () melempar nosuchalgorithMexception {zkclient zkclient = new zkclient (zkaddress); System.out.println (DigestAuthenticationProvider.GeneredIgest (AllAuth)); zkclient.addauthinfo (Digest, allauth.getbytes ()); if (zkclient.exists (testNode)) {zkclient.delete (testNode); System.out.println ("Node Delete Sukses!"); } Daftar <Acl> ACLS = ArrayList baru <cl> (); ACLS.Add (ACL baru (zoodefs.perms.all, ID baru (Digest, DigestAuthenticationProvider.Generatedigest (AllAuth)))); ACLS.Add (ACL baru (zoodefs.perms.all, ID baru (Digest, DigestAuthenticationProvider.Generatedigest (AllAuth)))); acls.add (ACL baru (zoodefs.perms.read, ID baru (Digest, DigestAuthenticationProvider.GenerationGest (readAuth)))); acls.add (ACL baru (zoodefs.perms.write, ID baru (Digest, DigestAuthenticationProvider.Generatedigest (WriteAuth))))); ACLS.Add (ACL baru (zoodefs.perms.delete, ID baru (Digest, DigestAuthenticationProvider.GeneredIgest (DeleteAuth)))); ACLS.Add (ACL baru (Zoodefs.perms.admin, ID baru (Digest, DigestAuthenticationProvider.GeneredIgest (AdminOuth)))); zkclient.createPersistent (testNode, testNode, ACLS); System.out.println (zkclient.readdata (testNode)); System.out.println ("Node telah berhasil!"); zkclient.close (); } private static void readTest () {zkclient zkclient = new zkclient (zkaddress); coba {System.out.println (zkclient.readdata (testNode)); // tidak ada informasi otentikasi, kesalahan akan terjadi saat membaca} catch (pengecualian e) {system.err.println (e.getMessage ()); } coba {zkclient.addauthinfo (Digest, adminOuth.getbytes ()); System.out.println (zkclient.readdata (testNode)); // izin admin tidak cocok dengan izin baca, dan bacaan juga akan terjadi ketika membaca} catch (pengecualian e) {system.err.println (e.getMessage ()); } coba {zkclient.addauthinfo (digest, readauth.getbytes ()); System.out.println (zkclient.readdata (testNode)); // Hanya informasi otentikasi dengan izin baca yang dapat dibaca secara normal} catch (pengecualian e) {system.err.println (e.getMessage ()); } zkclient.close (); } private static void writeTest () {zkclient zkclient = new zkclient (zkaddress); coba {zkclient.writedata (testNode, "new-data"); // tulis gagal tanpa informasi otentikasi} catch (pengecualian e) {system.err.println (e.getMessage ()); } coba {zkclient.addauthinfo (digest, writeAuth.getbytes ()); zkclient.writedata (testNode, "new-data"); // tulis secara normal setelah menambahkan informasi otentikasi} catch (pengecualian e) {system.err.println (e.getMessage ()); } coba {zkclient.addauthinfo (digest, readauth.getbytes ()); System.out.println (zkclient.readdata (testNode)); // Baca verifikasi nilai baru} catch (pengecualian e) {system.err.println (e.getMessage ()); } zkclient.close (); } private static void deleteTest () {zkclient zkclient = new zkclient (zkaddress); zkclient.addauthinfo (Digest, deleteAuth.getbytes ()); coba {System.out.println (zkclient.readdata (testNode)); zkclient.delete (testNode); System.out.println ("Node Delete Sukses!"); } catch (Exception e) {System.err.println (e.getMessage ()); } zkclient.close (); } private static void changeAclTest () {zkclient zkclient = new zkclient (zkaddress); // Catatan: Metode ZKClient.setacl dapat ditemukan untuk melihat kode sumber. Metode readdata dan setacl disebut. // Jadi untuk memodifikasi atribut ACL dari node, Anda harus memiliki izin baca dan admin: baca dan admin zkclient.addauthinfo (Digest, adminOuth.getbytes ()); zkclient.addauthinfo (Digest, readauth.getbytes ()); Coba {List <Acl> acls = ArrayList baru <cl> (); ACLS.Add (ACL baru (zoodefs.perms.all, ID baru (Digest, DigestAuthenticationProvider.GeneratedIgest (Adminauth))); zkclient.setacl (testNode, ACLS); MAP.Entry <Daftar <Acl>, STAT> ACLRESULT = ZKCLION.GETCL (TESTNOCE (TESTNODE (ACL); System.out.println (aclresult.getKey ()); System.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Meringkaskan
Sebagian besar layanan digunakan pada intranet dan jarang terbuka untuk jaringan eksternal. Namun, otentikasi izin pengguna Zookeeper Dubbo tampaknya tidak berhasil. Jika Anda harus membukanya ke dunia luar, Anda hanya dapat menggunakan ptables atau firewall untuk melakukan kontrol akses IP. Jika itu adalah server cloud Alibaba, grup keamanan juga merupakan pilihan yang baik.
Contoh otentikasi keamanan di atas dari layanan terdistribusi Dubbo+Zookeeper adalah seluruh konten yang dibagikan oleh editor. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.