مقدمة
نظرًا لأن جميع الخدمات السابقة كانت في إنترانت ، فإن تكوينات كتلة Zookeeper كانت جميعها IP intranet ، ولم تفتح الشبكة الخارجية المنافذ ذات الصلة. في الآونة الأخيرة ، بسبب ترقيات الأعمال ، قمنا بشراء خدمات Alibaba Cloud ونحتاج إلى فتح خدمات Zookeeper للجمهور.
سؤال
ZOOKEEPER+DUBBO ، كيفية إعداد مصادقة الأمان؟ لا أريد أن تتصل خدمات أخرى بـ ZookeEper لأن خادم ZookeEper هذا على الشبكة الخارجية.
الاستعلام عن الوثائق الرسمية:
Zookeeper هو مشروع فرعي من Apacahe Hadoop. إنها خدمة دليل من نوع الأشجار تدعم تغيير التغيير. إنه مناسب كمركز تسجيل لخدمات Dubbo. لديها شدة صناعية عالية ويمكن استخدامها في بيئات الإنتاج. يوصى باستخدامه.
وصف العملية:
• عند بدء تشغيل مزود الخدمة: اكتب عنوان عنوان URL الخاص بك إلى دليل /dubbo/com.foo.barservice/providers
• عند بدء تشغيل مستهلك الخدمة: اشترك في عنوان URL للمزود في دليل /dubbo/com.foo.barservice/providers. واكتب عنوان عنوان URL الخاص بك إلى دليل /dubbo/com.foo.barservice/consumers
• عند بدء تشغيل مركز المراقبة: الاشتراك في جميع عناوين عنوان URL للمزود والعنوان الاستهلاكي في دليل /dubbo/com.foo.barservice
يدعم الوظائف التالية:
• عندما يكون للمزود إيقاف تشغيل غير طبيعي مثل انقطاع التيار الكهربائي ، يمكن لمركز التسجيل حذف معلومات المزود تلقائيًا.
• عند إعادة تشغيل مركز التسجيل ، يمكن استعادة بيانات التسجيل تلقائيًا ويمكن الاشتراك في طلبات الاشتراك.
• عندما تنتهي صلاحية الجلسة ، يمكن استعادة بيانات التسجيل تلقائيًا ويمكن الاشتراك في طلبات الاشتراك.
• عند الإعداد <dubbo: تسجيل التسجيل = "false" /> ، يتم تسجيل طلب التسجيل والاشتراك ، ويتم توقيت الخلفية لإعادة المحاولة
• يمكن تعيين معلومات تسجيل الدخول إلى ZookeEper من خلال <DubBo: username = "admin" password = "1234" />
• يمكن تعيين عقدة الجذر لـ ZookeEper من خلال <DubBo: Registry Group = "Dubbo" />. إذا لم تقم بتعيينه ، فستستخدم الشجرة بدون جذور.
• يدعم حرف * wildcard <dubbo: Group Reference = "" الإصدار = "" /> للاشتراك في جميع المجموعات وجميع إصدارات الخدمة
تنص المادة 5 من وثيقة الموقع الرسمي بوضوح على أنه يمكن تعيين معلومات تسجيل الدخول إلى ZookeEper من خلال حقول اسم المستخدم وكلمة المرور.
فيما يلي وصف معلمات التسجيل:
ومع ذلك ، إذا قمت بتعيين ACL من خلال Digest على ZookeEper ثم قم بتكوين المستخدم وكلمة المرور المقابلة في سجل Dubbo ، فلن يتم تسجيل الخدمة على ZookeEper وستبلغ عن KeepererRorCode = خطأ Noauth.
ومع ذلك ، عندما راجعت رمز المصدر ذي الصلة ZookeEperregistry ، لم أجد أي مصادقة ذات صلة. نادراً ما طرحت أسئلة مماثلة على الشبكة بأكملها ، ولا يبدو أن هذا السؤال قد اهتم به.
ACL في Zookeeper
ملخص
في أنظمة الملفات التقليدية ، تنقسم ACL إلى بعدين ، أحدهما مجموعة والآخر هو أذونات. ترث الدليل الفرعي/الملفات ACLs من الدليل الأصل بشكل افتراضي. في Zookeeper ، لا يوجد لدى ACL في Node علاقة ميراث ويتم التحكم فيه بشكل مستقل. يمكن فهم ACL في Zookeeper من ثلاثة أبعاد: واحد هو مخطط ؛ والثاني هو المستخدم. والثالث هو إذن ، والذي يتم التعبير عنه عادة ما
المخطط: معرف: أذونات
يتم تقديم ما يلي من هذه الجوانب الثلاثة:
المخطط: مخطط يتوافق مع المخطط الذي يستخدم لإدارة الأذونات. ينفذ ZookeEper مخطط ACL قابل للتراكم ، والذي يمكنه تمديد آلية ACL عن طريق تمديد المخطط. يدعم Zookeeper-3.4.4 المخططات التالية افتراضيًا:
العالم: لا يوجد سوى معرف واحد أسفله ، يسمى أي شخص ، العالم: أي شخص يمثل أي شخص ، والعقدة في Zookeeper التي لديها إذن للجميع ينتمي إلى العالم: أي شخص
Auth: لا يتطلب معرف ، طالما أن المستخدم من خلال المصادقة لديه أذونات (يدعم Zookeeper المصادقة من خلال Kerberos ، ويدعم أيضًا المصادقة في شكل اسم المستخدم/كلمة المرور)
Digest: معرفه المقابل هو اسم المستخدم: BASE64 (SHA1 (كلمة المرور)) ، فهو يحتاج إلى تمرير المصادقة في شكل اسم المستخدم: كلمة المرور
IP: معرفه المقابل هو عنوان IP الخاص بالعميل. عند إعداده ، يمكنك تعيين مقطع IP ، مثل IP: 192.168.1.0/16 ، مما يعني أن شرائح IP تتطابق مع الـ 16 بتات الأولى
سوبر: في هذا المخطط ، يحتوي المعرف المقابل على أذونات فائقة ويمكنه فعل أي شيء (CDRWA)
الإذن: يدعم Zookeeper حاليًا الأذونات التالية:
إنشاء (ج): إنشاء إذن ، يمكنك إنشاء عقدة طفل تحت العقدة الحالية
حذف (د): حذف الأذونات ، يمكنك حذف العقدة الحالية
قراءة (ص): قراءة إذن ، يمكنك الحصول على بيانات العقدة الحالية ، يمكنك سرد جميع العقد الفرعية في العقدة الحالية
اكتب (W): كتابة إذن ، يمكنك كتابة البيانات إلى العقدة الحالية
المسؤول (أ): أذونات المسؤول ، يمكنك تعيين إذن العقدة الحالية
إدارة العميل
يمكننا الاتصال بالعميل من خلال الأمر التالي:
./zkcli.sh
يساعد
[ZK: LocalHost: 2181 (Connected) 2] HelpzOokeePer -Server Host: Port CMD ARGS HONCE HOST: PORT GET PATH [WATCH] LS PATH DATA Getacl Path Sync Path Redo Cmdno Addauth Schem
عملية بسيطة
[ZK: LocalHost: 2181 (Connected) 12] LS /[Dubbo ، Test ، Zookeeper] [ZK: LocalHost: 2181 (Connected) 13] إنشاء /ItStyle Data IP: 192.168.1.190: cdrwcreed /iTStyle /itstyle'ip،'192.168.1.190: CDRW
رمز تشغيل ZKClient
استيراد java.security.nosuchalgorithmexception ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛ استيراد java.util.map ؛ استيراد org.i0itec.zkclient.zkclient org.apache.zookeeper.data.id ؛ import org.apache.zookeeper.data.stat ؛ استيراد org.apache.zookeeper.server.auth.digestauthenticationprovider ؛ الطبقة العامة acl {private static final zkaddress = "192.168.190:2181" Static Final String TestNode = "/Dubbo" ؛ السلسلة النهائية الثابتة الخاصة readauth = "read-user: 123456" ؛ Static Static Final String Writeauth = "Write-User: 123456" ؛ Static Static Final String Deleteauth = "Delete-User: 123456" ؛ Static Final Final String Allauth = "Super-User: 123456" ؛ Static Static Final String Adminauth = "Admin-User: 123456" ؛ Static Final String Digest = "Digest" ؛ private static void initnode () يلقي nosuchalgorithmexception {zkclient zkclient = new zkclient (zkaddress) ؛ System.out.println (digestauthenticationprovider.generatedIgest (allauth)) ؛ zkclient.addauthinfo (digest ، allauth.getbytes ()) ؛ if (zkclient.exists (testNode)) {zkclient.delete (testNode) ؛ System.out.println ("Node Delete Success!") ؛ } قائمة <ACL> ACLS = new ArrayList <ACL> () ؛ ACLS.Add (ACL NEW (Zoodefs.perms.all ، id new (Digest ، DigestAuthenticationProvider.generatedIgest (allauth))))) ؛ ACLS.Add (ACL NEW (Zoodefs.perms.all ، id new (Digest ، DigestAuthenticationProvider.generatedIgest (allauth))))) ؛ ACLS.Add (ACL NEW (Zoodefs.Perms.Read ، id new (Digest ، DigestAuthenticationProvider.generatedIgest (readauth))))) ؛ ACLS.Add (ACL NEW (Zoodefs.perms.write ، id new (Digest ، DigestAuthenticationProvider.generatedIgest (Writeauth)))))) ؛ ACLS.Add (ACL NEW (Zoodefs.Perms.Delete ، id new (Digest ، DigestAuthenticationProvider.generatedIgest (deleteauth))))) ؛ ACLS.Add (ACL NEW (Zoodefs.Perms.Admin ، id new (Digest ، DigestAuthenticationProvider.generatedIgest (Adminauth))))) ؛ zkclient.createpersister (testNode ، testNode ، ACLS) ؛ System.out.println (zkclient.readdata (testNode)) ؛ System.out.println ("تم إنشاء العقدة بنجاح!") ؛ zkclient.close () ؛ } private static void readtest () {zkclient zkclient = new ZkClient (Zkaddress) ؛ حاول {system.out.println (zkclient.readdata (testNode)) ؛ // لا توجد معلومات مصادقة ، سيحدث خطأ عند القراءة} catch (استثناء e) {system.err.println (e.getMessage ()) ؛ } try {zkclient.addauthinfo (digest ، adminauth.getbytes ()) ؛ System.out.println (zkclient.readdata (testNode)) ؛ // لا يتطابق إذن المسؤول مع إذن القراءة ، وسوف تحدث القراءة أيضًا عند القراءة} catch (استثناء e) {system.err.println (e.getMessage ()) ؛ } try {zkclient.addauthinfo (digest ، readauth.getBytes ()) ؛ System.out.println (zkclient.readdata (testNode)) ؛ // فقط يمكن قراءة معلومات المصادقة بإذن القراءة بشكل طبيعي} catch (استثناء e) {system.err.println (e.getMessage ()) ؛ } zkclient.close () ؛ } private static void writeTest () {zkclient zkclient = new ZkClient (Zkaddress) ؛ حاول {zkclient.writedata (testNode ، "new-data") ؛ } try {zkclient.addauthinfo (digest ، writeauth.getbytes ()) ؛ zkclient.writedata (testNode ، "new-data") ؛ // اكتب بشكل طبيعي بعد إضافة معلومات المصادقة} catch (استثناء e) {system.err.println (e.getMessage ()) ؛ } try {zkclient.addauthinfo (digest ، readauth.getBytes ()) ؛ system.out.println (zkclient.readdata (testNode)) ؛ // قراءة القيمة الجديدة التحقق} catch (استثناء e) {system.err.println (e.getMessage ()) ؛ } zkclient.close () ؛ } private static void deletetest () {ZkClient ZkClient = new ZkClient (Zkaddress) ؛ zkclient.addauthinfo (digest ، deleteauth.getbytes ()) ؛ حاول {system.out.println (zkclient.readdata (testNode)) ؛ ZkClient.delete (testNode) ؛ System.out.println ("Node Delete Success!") ؛ } catch (استثناء e) {system.err.println (e.getMessage ()) ؛ } zkclient.close () ؛ } private static void changeacltest () {zkclient zkclient = new ZkClient (Zkaddress) ؛ // ملاحظة: يمكن العثور على طريقة zkclient.setacl لعرض الرمز المصدر. تسمى أساليب ReadData و setacl. // لذلك لتعديل سمات ACL للعقدة ، يجب أن يكون لديك كل من أذونات القراءة والإسنين: read and admin zkclient.addauthinfo (digest ، adminauth.getbytes ()) ؛ zkclient.addauthinfo (Digest ، readauth.getBytes ()) ؛ حاول {list <ACL> ACLS = New ArrayList <ACL> () ؛ ACLS.Add (ACL NEW (Zoodefs.Perms.all ، المعرف الجديد (Digest ، digestauthenticationprovider.generatedIgest (adminauth))) ؛ zkclient.setacl (testnode ، acls) ؛ map.entry <acl> ، stat> aclresult = zkclient.getacl (testnode) ؛ } catch (استثناء e) {system.err.println (e.getMessage ()) ؛ System.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------لخص
يتم نشر معظم الخدمات على الإنترانت ونادراً ما تكون مفتوحة للشبكة الخارجية. ومع ذلك ، لا يبدو أن مصادقة إذن مستخدم ZookeEper من Dubbo تعمل. إذا كان عليك فتحه على العالم الخارجي ، فيمكنك فقط استخدام iPtables أو جدار الحماية لأداء التحكم في الوصول إلى IP. إذا كان خادم Alibaba Cloud ، فإن مجموعة الأمان هي أيضًا خيار جيد.
المثال أعلاه لمصادقة الأمان للخدمة الموزعة Dubbo+ZookeEper هو المحتوى الكامل المشترك من قبل المحرر. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.