ตัวกรอง Fail2ban สำหรับ OpenVPN Access Server: real_ip และ jail
Access Server เขียนรูปแบบบันทึกของตัวเอง ตัวกรองสำเร็จรูปจึงหาอะไรไม่พบ ยึดกับ real_ip แยก jail ตามพื้นผิว และตรวจสอบว่าที่อยู่ไม่ใช่พร็อกซี
คุณคัดลอก OpenVPN jail จากโพสต์ในคอมมิวนิตี้ รีสตาร์ต fail2ban แล้ว แต่ไม่มีที่อยู่ใดถูกแบนเลย สาเหตุเกือบทุกครั้งคือรูปแบบบันทึก: Access Server ไม่ได้เขียนบรรทัดความล้มเหลวในการยืนยันตัวตนที่ตัวกรองสำเร็จรูปคาดหวัง ก่อนจะแตะตัวกรอง ให้ยืนยันก่อนว่าเรกคอร์ดมีอยู่จริง เพราะแพตเทิร์นไม่สามารถจับสิ่งที่บริการไม่เคยบันทึกได้
นี่คือรันบุ๊กที่ฉันใช้บนโฮสต์ Access Server: ยืนยันรูปร่างของเรกคอร์ด เขียนนิพจน์ที่ยึดจุดเดียว ทดสอบกับบันทึกจริง จากนั้นแยก jail ตามพื้นผิวที่ถูกโจมตี และตรวจสอบว่าการแบนไปถึงไฟร์วอลล์
ยืนยันว่าเรกคอร์ดความล้มเหลวมีอยู่
Access Server เขียนบรรทัดที่มีโครงสร้างของตัวเองลงใน/var/log/openvpnas.log และที่อยู่ของไคลเอนต์อยู่ในฟิลด์real_ipที่อยู่ในเครื่องหมายคำพูด ไม่ใช่ที่จุดเริ่มต้นของบรรทัด syslog ก่อนเขียนแพตเทิร์นใด ๆ ให้ค้นหาการล็อกอินที่ล้มเหลวซึ่งคุณรู้ว่าเกิดขึ้น:
grep -i 'LOG ERR' /var/log/openvpnas.log | tail -20ถ้าไม่มีอะไรปรากฏ ระดับบันทึกคือผู้ต้องสงสัยรายถัดไป Access Server มีสวิตช์ดีบักฐานข้อมูลบันทึกใน/usr/local/openvpn_as/etc/as.conf (DEBUG_LOGDB=1) และ ต้องรีสตาร์ตบริการหลังจากเปลี่ยนค่านั้น มองสวิตช์นั้นเป็นการตั้งค่าการวินิจฉัยที่ต้องลดกลับลงเมื่อได้แพตเทิร์นแล้ว ไม่ใช่การกำหนดค่าถาวร
ขณะอยู่ในไฟล์ ให้สังเกตว่าพื้นผิวใดเขียนลงไป ความล้มเหลวของพอร์ทัลไคลเอนต์ อินเทอร์เฟซผู้ดูแล และการยืนยันตัวตนของทันเนลลงเอยในไฟล์เดียวกันด้วยเครื่องหมายต่างกัน และรายละเอียดนั้นเป็นตัวกำหนดโครง jail ในภายหลัง
ยึดตัวกรองหนึ่งตัวกับ real_ip
ทำให้นิพจน์แคบไว้ ตัวกรองที่อ้างสิทธิ์ทุกบรรทัดที่มีที่อยู่ IP จะแบนผู้คนจากการตัดการเชื่อมต่อปกติ และบนเซิร์ฟเวอร์ที่ยุ่ง จะมีอาการเดียวคือผู้ใช้บ่นว่าถูกล็อกเพราะปิดแล็ปท็อป อ้างสิทธิ์เรกคอร์ดข้อผิดพลาดและจับที่อยู่ในเครื่องหมายคำพูด:
# /etc/fail2ban/filter.d/openvpnaccess.local
[Definition]
failregex = ^ .*LOG ERR.*"real_ip": "<HOST>".*
ignoreregex =ช่องว่างนำหน้าไม่ใช่เรื่องตกแต่ง Access Server ย่อหน้าเรกคอร์ดของตัวเอง และการยึดกับมันป้องกันไม่ให้แพตเทิร์นอ้างสิทธิ์บรรทัดที่บริการอื่นที่ไม่เกี่ยวข้องเขียนลงไฟล์เดียวกันด้วย ถ้าเรกคอร์ดของคุณมีตราเวลานำหน้าแทน ให้จับคู่คำนำหน้านั้น แต่ยึดกับสิ่งที่ปรากฏจริงในทุกเรกคอร์ดที่คุณตั้งใจจะอ้างสิทธิ์
เมื่อต้องการความแม่นยำตามพื้นผิว ให้แคบลงอีกโดยกำหนดให้มีเครื่องหมายพื้นผิว (WEB_CLIENT, WEB_ADMIN หรือ VPN) ในบรรทัดเดียวกัน ตัวกรองเดียวที่มีสามแพตเทิร์นตรวจสอบได้ง่ายกว่าสามตัวกรองที่ต่างกันเพียงคำเดียว
ทดสอบนิพจน์ก่อนเปิดใช้ jail
อย่าเปิดใช้ตัวกรองที่คุณยังไม่ได้รันกับบันทึกโปรดักชัน การทดสอบที่บันทึกไว้จะส่งตัวกรองผ่านสองครั้ง ครั้งหนึ่งเพื่อโหลดและอีกครั้งเพื่อใช้งาน และรายงานบรรทัดที่พลาดคือส่วนที่คุ้มค่าอ่าน:
fail2ban-regex --print-all-missed /var/log/openvpnas.log \
/etc/fail2ban/filter.d/openvpnaccess.local \
/etc/fail2ban/filter.d/openvpnaccess.local > missed.txtเปรียบเทียบจำนวนที่ตรงกับความล้มเหลวที่คุณยืนยันในขั้นแรก ศูนย์ที่ตรงหมายถึงแพตเทิร์นผิด การตรงบนบรรทัดที่ไม่ใช่ความล้มเหลวในการยืนยันตัวตนหมายถึงมันกว้างเกินไป อ่านmissed.txtจนกว่าคุณจะอธิบายทุกบรรทัดที่คุณเลือกจะไม่อ้างสิทธิ์ได้
ทำการทดสอบนี้บนสำเนาหากบันทึกมีขนาดใหญ่ และรันซ้ำหลังการอัปเกรด Access Server ทุกครั้ง รูปแบบบันทึกคืออินเทอร์เฟซที่คุณจับคู่ด้วย และมันไม่ใช่ API ที่เสถียร
แยก jail ตามพื้นผิว ไม่ใช่ตามดีมอน
Access Server หนึ่งตัวนำเสนอพื้นผิวการยืนยันตัวตนหลายแบบ: อินเทอร์เฟซเว็บของไคลเอนต์และผู้ดูแลบน 943/tcp และทันเนลบน 1194/udp หรือ 443/tcp ในการติดตั้งส่วนใหญ่ jail เดียวที่ครอบทั้งหมดเปิดทางให้การเดาบนทันเนลแบนที่อยู่ซึ่งเป็นเส้นทางผู้ดูแลของคุณด้วย และซ่อนว่าพื้นผิวใดกำลังถูกโจมตีจริง ให้แต่ละพื้นผิวมี jail ของตัวเองพร้อมพอร์ตและเกณฑ์ของตัวเอง:
# /etc/fail2ban/jail.d/openvpnaccess.local
[openvpnas-web-client]
enabled = true
port = 943
protocol = tcp
filter = openvpnaccess
logpath = /var/log/openvpnas.log
maxretry = 3
findtime = 10m
bantime = 1h
[openvpnas-tunnel]
enabled = true
port = 443
protocol = udp
filter = openvpnaccess
logpath = /var/log/openvpnas.log
maxretry = 5
findtime = 10m
bantime = 1hเริ่มด้วยตัวนับเล็ก ๆ และการแบนสั้น ๆ แล้วเพิ่มเมื่อเฝ้าดูทราฟฟิกจริงหนึ่งสัปดาห์ เกณฑ์ที่ผ่อนปรนบนที่อยู่สำนักงานที่ใช้ร่วมกันจะลงโทษผู้ใช้ทุกคนที่อยู่หลัง NAT เดียว และการแบนที่ดุเดือดบนพื้นผิวทันเนลจะตัดการเชื่อมต่อไคลเอนต์ที่ถูกต้องซึ่งข้อมูลรับรองที่เก็บไว้หมดอายุข้ามคืน
ตรวจสอบการแบน แบ็กเอนด์ และผลข้างเคียง
หลังรีสตาร์ต เอาต์พุตสถานะคือการยืนยันเร็วที่สุดว่า jail มีอยู่และกำลังนับ:
fail2ban-client status
fail2ban-client status openvpnas-tunnelจากนั้นยืนยันว่าการแบนไปถึงไฟร์วอลล์ที่คุณใช้งานจริง เพราะ jail ที่กำหนดค่าสำหรับแบ็กเอนด์ที่ไม่มีใครบังคับใช้ไม่ได้ป้องกันอะไรเลย ด้วยแอ็กชัน iptables ที่อยู่จะปรากฏในเชนที่ตั้งชื่อตาม jail (f2b-openvpnas-tunnel) ด้วยแอ็กชัน nftables พวกมันจะตกลงในเซตในตารางของ fail2ban เอง ตรวจสอบอันที่โฮสต์ของคุณใช้แทนการสันนิษฐาน
การตรวจสอบข้างเคียงสองอย่างสำคัญกว่าการแบนเอง อย่างแรก ตรวจสอบว่าreal_ipเป็นที่อยู่ของไคลเอนต์ ไม่ใช่ตัวกระจายโหลดหรือพร็อกซีย้อนกลับ หลังพร็อกซี การแบนทุกครั้งจะตกที่พร็อกซีและลากบริการทั้งหมดลงไปด้วย อย่างที่สอง จดขั้นตอนการปลดแบนไว้ เพราะที่อยู่ที่ข้ามเกณฑ์ตอน 02:00 มักเป็นของวิศวกรที่เข้าเวร: fail2ban-client set openvpnas-tunnel unbanip 203.0.113.24
จำขอบเขตไว้ขณะปรับแต่ง Fail2ban เป็นตัวจำกัดอัตราบนพื้นผิวการยืนยันตัวตนหนึ่ง ไม่ใช่ชั้นควบคุมการเข้าถึง มันไม่แทนที่ MFA ข้อจำกัดต่อบัญชี หรือการเก็บอินเทอร์เฟซผู้ดูแลไว้นอกอินเทอร์เน็ตสาธารณะ และ Access Server มีการตั้งค่า autoban ของตัวเองที่ควรตรวจสอบก่อนจะวางตัวจำกัดอัตราสองตัวบนพอร์ตเดียวกัน