คำนำ
เนื่องจากบริการก่อนหน้านี้ทั้งหมดอยู่ในอินทราเน็ตการกำหนดค่าคลัสเตอร์ Zookeeper จึงเป็น IP อินทราเน็ตทั้งหมดและเครือข่ายภายนอกไม่ได้เปิดพอร์ตที่เกี่ยวข้อง เมื่อเร็ว ๆ นี้เนื่องจากการอัพเกรดธุรกิจเราได้ซื้อบริการของ 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: Registry Check = "False" /> การร้องขอการลงทะเบียนและการสมัครสมาชิกล้มเหลวจะถูกบันทึกไว้และพื้นหลังจะหมดเวลาในการลองใหม่
•ข้อมูลการเข้าสู่ระบบของ Zookeeper สามารถตั้งค่าผ่าน <Dubbo: registry username = "admin" password = "1234" />
•โหนดรูทของ Zookeeper สามารถตั้งค่าผ่าน <Dubbo: Registry Group = "Dubbo" /> หากคุณไม่ได้ตั้งค่าคุณจะใช้ทรีไร้รูต
•สนับสนุนอักขระ * WildCard <Dubbo: Reference Group = "" เวอร์ชัน = "" /> เพื่อสมัครสมาชิกทุกกลุ่มและบริการทุกรุ่น
มาตรา 5 ของเอกสารเว็บไซต์อย่างเป็นทางการระบุอย่างชัดเจนว่าข้อมูลการเข้าสู่ระบบของ Zookeeper สามารถตั้งค่าผ่านฟิลด์ชื่อผู้ใช้และรหัสผ่าน
ต่อไปนี้เป็นพารามิเตอร์รีจิสทรีคำอธิบาย:
อย่างไรก็ตามหากคุณตั้งค่า ACL ผ่าน Digest บน Zookeeper จากนั้นกำหนดค่าผู้ใช้และรหัสผ่านที่เกี่ยวข้องใน Dubbo Registry บริการจะไม่ถูกลงทะเบียนใน Zookeeper และจะรายงานข้อผิดพลาดของ GoveerRorCode = NOAUTH
อย่างไรก็ตามเมื่อฉันตรวจสอบซอร์สโค้ดที่เกี่ยวข้องกับ ZookeeperRegistry ฉันไม่พบการรับรองความถูกต้องที่เกี่ยวข้อง ฉันไม่ค่อยถามคำถามที่คล้ายกันในเครือข่ายทั้งหมดและคำถามนี้ดูเหมือนจะไม่ได้รับความสนใจ
ACL ใน Zookeeper
ภาพรวม
ในระบบไฟล์แบบดั้งเดิม ACL จะถูกแบ่งออกเป็นสองมิติหนึ่งคือกลุ่มและอื่น ๆ คือการอนุญาต ไดเรกทอรีย่อย/ไฟล์สืบทอด ACLS ของไดเรกทอรีหลักโดยค่าเริ่มต้น ใน Zookeeper ACL ของ Node ไม่มีความสัมพันธ์ในการสืบทอดและถูกควบคุมอย่างอิสระ ACL ของ Zookeeper สามารถเข้าใจได้จากสามมิติ: หนึ่งคือโครงการ; ประการที่สองคือผู้ใช้ และข้อที่สามคือการอนุญาตซึ่งมักจะแสดงเป็น
โครงการ: ID: การอนุญาต
ต่อไปนี้ได้รับการแนะนำจากทั้งสามด้านนี้:
โครงการ: โครงการสอดคล้องกับโครงการที่ใช้ในการจัดการสิทธิ์ Zookeeper ใช้รูปแบบ ACL แบบเสียบได้ซึ่งสามารถขยายกลไก ACL ได้โดยการขยายรูปแบบ ZooKeeper-3.4.4 รองรับแผนการต่อไปนี้ตามค่าเริ่มต้น:
โลก: มีเพียง ID เดียวด้านล่างเรียกว่าใคร, โลก: ใครก็ตามที่เป็นตัวแทนของใครและโหนดใน Zookeeper ที่ได้รับอนุญาตให้ทุกคนเป็นของโลก: ทุกคน
Auth: ไม่จำเป็นต้องใช้ ID ตราบใดที่ผู้ใช้ผ่านการตรวจสอบสิทธิ์มีสิทธิ์ (Zookeeper รองรับการรับรองความถูกต้องผ่าน Kerberos และยังรองรับการรับรองความถูกต้องในรูปแบบของชื่อผู้ใช้/รหัสผ่าน)
Digest: ID ที่เกี่ยวข้องคือชื่อผู้ใช้: Base64 (SHA1 (รหัสผ่าน)) มันจำเป็นต้องผ่านการตรวจสอบสิทธิ์ในรูปแบบของชื่อผู้ใช้: รหัสผ่าน
IP: ID ที่เกี่ยวข้องคือที่อยู่ IP ของไคลเอนต์ เมื่อตั้งค่าคุณสามารถตั้งค่าเซ็กเมนต์ IP เช่น IP: 192.168.1.0/16 ซึ่งหมายความว่าเซ็กเมนต์ IP ตรงกับ 16 บิตแรก
Super: ในโครงการนี้ ID ที่เกี่ยวข้องมีสิทธิ์สูงสุดและสามารถทำอะไรก็ได้ (CDRWA)
การอนุญาต: ปัจจุบัน Zookeeper รองรับการอนุญาตต่อไปนี้:
สร้าง (c): สร้างสิทธิ์คุณสามารถสร้างโหนดลูกภายใต้โหนดปัจจุบัน
ลบ (d): ลบสิทธิ์คุณสามารถลบโหนดปัจจุบัน
อ่าน (r): การอนุญาตอ่านคุณสามารถรับข้อมูลของโหนดปัจจุบันคุณสามารถแสดงรายการโหนดลูกทั้งหมดในโหนดปัจจุบัน
เขียน (w): การอนุญาตเขียนคุณสามารถเขียนข้อมูลไปยังโหนดปัจจุบัน
ผู้ดูแลระบบ (a): สิทธิ์ของผู้ดูแลระบบคุณสามารถตั้งค่าการอนุญาตของโหนดปัจจุบัน
การจัดการลูกค้า
เราสามารถเชื่อมต่อกับไคลเอนต์ผ่านคำสั่งต่อไปนี้:
./zkcli.sh
ช่วย
[ZK: LocalHost: 2181 (เชื่อมต่อ) 2] Helpzookeeper -server โฮสต์: พอร์ต cmd args เชื่อมต่อโฮสต์: พอร์ตรับพา ธ [ดู] LS PATH [ดู] ตั้งค่าข้อมูลเส้นทาง [เวอร์ชัน] เส้นทาง RMR Delquota [-n | -b] เส้นทางที่ปิดเส้นทาง getacl path sync path redo cmdno addauth Scheme Auth Auth Delete Path [เวอร์ชัน] setquota -n | -b val path
การทำงานง่ายๆ
[ZK: LocalHost: 2181 (เชื่อมต่อ) 12] LS /[Dubbo, ทดสอบ, Zookeeper] [ZK: LocalHost: 2181 (เชื่อมต่อ) 13] สร้าง /ข้อมูล IP: 192.168.1.190: CDRWCREATED /ITSTYLE [ZK: LOCALHOST: 2181 /itsstyle'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; นำเข้า org.apache.zookeeper.data.stat; นำเข้า org.apache.zookeeper.server.auth.digestauthenticationprovider; คลาสสาธารณะ String String สุดท้ายส่วนตัว testNode = "/dubbo"; สตริงสุดท้ายคงที่ส่วนตัว readauth = "ผู้อ่าน: 123456"; สตริงสุดท้ายคงที่ส่วนตัว writeauth = "ผู้ใช้งานเขียน: 123456"; สตริงสุดท้ายคงที่ส่วนตัว deleteAuth = "DELETE-USER: 123456"; สตริงสุดท้ายคงที่ส่วนตัว allauth = "Super-user: 123456"; สตริงสุดท้ายคงที่ส่วนตัว adminauth = "ผู้ดูแลระบบ: 123456"; สตริงสุดท้ายแบบคงที่ส่วนตัว Digest = "Digest"; โมฆะแบบคงที่ส่วนตัวเริ่มต้น () พ่น nosuchalgorithmexception {zkclient zkclient = zkclient ใหม่ (zkaddress); System.out.println (DigestauthenticationProvider.generatedigest (allauth)); zkclient.addauthinfo (Digest, Allauth.getBytes ()); if (zkclient.exists (testNode)) {zkclient.delete (testNode); System.out.println ("Node ลบสำเร็จ!"); } รายการ <ACL> acls = new ArrayList <ACL> (); ACLS.Add (ใหม่ ACL (zoodefs.perms.l, ID ใหม่ (Digest, DigestauthenticationProvider.Generatedigest (allauth))))); ACLS.Add (ใหม่ ACL (zoodefs.perms.l, ID ใหม่ (Digest, DigestauthenticationProvider.Generatedigest (allauth))))); ACLS.ADD (ACL ใหม่ (zoodefs.perms.Read, ID ใหม่ (Digest, DigestauthenticationProvider.Generatedigest (readauth)))); ACLS.ADD (ACL ใหม่ (zoodefs.perms.write, ID ใหม่ (Digest, DigestauthenticationProvider.Generatedigest (writeauth)))))); ACLS.ADD (ACL ใหม่ (zoodefs.perms.delete, ID ใหม่ (Digest, DigestauthenticationProvider.Generatedigest (deleteAuth)))); ACLS.Add (ใหม่ ACL (zoodefs.perms.admin, ID ใหม่ (Digest, DigestauthenticationProvider.Generatedigest (adminauth)))); zkclient.createPersistent (testNode, testNode, ACLS); System.out.println (zkclient.readdata (testNode)); System.out.println ("โหนดถูกสร้างขึ้นสำเร็จ!"); zkclient.close (); } โมฆะคงที่ส่วนตัว readtest () {zkclient zkclient = zkclient ใหม่ (zkaddress); ลอง {system.out.println (zkclient.readdata (testNode)); // ไม่มีข้อมูลการตรวจสอบความถูกต้องข้อผิดพลาดจะเกิดขึ้นเมื่ออ่าน} catch (ข้อยกเว้น e) {system.err.println (e.getMessage ()); } ลอง {zkclient.addauthinfo (Digest, adminauth.getBytes ()); System.out.println (zkclient.readdata (testNode)); // การอนุญาตผู้ดูแลระบบไม่ตรงกับการอนุญาตการอ่านและการอ่านจะเกิดขึ้นเมื่ออ่าน} catch (Exception e) {system.err.println (e.getMessage ()); } ลอง {zkclient.addauthinfo (Digest, readauth.getBytes ()); System.out.println (zkclient.readdata (testNode)); // เฉพาะข้อมูลการตรวจสอบที่มีการอนุญาตอ่านสามารถอ่านได้ตามปกติ} catch (Exception e) {system.err.println (e.getMessage ()); } zkclient.close (); } โมฆะคงที่ส่วนตัว writetest () {zkclient zkclient = zkclient ใหม่ (zkaddress); ลอง {zkclient.writedata (testNode, "new-data"); // เขียนล้มเหลวโดยไม่มีข้อมูลการตรวจสอบ} catch (Exception e) {system.err.println (e.getMessage ()); } ลอง {zkclient.addauthinfo (Digest, writeauth.getBytes ()); zkclient.writedata (testNode, "new-data"); // เขียนตามปกติหลังจากเพิ่มข้อมูลการตรวจสอบ} catch (Exception e) {system.err.println (e.getMessage ()); } ลอง {zkclient.addauthinfo (Digest, readauth.getBytes ()); System.out.println (zkclient.readdata (testNode)); // อ่านการตรวจสอบค่าใหม่} catch (ข้อยกเว้น e) {system.err.println (e.getMessage ()); } zkclient.close (); } โมฆะคงที่ส่วนตัว deleTeTest () {zkClient zkClient = new ZkClient (ZkAddress); zkclient.addauthinfo (Digest, deleteauth.getBytes ()); ลอง {system.out.println (zkclient.readdata (testNode)); zkclient.delete (testNode); System.out.println ("Node ลบสำเร็จ!"); } catch (exception e) {system.err.println (e.getMessage ()); } zkclient.close (); } โมฆะคงที่ส่วนตัว changeaclTest () {zkClient zkClient = new ZkClient (ZkAddress); // หมายเหตุ: วิธี zkclient.setacl สามารถพบได้เพื่อดูซอร์สโค้ด วิธีการ ReadData และ SetAcl เรียกว่า // ดังนั้นในการแก้ไขแอตทริบิวต์ ACL ของโหนดคุณต้องมีทั้งการอ่านและผู้ดูแลระบบ: อ่านและผู้ดูแลระบบ zkclient.addauthinfo (Digest, adminauth.getBytes ()); zkclient.addauthinfo (Digest, readauth.getBytes ()); ลอง {list <Acl> acls = new ArrayList <ACL> (); acls.add (ใหม่ ACL (zoodefs.perms.l, ID ใหม่ (Digest, DigestauthenticationProvider.GeneratedIgest (Adminauth)))); zkclient.setAcl (testnode, acls); map.entry <acl>, stat> aclresult = zkclient.get System.out.println (aclresult.getKey ()); System.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -สรุป
บริการส่วนใหญ่จะถูกนำไปใช้กับอินทราเน็ตและไม่ค่อยเปิดให้กับเครือข่ายภายนอก อย่างไรก็ตามการรับรองความถูกต้องของผู้ใช้ Zookeeper ของ Dubbo ดูเหมือนจะไม่ทำงาน หากคุณต้องเปิดให้กับโลกภายนอกคุณสามารถใช้ iptables หรือไฟร์วอลล์เพื่อดำเนินการควบคุมการเข้าถึง IP เท่านั้น หากเป็นเซิร์ฟเวอร์ Alibaba Cloud กลุ่มความปลอดภัยก็เป็นตัวเลือกที่ดีเช่นกัน
ตัวอย่างข้างต้นของการตรวจสอบความปลอดภัยของบริการแบบกระจาย Dubbo+Zookeeper เป็นเนื้อหาทั้งหมดที่แชร์โดยโปรแกรมแก้ไข ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น