TP-Link Easy Smart Switch เป็นตระกูลของสวิตช์ที่มีการจัดการที่สามารถรองรับ QoS, VLANS และกลุ่มการรวมลิงก์ (LAGs) พวกเขาได้รับการจัดการผ่านอินเทอร์เฟซบนเว็บให้การเข้าถึงฟังก์ชั่นจำนวนมากรวมถึงเคาน์เตอร์แพ็คเก็ตพื้นฐานต่อพอร์ต น่าเสียดายที่สวิตช์เหล่านี้ไม่ได้ใช้ SNMP สำหรับการเข้าถึงเคาน์เตอร์เหล่านี้และดูเหมือนว่าจะไม่ใช้ URL ที่ไม่ต่อเนื่องสำหรับการเข้าถึงข้อมูลนี้โดยตรง โครงการนี้กล่าวถึงปัญหานี้เพื่อสร้างสถิติต่อพอร์ตจากการเรียกใช้บรรทัดคำสั่งเดียวพร้อมเอาต์พุตที่สามารถแยกวิเคราะห์ได้เล็กน้อยสำหรับเอาต์พุตที่จัดรูปแบบหรือป้อนลงในระบบการตรวจสอบเช่น Zabbix
โครงการนี้ได้รับการทดสอบกับ TP-Link Switch รุ่น TL-SG1016DE และ TL-SG108E ควรเข้ากันได้กับสมาชิกคนอื่น ๆ ในครอบครัวนี้รวมถึง TL-SG105E และ TL-SG1024DE
*** คำเตือน ***
Easy Smart Switch Family มีช่องโหว่ที่ไม่ได้รับการแก้ไขจำนวนมากรวมถึง CVE-2017-17746 ตามที่อธิบายไว้ใน https://seclists.org/fulldisclosure/2017/dec/67 เมื่อผู้ใช้จากที่อยู่ IP แหล่งที่มาที่กำหนดตรวจสอบสิทธิ์ไปยังอินเทอร์เฟซการจัดการบนเว็บของสวิตช์ผู้ใช้รายอื่นจากที่อยู่ IP แหล่งเดียวกันนั้นได้รับการรับรอง
สคริปต์ Python ในโครงการนี้ควรใช้เฉพาะจากโฮสต์ที่ไม่มีการเข้าถึงผู้ใช้ทั่วไป
essstat.py เป็นยูทิลิตี้ที่มีน้ำหนักเบาใช้เพื่อดึงสถิติพอร์ตจากสวิตช์และเอาต์พุตในรูปแบบที่สามารถแยกได้อย่างง่ายดาย รหัสเพิ่มเติมจะถูกเพิ่มลงในการแยกวิเคราะห์และเอาต์พุตหรือจัดเก็บสถิติเหล่านี้
แอปพลิเคชัน Python ที่มีน้ำหนักเบานี้ทำการล็อกอินอย่างรวดเร็วผ่านอินเทอร์เฟซการดูแลระบบบนเว็บของสวิตช์จากนั้นสอบถามหน่วยสำหรับสถิติพอร์ตปัจจุบัน ข้อมูลประจำตัวสำหรับการเข้าถึงหน่วยจะถูกส่งผ่านในบรรทัดคำสั่ง ยูทิลิตี้ถูกเข้ารหัสด้วย Python 3.6 และใช้ห้องสมุดซุปที่สวยงาม
essstat.py [-h] [-1] [-d] -p TPpswd [-s] [-u TPuser] TPhost
TPhost IP address or hostname of switch
-h, --help show this help message and exit
-1, --1line output in a single line
-d, --debug activate debugging output
-j, --json output in JSON format
-p TPpswd, --password TPpswd
password for switch access
-s, --statsonly output post statistics only
-u TPuser, --username TPuser
username for switch access
$ essstat.py myswitch -p ChangeMe
2020-03-28 11:25:15
max_port_num=8
1;Enabled;Link Down;0,0,0,0
2;Enabled;10M Full;3568644976,0,3144940915,0
3;Enabled;1000M Full;237232286,0,66662515,0
4;Enabled;1000M Full;4019260430,0,3721138807,0
5;Enabled;1000M Full;1300360968,0,355032522,0
6;Enabled;Link Down;0,0,0,0
7;Enabled;1000M Full;2903398648,0,4293632425,5
8;Enabled;Link Down;0,0,0,0
วิธีที่ง่ายที่สุดในการสะสมข้อมูลจากสวิตช์คือให้ Essstat.py ดำเนินการด้วยตัวเลือก --1line และต่อท้ายเอาต์พุตเข้ากับไฟล์ CSV จากนั้นคุณสามารถดึงสำเนาของไฟล์ CSV และประมวลผลข้อมูลดิบผ่านสมุดงาน Excel นี้เพื่อสร้างแผนภูมิแบบไดนามิกที่จะช่วยลดระดับข้อมูลที่มีอยู่โดยอัตโนมัติ
ขั้นตอนแรกคือการตั้งค่าไดเรกทอรีที่ไฟล์ CSV จะสะสมข้อมูล ฉันเลือกที่จะเรียกใช้ทั้งหมดนี้ภายใต้ผู้ใช้ Zabbix ที่รองรับแอปพลิเคชันการตรวจสอบบนโฮสต์นี้ คุณอาจเลือกผู้ใช้อื่น แต่เพียงตรวจสอบให้แน่ใจว่ากลุ่มของไดเรกทอรีตรงกับกลุ่มของผู้ใช้ที่คุณจะใช้
$ ls -ald /var/log/essstat
drwxrwxr-x. 2 root zabbix 68 Mar 30 10:56 /var/log/essstat
ถัดไปสร้างงาน cron สำหรับการรวบรวมข้อมูลเป็นระยะ ในการทำเช่นนี้ให้สร้างไฟล์ /etc/cron.d/essstat และเพิ่มหนึ่งกำหนดการสำหรับแต่ละสวิตช์ที่คุณจะตรวจสอบ เพื่อให้การบำรุงรักษาตัวเองอย่างสมเหตุสมผลรวมถึงปีปัจจุบันซึ่งเป็นส่วนหนึ่งของข้อกำหนดไฟล์ CSV
*/10 * * * * zabbix /usr/local/bin/essstat.py -1 -p ChangeMe1 orange >> /var/log/essstat/essstat-orange-`date +%G`.csv
*/10 * * * * zabbix /usr/local/bin/essstat.py -1 -p ChangeMe2 black >> /var/log/essstat/essstat-black-`date +%G`.csv
ในตัวอย่างข้างต้นมีสวิตช์สองสวิตช์ที่ถูกตรวจสอบชื่อ orange และ black สำหรับแต่ละสวิตช์การรวบรวมข้อมูลจะทำงานทุก ๆ 10 นาทีเริ่มต้นในแต่ละชั่วโมง ข้อมูลสำหรับ orange จะถูกสะสมในไฟล์ /var/log/essstat/essstat-orange-2020.csv ในช่วงปีปฏิทินปี 2020
สมุดงาน Excel ที่เปิดใช้งานมาโครนี้น่าจะเป็นวิธีที่ดีที่สุดในการอ่านและจัดทำแผนภูมิสถิติพอร์ต สมุดงานจะสร้างแบบสอบถามโดยอัตโนมัติและดำเนินการเว็บรับการดำเนินการกับเซิร์ฟเวอร์การตรวจสอบโดยใช้สคริปต์ essstat2.cgi ในการกำหนดค่าเวิร์กบุ๊กสำหรับการติดตั้งในพื้นที่ของคุณชื่อ essstatBaseURL ที่กำหนดไว้จะต้องได้รับการแก้ไขเพื่อชี้ไปที่เว็บเซิร์ฟเวอร์ที่ทำงานบนโฮสต์การตรวจสอบของคุณและชื่อของสคริปต์ CGI ในการทำการอัปเดตนี้ใน Excel 2019 บน Windows ให้คลิกแท็บ Excel Formulas จากนั้นคลิกปุ่ม Name Manager บนริบบิ้น คลิกที่รายการสำหรับ essstatBaseURL และแก้ไขรายการให้เหมาะสม ตรวจสอบให้แน่ใจว่าได้คลิกปุ่มด้วยเครื่องหมายถูกสีเขียวเพื่อบันทึกการปรับเปลี่ยนปิดกล่องโต้ตอบและบันทึกสมุดงานที่อัปเดต สิ่งนี้จะต้องทำเพียงครั้งเดียว
เมื่อใช้เวิร์กบุ๊กชื่อของสวิตช์และการรายงานจากและจนถึงวันที่/เวลาจะถูกระบุในตารางพารามิเตอร์ที่ด้านบนซ้ายของแท็บ webData คลิก Update From Web เพื่อดึงข้อมูลลงในตารางและอัปเดตพล็อตบนแท็บ แผนภูมิ PPS แบบไดนามิก หากสวิตช์ภายใต้การศึกษามีเพียงแปดพอร์ตพอร์ตพิเศษจะถูกซ่อนไว้โดยอัตโนมัติ
ชื่อของสวิตช์และตัวชี้วัดที่พล็อตปรากฏในชื่อของแผนภูมิ เมื่อมีการโหลดตัวชี้วัดลงในตารางตัวชี้วัดที่แตกต่างกันอาจถูกโหลดลงในแผนภูมิโดยเลือกจากตัวเลือกในเซลล์ดรอปดาวน์ถัดจาก label. Moving between theses metrics for the same switch does *not* require doing another 'แผนภูมิเมตริก label. Moving between theses metrics for the same switch does *not* require doing another จากการดำเนินการเว็บ
ตารางบนแท็บ * localportnames ช่วยให้คุณสามารถแทนที่ชื่อพอร์ตเริ่มต้นที่แสดงในแผนภูมิ ตารางนี้เป็นตัวเลือกทั้งหมดและการกำหนดรายการสำหรับพอร์ตทั้งหมดในสวิตช์ที่กำหนด ไม่ จำเป็นต้องใช้ (เป็นสิ่งที่ดีในการกำหนดชื่อพอร์ตแทนที่พอร์ตเพียงคู่สำหรับสวิตช์ที่กำหนด) หากคุณมีสวิตช์หลายตัวคุณสามารถเพิ่มรายการสำหรับทั้งหมดในตารางเดียว
ต้นแบบเวิร์กบุ๊ก Excel นี้สามารถใช้ในการประมวลผลสำเนาของเอาต์พุตข้อมูลดิบ --1line จาก essstat.py ที่สะสมในไฟล์ CSV เริ่มต้นด้วยการคัดลอกไฟล์ไปยังชื่อใหม่โดยรวมชื่อของสวิตช์ที่ถูกตรวจสอบ นี่จะเป็นสมุดบันทึกการตรวจสอบสวิตช์ ตัวอย่างเช่น:
C:usermeDocuments> copy essstat-TPLhost.xlsx essstat-orange.xlsx
ถัดไปดาวน์โหลดสำเนาของข้อมูล CSV ที่สะสมไว้ในโฮสต์การตรวจสอบของคุณและเปิดใน Excel รวมถึงสมุดงานการตรวจสอบสวิตช์ ในขั้นตอนนี้คุณจะต้องคัดลอกข้อมูลจาก CSV ไปยังแท็บ RawData ของโน้ตบุ๊กการตรวจสอบสวิตช์ ตามค่า ในการทำเช่นนี้ให้ไปที่ไฟล์ CSV ใน Excel และเลือกเซลล์ซ้ายบน A1 ใน Windows คุณสามารถใช้ลำดับคีย์ Ctrl-Shift-End เพื่อเลือกข้อมูลทั้งหมดจากนั้นกด Ctrl-Insert เพื่อคัดลอกทั้งหมด จากนั้นไปที่สมุดงาน Switch Monitoring และเลือกเซลล์ข้อมูลตัวแรกในแท็บ RawData ที่ A2 (เซลล์ซ้ายบนใต้ส่วนหัว) คลิกขวาและเลือกตัวเลือกในการวางค่า ด้วยข้อมูลดิบในสถานที่คุณควรเลื่อนลงเพื่อจดบันทึกแถวสุดท้าย ตอนนี้ไฟล์ CSV ดั้งเดิมสามารถปิดได้
คลิกที่แท็บ ตาราง PPS เพื่อขยายตารางการวิเคราะห์และเลือกตัวชี้วัดที่จะจัดทำแผนภูมิ กุญแจสำคัญคือการขยายช่วงตารางที่มีโครงสร้างเพื่อให้ตรงกับ rawdata ที่มีอยู่ กด Ctrl-End เพื่อค้นหาจุดสิ้นสุดของตาราง เมาส์เหนือสี่เหลี่ยมเล็ก ๆ ที่มุมซ้ายล่างของเซลล์จนกว่าตัวชี้เมาส์ของคุณจะเปลี่ยนเป็น crosshair คลิกและลากลงไปยังหมายเลขแถวเดียวกันกับหมายเลขแถวที่มีประชากรล่าสุดในแท็บ RawData สูตรและช่วงทั้งหมดใน ตาราง PPS และ แผนภูมิ PPS จะขยายโดยอัตโนมัติ
มีตัวชี้วัดสี่ตัวที่ถูกติดตามสำหรับแต่ละพอร์ต: TX Good Packets, TX Bad Packets, RX Good PKTS และ RX BAD PKTS แบบเลื่อนลงที่เซลล์ B2 บนแท็บ Table PPS ใช้เพื่อเลือกตัวชี้วัดที่ควรเติมในตารางและแผนภูมิ
สคริปต์ CGI นี้ใช้ในการสืบค้นข้อมูล CSV ที่สะสมอยู่ในโฮสต์การตรวจสอบของคุณและส่งคืนรายการที่ตรงกัน CGI นั้นมีอยู่ในตัวเองอาศัยการเข้าถึง AWK เพื่อดำเนินการสคริปต์แบบอินไลน์ที่เรียบง่ายเท่านั้น มีสามตัวแปรที่รวมอยู่ใน CGI:
โปรดทราบว่าข้อมูลจำเพาะวันที่/เวลาบางส่วนได้รับอนุญาตเนื่องจากรายการที่ตรงกันจะถูกกำหนดโดยการเปรียบเทียบสตริงง่าย ๆ วันที่จากและไปยังวันที่ได้รับอนุญาตให้ครอบคลุมข้ามเขตแดนหนึ่งปี (เช่นจาก 2019 ถึง 2020)
หากต้องการสอบถามเซิร์ฟเวอร์การตรวจสอบสำหรับสถิติพอร์ตสำหรับสวิตช์ที่รู้จักกันในชื่อ Orange ในช่วงเวลาตั้งแต่ 2/23/2020 00:00 ถึง 3/7/2020 11:30 URI จะมีลักษณะ:
http://monitoring.mydomain.com/cgi-bin/essstat.cgi?esTPLhost=orange&esTo=2020-03-07%2011:30&esFrom=2020-02-23
สคริปต์ CGI นี้ได้รับการออกแบบมาเพื่อรองรับการทำงานของสมุดงาน essstat.xlsm Excel สคริปต์รองรับพารามิเตอร์การสืบค้นเดียวกันกับ essstat.cgi และส่งคืนข้อมูลสำหรับตัวชี้วัดเดียวกัน อย่างไรก็ตามแทนที่จะส่งคืนแพ็คเก็ตดิบนับในแต่ละระเบียน essstat2.cgi จะส่งคืนแพ็คเก็ตเฉลี่ยต่ออัตราที่สองนับตั้งแต่บันทึกก่อนหน้านี้ สคริปต์จะคำนวณเวลาเดลต้าจริงระหว่างบันทึกปัจจุบันและก่อนหน้านี้เพื่อให้แน่ใจว่าอัตรานั้นถูกต้อง สคริปต์ยังมีการจัดการสำหรับเคาน์เตอร์แต่ละตัวรีเซ็ตเป็นศูนย์เนื่องจากพวกเขาห่อขนาดจำนวนเต็มสูงสุดสำหรับตัวนับ ในกรณีเช่นนี้แพ็คเก็ตต่ออัตราที่สองจากช่วงเวลาก่อนหน้าจะถูกส่งคืนสำหรับสถิติที่ได้รับผลกระทบ
TP-Link Easy Smart Switch มีความสามารถมากกว่าสวิตช์ที่ไม่มีการจัดการอย่างสมบูรณ์ อย่างไรก็ตามสภาพแวดล้อมการจัดการค่อนข้างปิดโดยมีเพียงไคลเอนต์การจัดการที่เป็นกรรมสิทธิ์ (ยูทิลิตี้การกำหนดค่าสมาร์ทง่าย) หรือหน้าการจัดการบนเว็บบนสวิตช์ที่มีอยู่ นอกจากนี้ยังไม่มีการสนับสนุนสำหรับการตรวจสอบสวิตช์ด้วย SNMP ซึ่งหมายความว่ารายการเดียวของเราในสวิตช์จะผ่านโปรโตคอลที่ใช้โดยไคลเอนต์ที่เป็นกรรมสิทธิ์หรือโดยการทำให้อินเทอร์เฟซการจัดการบนเว็บบนสวิตช์
ขั้นแรกให้พื้นหลังเล็กน้อยบน UDP-Base Easy Smart Configuration Protocol (ESCP) ที่โครงการนี้ ไม่ได้ ใช้ ยูทิลิตี้การกำหนดค่าสมาร์ทง่าย ๆ โต้ตอบกับสวิตช์ผ่าน UDP พร้อมการออกอากาศ ไคลเอนต์จะส่งการออกอากาศ UDP จากพอร์ต 29809 ถึง 29808 ของแพ็คเก็ตการค้นพบที่เข้ารหัสเป็นพิเศษ สวิตช์ที่เข้ากันได้บนเครือข่ายจะออกอากาศการตอบสนองจากพอร์ต 29808 ถึง 29809 กว่ารวมชื่อรุ่นและที่อยู่ IP ของสวิตช์ จากจุดนี้มันขึ้นอยู่กับไคลเอนต์ที่จะเข้ารหัสลำดับการเข้าสู่ระบบและออกอากาศสิ่งนี้บนเครือข่ายโดยคาดหวังว่าสวิตช์เป้าหมายเฉพาะจะได้รับและประมวลผลคำสั่ง นี่อาจเป็นการส่งข้อมูลกลับในแพ็กเก็ตออกอากาศอื่นแก้ไขการกำหนดค่าของสวิตช์หรือดำเนินการอื่น ๆ
การออกแบบและการใช้งานนี้มีปัญหาหลายประการที่ควรทำให้เกิดความกังวลบางอย่างซึ่งได้รับการเน้นโดยนักวิจัยด้านความปลอดภัย (@ChrisDCMoore ในการเปิดเผยข้อมูลช่องโหว่ในการเปิดเผยข้อมูลใน TP-Link Easy Smart Switch และ @CHMOD7850 ในการเปิดเผยช่องโหว่ TP-Link ทวีคูณ CVES) ในขณะที่การแฮ็คเข้าไปใน ESCP นั้นง่ายพอฉันไม่ชอบความคิดของการออกอากาศอย่างแท้จริงทั่วทั้งเครือข่ายเป็นประจำเพื่อคว้าสถิติ
Apprach ว่าโครงการนี้ใช้ไคลเอนต์บนเว็บเป็นปัญหาเช่นกัน การใช้การเชื่อมต่อ UNICAST TCP นั้นดีกว่า แต่ SSL ไม่ได้ใช้งานโดยสวิตช์ แม้ว่าจะเป็นไปได้ที่จะกำหนดค่าสวิตช์เพื่อใช้ชื่อผู้ใช้ผู้ดูแลระบบที่แตกต่างกัน แต่มีชื่อผู้ใช้เพียงหนึ่งชื่อสำหรับการเข้าถึงสวิตช์ สิ่งนี้ขัดขวางการใช้การเข้าถึงตามบทบาทด้วยชื่อผู้ใช้เฉพาะสำหรับการอ่านสถิติเท่านั้น ข้อมูลรับรองที่เราใช้ในการคว้าสถิติสามารถใช้ในการเข้าถึงอินเทอร์เฟซการจัดการที่อนุญาตให้รีเซ็ตเคาน์เตอร์กำหนดค่าสวิตช์ใหม่หรือเปลี่ยนเฟิร์มแวร์ใหม่
ยิ่งไปกว่านั้นคือช่องโหว่ที่รายงานใน CVE-2017-17746 ตามที่อธิบายไว้ใน https://seclists.org/fulldisclosure/2017/dec/67 เมื่อผู้ใช้จากที่อยู่ IP แหล่งที่มาที่กำหนดตรวจสอบสิทธิ์ไปยังอินเทอร์เฟซการจัดการบนเว็บของสวิตช์ผู้ใช้รายอื่นจากที่อยู่ IP แหล่งเดียวกันนั้นได้รับการรับรอง เงื่อนไขนี้ถูกสร้างขึ้นโดยการดำเนินการของสคริปต์ Python ในโครงการนี้ซึ่งผู้ใช้รายอื่นลงชื่อเข้าใช้หรือการขุดผ่านโฮสต์เดียวกันนั้นจะมีการเข้าถึงอินเทอร์เฟซการจัดการของสวิตช์ ปัญหานี้สามารถบรรเทาได้โดยเรียกใช้สคริปต์จากโฮสต์การจัดการเฉพาะ การใช้ LAN การจัดการนอกวงโดยเฉพาะสามารถให้การป้องกันได้เช่นกัน แต่สวิตช์เหล่านี้ไม่น่าจะใช้ในสภาพแวดล้อมที่มีโครงสร้างอย่างประณีต
Peter Smode
psmode [at] kitsnet.us