วิธีการรักษาความปลอดภัยเซิร์ฟเวอร์อูบุนตูจากการโจมตีของ bruteforce ssh?


21

ฉันมีรหัสผ่านที่ปลอดภัย แต่ฉันได้ยินคนบ่นเกี่ยวกับความสมบูรณ์ของเซิร์ฟเวอร์ที่จะล้มลงอย่างมากเมื่อเกิดการโจมตีแบบ bruteforce ฉันจะรักษาความปลอดภัยเซิร์ฟเวอร์อูบุนตู 10.10 ของฉันจากการโจมตีดังกล่าวได้อย่างไร? มีโปรไฟล์ apparmor สำหรับสิ่งนี้หรือไม่? หรือวิธีอื่นในการแก้ไขปัญหาเหรอ?

คำตอบ:


19

มีวิธีแก้ไขปัญหาต่าง ๆ สิ่งที่ดีที่สุดคือการใช้การตรวจสอบความถูกต้องของ RSA ที่ใช้คีย์สาธารณะ / ส่วนตัวในการตรวจสอบผู้ใช้

ตรวจสอบคู่มือที่ยอดเยี่ยมนี้สำหรับแนวทางที่แตกต่าง (รวมถึงการตรวจสอบความถูกต้องของ RSA): http://www.la-samhna.de/library/brutessh.html

ฉันใช้โซลูชันที่ 3บนเซิร์ฟเวอร์ของฉันเพราะฉันไม่ต้องการทำให้มันซับซ้อนสำหรับผู้ใช้ที่ไม่ใช่ด้านเทคนิค: การใช้iptablesเพื่อ จำกัด จำนวนการเชื่อมต่อต่อนาทีที่ทำให้การโจมตีแบบ bruteforce ไม่มีประสิทธิภาพและไม่มีประสิทธิภาพ

นี่คือทางออกที่ฉันใช้:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

ดังที่กล่าวไว้ที่นี่ : จะอนุญาตให้มีการเชื่อมต่อสามพอร์ต 22 จากที่อยู่ IP ที่กำหนดภายในระยะเวลา 60 วินาทีและต้องใช้ 60 วินาทีในการพยายามเชื่อมต่อครั้งต่อไปก่อนที่จะกลับมาเปิดใช้งานการเชื่อมต่ออีกครั้ง ตัวเลือก --rttl ยังคำนึงถึง TTL ของดาตาแกรมเมื่อจับคู่แพ็กเก็ตเพื่อพยายามบรรเทากับที่อยู่ปลอมที่มา

ตามที่ระบุไว้ในคำแนะนำที่กล่าวถึงจะเป็นการดีกว่าถ้าจะใช้บัญชีขาวเพื่อแยกผู้ใช้ที่เชื่อถือได้ออกจากกฎเหล่านี้:

iptables -N SSH_WHITELIST

จากนั้นเพิ่มโฮสต์ที่เชื่อถือได้:

iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT

และหลังจากนั้นทำให้กฎ:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

เกี่ยวกับการรับรองความถูกต้องของรหัสผ่าน turnign ฉันจะเข้าสู่เซิร์ฟเวอร์ได้อย่างไรถ้าฉันทำรหัสสาธารณะเสีย? (ผมไม่ได้มีการเข้าถึง phisical ไปยังเซิร์ฟเวอร์มันเป็น VPS ก)
Dziamid

รหัสสาธารณะสามารถเผยแพร่ได้ทุกที่ที่คุณต้องการไม่ต้องกังวลกับเรื่องนั้นคุณสามารถใส่รหัสที่คุณมั่นใจได้ว่าคุณจะไม่ลืมแม้กระทั่งสถานที่สาธารณะ
Pedram

อ่านเพิ่มเติมได้ที่นี่: en.wikipedia.org/wiki/Public-key_cryptography
Pedram

มีวิธีการตั้งค่าเซิร์ฟเวอร์เพื่อเปิดเผยกุญแจสาธารณะเมื่อถูกถามหรือไม่?
Dziamid

1
ใช้ ssh ฉันไม่คิดอย่างนั้นถ้าคุณติดตั้งเว็บเซิร์ฟเวอร์เช่น apache คุณสามารถแชร์คีย์โดยใช้เว็บ
Pedram

8

ฉันได้รับการโจมตีแบบ SSH แบบดุเดือดบนเซิร์ฟเวอร์ของฉันด้วยอัตรา 1 ถึง 2 ต่อวัน ฉันได้ติดตั้งdenyhosts (แพ็คเกจ Ubuntu: denyhosts) มันเป็นเครื่องมือที่เรียบง่าย แต่มีประสิทธิภาพสำหรับจุดประสงค์นั้นโดยหลักแล้วมันจะทำการสแกนบันทึกของคุณเป็นระยะเพื่อตรวจจับการโจมตีที่ดุร้ายและวาง IP จากที่การโจมตีเหล่านี้มาจากไฟล์ /etc/hosts.deny ของคุณ คุณจะไม่ได้ยินจากพวกเขาอีกและควรลดโหลดของคุณลงอย่างมาก สามารถกำหนดค่าได้อย่างมากผ่านไฟล์ปรับแต่ง /etc/denyhosts.conf เพื่อปรับแต่งปัญหาต่างๆเช่นความพยายามที่ผิดหลายครั้งรวมการโจมตี ฯลฯ

เนื่องจากการทำงานที่โปร่งใสคุณสามารถเห็นสิ่งที่เกิดขึ้นได้อย่างง่ายดาย (การแจ้งเตือนทางอีเมล: 'aha การโจมตีที่น่ารังเกียจอีกครั้งที่ขัดขวาง!') และยกเลิกข้อผิดพลาดเนื่องจากผู้ใช้ของคุณพิมพ์รหัสผ่านซ้ำ ๆ

แน่นอนว่าทุกอย่างที่กล่าวมาก่อนหน้านี้เกี่ยวกับการสลับไปใช้วิธีการตรวจสอบสิทธิ์อื่น ๆ มีอยู่บ้าง แต่บางครั้งความต้องการของคุณก็ไม่เห็นด้วยกับผู้ใช้ของคุณ

นอกจากนี้การ จำกัด อัตราการเชื่อมต่อใหม่ใน iptables อาจเป็นทางเลือกที่ดีกว่าจากนั้นปฏิเสธการเข้าถึงผ่าน hosts.deny ดังนั้นดูที่ fail2ban ด้วย แต่ถ้าคุณรู้ว่า ssh brute-force เป็นปัญหาหลักของคุณ (ดูที่ /var/log/auth.log ด้วยตนเองเพื่อหาข้อนี้) ไปกับเครื่องมือที่ง่ายและผลกระทบต่ำ


1
/var/log/auth.log ของฉันมีการเติบโตอย่างมากเมื่อเร็ว ๆ นี้ รายการเช่นนี้Mar 27 10:28:43 smartfood sshd[17017]: Failed password for root from 218.15.136.38 port 33119 ssh2 Mar 27 10:28:47 smartfood sshd[17019]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.15.136.38 user=rootบ่งบอกถึงการโจมตีหรือไม่?
Dziamid

1
นี่หมายความว่ามีบางคนใน IP 218.15.136.38 ที่พยายามลงชื่อเข้าใช้ด้วยการรูท น่าจะเป็นคุณ แต่น่าจะไม่ใช่เพราะใช้tools.whois.net/whoisbyipฉันเห็นว่า IP นี้ลงทะเบียนในประเทศจีนซึ่งค่อนข้างเป็นวิธีจากมินสค์ ;-) ดังนั้นใช่ดูเหมือนว่าจะเดารหัสผ่านของคุณ . คุณธรรม: ปิดการใช้งานการเข้าสู่ระบบรากผ่าน ssh (PermitRootLogin ไม่มีใน / etc / ssh / sshd_config) เพราะไม่มีเหตุผลที่ดีที่จะปล่อยไว้ และพิจารณา denyhosts หรือ fail2ban นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณมีไฟร์วอลล์ที่จะให้การเข้าถึงที่จำเป็นเท่านั้นผ่านทางพอร์ต 22 และทุกอย่างที่คุณต้องการ (แต่ไม่มาก)
DrSAR

6
  1. เปลี่ยนพอร์ต sshd เป็นสิ่งที่ไม่เป็นมาตรฐาน
  2. ใช้knockdเพื่อสร้างระบบการเคาะพอร์ต
  3. ใช้ iptables recentและการhashlimitจับคู่เพื่อ จำกัด ความพยายาม SSH ติดต่อกัน
  4. อย่าใช้รหัสผ่าน แต่ใช้คีย์ SSH แทน

3
-1 สำหรับคำแนะนำแรกทำให้สิ่งต่าง ๆ ซับซ้อนขึ้นจริง ๆ แล้วไม่มีการเพิ่มความปลอดภัยจริง ๆ
steabert

หากคุณใช้คีย์ ssh และปิดการตรวจสอบรหัสผ่านผ่าน ssh ฉันต้องใช้ 1,2,3 หรือไม่
Dziamid

4
@steabert มันช่วยต่อต้านสคริปต์ kiddies ที่พยายามทำให้วิธีการของพวกเขาผ่านพอร์ต 22 นั่นเป็นประสบการณ์ของฉัน: มีคนคอยโจมตีเซิร์ฟเวอร์ที่หันหน้าเข้าหาอินเทอร์เน็ตเมื่อฉันตั้งค่าทำให้ระบบส่งคำเตือนให้ฉันหลังจากคำเตือน ฉันย้ายพอร์ตและคำเตือนลดลง
pepoluan

@Dziamid คีย์ ssh ป้องกันไม่ให้ใครบางคนบุกเข้าไปในระบบของคุณ แต่มันไม่ได้หยุดพวกเขาจากการพยายามเชื่อมต่อกับพอร์ต 22
pepoluan

3
@Dziamid ไม่ไม่ถูกต้อง วิธีการรับรองความถูกต้องอื่น ๆ (RSAAuthentication, PubkeyAuthentication, # KerberosAuthentication ฯลฯ ) ทั้งหมดยังคงติดต่อผ่านทางพอร์ต 22
DrSAR

3

ก่อนอื่นคุณควรพิจารณาไม่ใช้รหัสผ่านและใช้กุญแจแทน ไม่จำเป็นต้องใช้รหัสผ่าน หากสิ่งนี้เหมาะกับคุณคุณสามารถกำหนดค่าเซิร์ฟเวอร์ OpenSSH- ไม่ให้ตอบสนองต่อการเข้าสู่ระบบด้วยรหัสผ่าน

https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html

ใช้ fail2ban อาจเป็นตัวเลือกเช่นกัน

https://help.ubuntu.com/community/Fail2ban


ฉันจะเชื่อมต่อกับเซิร์ฟเวอร์ได้อย่างไรถ้าฉันทำรหัสสาธารณะหาย
Dziamid

1
ผ่านคอนโซลหรือการเข้าถึงโดยตรงเท่านั้น ฉันค่อนข้างแน่ใจว่าคุณจะไม่สูญเสียรหัสของคุณหากคุณสามารถจัดการเซิร์ฟเวอร์
ddeimeke

0

เซิร์ฟเวอร์มีการใช้งานบนเครือข่ายอย่างกว้างขวางเพียงใด บางทีคุณสามารถคุยกับผู้ดูแลระบบเครือข่ายและตรวจสอบว่าเป็นไปได้ในการตรวจสอบและ จำกัด การเข้าถึงเครือข่ายไปยังเซิร์ฟเวอร์ แม้ว่าการเข้าสู่ระบบบัญชีจะปลอดภัยดูเหมือนว่าเซิร์ฟเวอร์อาจประสบจากการโจมตี DoS / DDoS แบบง่าย


0

ทางเลือกในการ fail2ban เป็น CSF: ConfigServer รักษาความปลอดภัยและไฟร์วอลล์

มันมาพร้อมกับ LFD: Login Failure Daemon ที่สามารถตรวจสอบความพยายามในการเข้าสู่ระบบล้มเหลวหลายครั้งในบริการต่างๆและจะบล็อกที่อยู่ IP ที่ละเมิด (ชั่วคราวหรือถาวร)

มีตัวเลือกอื่น ๆ ที่สามารถช่วยป้องกันการโจมตีจากน้ำท่วมและอาจตรวจจับการบุกรุก

ข้อเสีย:

  • คุณต้องใช้ CSF เป็นไฟร์วอลล์ของคุณเพื่อให้ LFD ทำงานได้ ดังนั้นหากคุณมีไฟร์วอลล์ที่มีอยู่คุณจะต้องแทนที่ด้วย CSF และพอร์ตการกำหนดค่าของคุณ
  • มันไม่ได้บรรจุสำหรับ Ubuntu คุณจะต้องเชื่อถือการอัปเดตอัตโนมัติจาก configserver.com หรือปิดการใช้งานการอัปเดตอัตโนมัติ
  • ฉันได้ยินมาว่ามันค่อนข้างเป็นที่นิยมดังนั้นผู้บุกรุกที่ฉลาดอาจจะรู้วิธีปิดการใช้งานการตรวจจับการบุกรุกก่อนที่จะถูกตรวจจับ!

0

คุณต้องการให้บริการ SSH ไปทั่วโลกหรือไม่? หรือเพียงแค่สมาชิกในทีมในสถานที่เฉพาะ? คำตอบของฉันขึ้นอยู่กับความรุนแรงของการท้าทายของคุณ

ไม่ว่าในกรณีใดสิ่งหนึ่งที่คุณควรทำคือตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ SSH ไม่อนุญาตการล็อกอินด้วยรหัสผ่านสำหรับผู้ใช้รูท

  1. ใน / etc / ssh / sshd_config ตรวจสอบให้แน่ใจว่าคุณไม่เคยอนุญาตการเข้าสู่ระบบรูทยกเว้นด้วยคีย์ SSH

ในระบบของฉันฉันได้รับการตั้งค่านี้

PermitRootLogin without-password

แต่ฉันสังเกตเห็นใน Ubuntu ที่ใหม่กว่าพวกเขามี

PermitRootLogin prohibit-password

หากคุณอ่าน "man sshd_config" ฉันคิดว่านี่หมายถึง "ห้ามรหัสผ่าน" รุ่นใหม่นี้หมายถึงสิ่งเดียวกันและชัดเจนในความหมายมากขึ้น นั่นไม่ใช่ค่าเริ่มต้นในระบบ Linux บางระบบ แต่น่าจะเป็นเช่นนั้น

ตอนนี้เกี่ยวกับปัญหาของคุณ เซิร์ฟเวอร์ระบบของคุณมีผู้ใช้บางคนในสถานที่เฉพาะหรือไม่ ทำเช่นนี้!

  1. แก้ไข /etc/hosts.deny และใส่

    ALL: ALL

จากนั้นแก้ไข /etc/hosts.allow และรายการหมายเลข IP หรือช่วงที่ต้องการอนุญาตให้ใช้ SSH สัญกรณ์มีความสับสนเล็กน้อยเพราะถ้าคุณต้องการอนุญาตให้ทุกระบบที่มีหมายเลข IP เช่น 111.222.65.101 ถึง 111.222.65.255 คุณใส่รายการเช่นนี้ใน hosts.allow

ALL: 127.0.0.1
sshd: 111.222.65.
sshdfwd-X11: 111.222.65.

นั่นคือทางออกที่ดุร้ายและทรงพลัง หากผู้ใช้ของคุณสามารถระบุช่วง IP ทำมันได้!

การแก้ปัญหานี้มีอยู่ก่อนที่จะสร้างตาราง IP มันเป็น (ฉันคิดว่า) จัดการได้ง่ายกว่ามาก แต่มันไม่ดีเท่าวิธีการแก้ปัญหาตาราง IP เพราะรูทีนตาราง IP จะพบศัตรูได้เร็วกว่าโปรแกรมที่ขับเคลื่อนโดย hosts.allow และโฮสต์ .ปฏิเสธ. แต่นี่เป็นไฟที่แน่นอนวิธีง่ายๆในการแก้ไขปัญหามากมายไม่ใช่แค่จาก SSH

สังเกตปัญหาที่คุณสร้างขึ้นเอง หากคุณต้องการเปิดเซิร์ฟเวอร์ FTP เว็บเซิร์ฟเวอร์หรืออะไรก็ตามคุณจะต้องทำรายการในโฮสต์ที่อนุญาต

คุณสามารถบรรลุวัตถุประสงค์พื้นฐานเดียวกันโดยเล่นซอกับ iptables และไฟร์วอลล์ เรียกได้ว่าเป็นทางออกที่ดีเพราะคุณปิดกั้นศัตรูที่อยู่นอกขอบเขต Ubuntu มี "ufw" (ไฟร์วอลล์ที่ไม่ซับซ้อน) และ "man ufw" มีตัวอย่างมากมาย ฉันควรมี GUI ที่ดีในการลุยผ่านสิ่งนี้ฉันไม่ต้องทำเช่นนี้ตลอดเวลา บางทีคนอื่นสามารถบอกเราได้ว่ามีตอนนี้หรือไม่

  1. แนะนำโพสต์อื่น ๆ ที่นี่โดยใช้กุญแจสาธารณะ SSH สำหรับผู้ใช้ของคุณเท่านั้น แน่นอนว่าจะช่วยในราคาของความซับซ้อนและความยุ่งยากสำหรับผู้ใช้ของคุณ ในแล็บของเรามีคอมพิวเตอร์ 15 เครื่อง ผู้ใช้ไปกับคอมพิวเตอร์ การขอการรับรองความถูกต้องของคีย์ SSH จะทำให้เกิดความยุ่งยากมากเพราะผู้คนไปจากคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่ง

แหล่งที่มาของความยุ่งยากอื่นจะเกิดขึ้นเมื่อผู้ใช้บางคนสะสมคีย์ ssh ที่แตกต่างกันสำหรับเซิร์ฟเวอร์ต่างๆ เนื่องจากฉันมีคีย์ SSH สำหรับโครงการที่ต่างกันประมาณ 12 โครงการตอนนี้ ssh ล้มเหลวเนื่องจากฉันมีพับลิกคีย์มากเกินไป (ต้องการ "ssh -o PubkeyAuthentication = false" หรือสร้างรายการในไฟล์. ssh / config มันเป็น PITA)

  1. หากคุณต้องปล่อยให้เซิร์ฟเวอร์เปิดให้ SSH จากโลกกว้างใหญ่แน่นอนคุณควรใช้รูทีนการปฏิเสธเพื่อบล็อกตำแหน่งที่พยายามเข้าสู่ระบบบ่อยครั้งมี 2 โปรแกรมที่ดีสำหรับสิ่งนี้สิ่งที่เราใช้คือ denyhosts และ fail2ban . โปรแกรมเหล่านี้มีการตั้งค่าที่อนุญาตให้คุณแบนผู้กระทำความผิดในช่วงเวลาที่คุณต้องการ

ในระบบ Centos Linux ของเราฉันสังเกตเห็นว่าพวกเขาทำแพ็กเกจ denyhosts และเสนอ fail2ban เท่านั้น ฉันชอบ denyhosts เพราะมันสร้างรายการผู้ใช้ / IP ที่มีปัญหาและจากนั้นใน hosts.deny รายการนั้นก็ถูกบันทึกไว้ เราติดตั้ง fail2ban แทนและมันก็โอเค ความเข้าใจของฉันคือคุณควรปิดกั้นผู้ใช้ที่ไม่ดีเหล่านี้ที่ขอบด้านนอกของเซิร์ฟเวอร์ดังนั้นตัวบล็อกที่อิงกับตาราง ip เช่น fail2ban จะดีกว่าจริง ๆ Denyhosts ทำงานในระดับที่สองหลังจากที่ศัตรูได้รับ iptables ที่ผ่านมาพวกเขาจะถูกปฏิเสธโดย sshd daemon

ในทั้งสองโปรแกรมนี้เป็นเรื่องน่าเบื่อที่จะให้ผู้ใช้ออกจากคุกหากพวกเขาลืมรหัสผ่านและลองลงชื่อเข้าใช้อีกสองสามครั้งมันเป็นการยากที่จะทำให้ผู้คนกลับเข้ามาในเมื่อพวกเขาทำผิดพลาดในการเข้าสู่ระบบ คุณคาดเดาได้ว่าจะมี GUI แบบจุดและคลิกที่คุณสามารถชี้และให้ผู้คนกลับมาได้ แต่มันไม่ใช่แบบนั้น ฉันต้องทำเช่นนี้ทุกสองสามเดือนและลืมวิธีระหว่างเวลาดังนั้นฉันจึงเขียนคำแนะนำสำหรับตัวเองในหน้าเว็บของฉัน http://pj.freefaculty.org/blog/?p=301

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.