วิธีหยุด / ป้องกัน SSH bruteforce [ปิด]


22

ฉันยังใหม่ต่อการบริหารเครือข่ายดังนั้นโปรดพิจารณาว่าฉันยังไม่เคยมีประสบการณ์

ฉันมีรูทเซิร์ฟเวอร์ Ubuntu พร้อมแผงควบคุม

เมื่อวานเพื่อนของฉันและฉันสังเกตเห็นว่าคุณภาพการพูดของ TS3 ของเราแย่มาก ฉันส่ง Ping ไปที่เซิร์ฟเวอร์และมีการสูญเสียแพ็คเก็ตที่สูงมาก หลังจากนั้นฉัน googled auth.logบิตและพบว่ามีการ ฉันดาวน์โหลดและเลื่อนไปรอบ ๆ แล้วฉันพบสิ่งนี้:

May 13 10:01:27 rs204941 sshd[9351]: input_userauth_request: invalid user student [preauth]
May 13 10:01:27 rs204941 sshd[9351]: pam_unix(sshd:auth): check pass; user unknown
May 13 10:01:27 rs204941 sshd[9351]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=112.220.198.102 
May 13 10:01:29 rs204941 sshd[9351]: Failed password for invalid user student from 112.220.198.102 port 39806 ssh2
May 13 10:01:29 rs204941 sshd[9351]: Received disconnect from 112.220.198.102: 11: Bye Bye [preauth]
May 13 10:01:31 rs204941 sshd[9353]: Invalid user student from 112.220.198.102

ดูเหมือนว่ามีคนพยายามลงชื่อเข้าใช้ SSH หลายครั้ง ฉันเลื่อนไปรอบ ๆ และเห็นว่ามีคนพยายามใช้ชื่อผู้ใช้ที่แตกต่างกัน:student, tech, psi, news,...

มีการลงชื่อเข้าใช้หลายร้อยรายการในไฟล์

ฉันค้นหาสถิติการเข้าชมที่เว็บไซต์ของดาต้าเซ็นเตอร์ของฉัน มันอยู่ที่ 17MB ต่อชั่วโมงเท่านั้น ฉันมี 100Mbit Backbone ดังนั้นการถ่ายโอนข้อมูลของตัวเองดูเหมือนจะไม่เป็นปัญหา

ในขณะนี้ฉันไม่สามารถเข้าถึงเซิร์ฟเวอร์ได้ แต่อย่างใด

คำถามของฉันคือฉันจะได้รับ acces อีกครั้งได้อย่างไรฉันจะเอาชนะการโจมตีนี้และป้องกันการโจมตีต่อไปได้อย่างไร


ยังคงเรียนรู้สิ่งของของฉันในแผนกนี้ .... แต่นี่จะไม่เป็นการใช้งานที่ดีสำหรับการเคาะพอร์ตใช่ไหม
mjrider


คำตอบ:


37

จะเข้าถึงได้อย่างไร?

ยังไม่ชัดเจนว่าทำไมคุณไม่สามารถเข้าถึงบัญชีของคุณได้

หากเครื่องของคุณถูกโจมตีหรือโหลดสูงคุณควรพูดคุยกับผู้ให้บริการของคุณเกี่ยวกับการ จำกัด การเข้าถึง (จำกัด IP) หรือทำให้เซิร์ฟเวอร์ออฟไลน์ (ตัดการเชื่อมต่อจากอินเทอร์เน็ต)

คุณอาจต้องออกจากการเข้าถึงแบนด์ซึ่งผู้ให้บริการของคุณอาจช่วยได้

หากมีผู้บุกรุกเซิร์ฟเวอร์ของคุณคุณอาจจำเป็นต้องกู้คืนจากการสำรองข้อมูลหรือใช้อิมเมจการกู้คืน

วิธีป้องกันการโจมตีเซิร์ฟเวอร์ของคุณโดยเฉพาะ SSH

วิธีที่ดีที่สุดเพื่อป้องกันการเข้าสู่ระบบกำลังดุร้าย?

อย่าปล่อยให้พวกเขาไปที่เครื่องของคุณตั้งแต่แรก! มีหลายวิธีในการหยุดการพยายามเดรัจฉานกำลังก่อนที่จะไปยังโฮสต์ของคุณหรือแม้แต่ในระดับ SSH

ต้องบอกว่าการปกป้องระบบปฏิบัติการของคุณด้วยบางสิ่งเช่น fail2ban เป็นความคิดที่ดี http://en.wikipedia.org/wiki/Fail2ban

Fail2ban คล้ายกับ DenyHosts ... แต่ต่างจาก DenyHosts ที่เน้น SSH, fail2ban สามารถกำหนดค่าเพื่อตรวจสอบบริการใด ๆ ที่เขียนความพยายามในการเข้าสู่ระบบไปยังไฟล์บันทึกและแทนที่จะใช้ /etc/hosts.deny เพื่อบล็อกที่อยู่ IP / โฮสต์ , fail2ban สามารถใช้ Netfilter / iptables และ TCP Wrappers /etc/hosts.deny

มีหลายเทคนิคการรักษาความปลอดภัยที่สำคัญที่คุณควรพิจารณาเพื่อช่วยป้องกันการเข้าสู่ระบบกำลังดุร้าย:

SSH:

  • ไม่อนุญาตให้รูทเข้าสู่ระบบ
  • ไม่อนุญาตให้ใช้รหัสผ่าน ssh (ใช้การตรวจสอบรหัสส่วนตัว)
  • อย่าฟังในทุก ๆ อินเตอร์เฟส
  • สร้างส่วนต่อประสานเครือข่ายสำหรับ SSH (เช่น eth1) ซึ่งแตกต่างจากส่วนต่อประสานที่คุณให้บริการคำขอ (เช่น eth0)
  • อย่าใช้ชื่อผู้ใช้ทั่วไป
  • ใช้รายการอนุญาตและอนุญาตเฉพาะผู้ใช้ที่ต้องการการเข้าถึง SSH
  • หากคุณต้องการการเข้าถึงอินเทอร์เน็ต ... จำกัด การเข้าถึงชุด IP ที่ จำกัด IP แบบคงที่หนึ่งอันเหมาะสมอย่างไรก็ตามการล็อกลงไปที่ xx0.0 / 16 นั้นดีกว่า 0.0.0.0/0
  • หากเป็นไปได้ให้หาวิธีเชื่อมต่อโดยไม่มีการเชื่อมต่ออินเทอร์เน็ตวิธีที่คุณสามารถปฏิเสธการรับส่งข้อมูลอินเทอร์เน็ตทั้งหมดสำหรับ SSH (เช่น AWS คุณสามารถรับการเชื่อมต่อโดยตรงที่ข้ามอินเทอร์เน็ตได้เรียกว่าการเชื่อมต่อโดยตรง)
  • ใช้ซอฟต์แวร์เช่น fail2ban เพื่อตรวจจับการโจมตีที่ดุร้าย
  • ตรวจสอบให้แน่ใจว่าระบบปฏิบัติการเป็นรุ่นล่าสุดอยู่เสมอโดยเฉพาะอย่างยิ่งความปลอดภัยและแพคเกจ ssh

การประยุกต์ใช้:

  • ตรวจสอบให้แน่ใจว่าแอปพลิเคชันของคุณทันสมัยอยู่เสมอโดยเฉพาะในแพ็คเกจความปลอดภัย
  • ล็อคหน้า 'ผู้ดูแลระบบ' ของแอปพลิเคชันของคุณ คำแนะนำหลายข้อข้างต้นใช้กับพื้นที่ผู้ดูแลระบบของแอปพลิเคชันของคุณด้วย
  • รหัสผ่านป้องกันพื้นที่ผู้ดูแลระบบของคุณบางอย่างเช่น htpasswd สำหรับเว็บคอนโซลจะฉายช่องโหว่ของแอปพลิเคชันที่จำเป็นและสร้างอุปสรรคเพิ่มเติมให้กับรายการ
  • ล็อคการอนุญาตของไฟล์ 'อัปโหลดโฟลเดอร์' มีชื่อเสียงในการเป็นจุดเข้าใช้งานของสิ่งที่น่ารังเกียจทุกประเภท
  • พิจารณานำแอปพลิเคชั่นของคุณไปอยู่ด้านหลังเครือข่ายส่วนตัวและเปิดเผยตัวโหลดบาลานซ์หน้าและ Jumpbox ของคุณเท่านั้น (นี่เป็นการตั้งค่าทั่วไปใน AWS โดยใช้ VPCs)

1
ฉันได้ติดตั้ง Fail2ban ผ่านhelp.ubuntu.com/community/Fail2banดูเหมือนว่าจะมีประสิทธิภาพและใช้งานง่ายมาก (การแจ้งเตือนทางจดหมาย ... )

ฉันได้รับข้อความจากดาต้าเซ็นเตอร์ของฉัน: มี floodattack (นี่คืออะไร) และนี่ทำให้การเชื่อมต่อไม่ดีมากสำหรับเซิร์ฟเวอร์จำนวนมาก มันไม่ได้เป็นการโจมตีเซิร์ฟเวอร์ของฉันโดยเฉพาะ


1
น่าสนใจ ดังนั้นดูเหมือนว่าดาต้าเซ็นเตอร์ของฉันเป็นเป้าหมายของการโจมตี แต่การรู้ว่าฉันได้รับความผิดพลาดนอกจากนี้ก็ดีเหมือนกัน และ Fail2ban เป็นเครื่องมือที่ดีจริงๆ ฉันจะอ่านเกี่ยวกับ Iptables และ SSH Config ในวันถัดไปและพยายามทำให้ปลอดภัยยิ่งขึ้น

3
กำหนดค่า openssh เพื่อฟังพอร์ตอื่นที่ไม่ใช่ 22 และกำหนดค่า iptables เพื่อปล่อยทุกสิ่งที่มาถึงพอร์ต 22 หากคุณไม่คาดหวังว่าจะได้รับประโยชน์จากประเทศอื่น ๆ นอกเหนือจากบ้านเกิดของคุณให้สร้างรายการบล็อกที่countryipblocks.net/country_selection phpและใช้กับ iptables
ThoriumBR

4

ฉันจะเอาชนะการโจมตีนี้ได้อย่างไรและป้องกันการโจมตีต่อไปนี้

ฉันมักจะเปลี่ยนพอร์ต ssh เริ่มต้นจาก 22 เป็นอื่นเช่น 1122 นี่เป็นการป้องกันการโจมตีอัตโนมัติจาก bot แต่การสแกนพอร์ตแบบธรรมดาสามารถตรวจจับได้ อย่างไรก็ตาม:

vi /etc/ssh/sshd_config

และแก้ไขพอร์ต 22เป็นพอร์ต 1122แต่ยังไม่พอ

กฎ IPTables อัตโนมัติเกี่ยวกับ bruteforce

ฉันใช้log2iptables https://github.com/theMiddleBlue/log2iptablesแทน Fail2ban เพราะเป็นสคริปต์ Bash อย่างง่ายที่แยกวิเคราะห์ไฟล์ใด ๆ ด้วยนิพจน์ปกติและดำเนินการ iptables ตัวอย่างเช่นเมื่อ 5 แมทช์เกิดขึ้น log2iptables จะปล่อยไอพีแอดเดรสเฉพาะ มันยอดเยี่ยมเพราะใช้ Telegram API และสามารถส่งข้อความบนโทรศัพท์ของฉันเมื่อเขาพบปัญหา :)

หวังว่านี่จะช่วยได้!


8
ฉันคาดเดาจากความสัมพันธ์ระหว่าง URL โครงการและด้ามจับ SF ของคุณว่าคุณมีส่วนเกี่ยวข้องกับโครงการนี้ โปรดดูแนวทางของเราในการอ้างอิงผลิตภัณฑ์ของคุณโดยเฉพาะอย่างยิ่งการสังเกตข้อกำหนดที่ว่า " คุณต้องเปิดเผยความร่วมมือในคำตอบของคุณ "
MadHatter สนับสนุนโมนิก้า

1

ฉันแค่รวบรวมมันทำงานทุก ๆ 15 นาทีเป็น cronjob ฯลฯ :

for z in `grep Invalid /var/log/auth.log | awk '{ print $NF }' | sort | uniq`
do
  count1=`grep $z /etc/hosts.deny | wc -l`
  count2=`grep Invalid /var/log/auth.log | grep $z | wc -l`
  if [ $count1 -eq 0 -a $count2 -gt 10 ] ; then
    current=`egrep "^ssh" /etc/hosts.deny | sed 's/sshd[ :,]*//'`
    sudo cp /etc/hosts.deny.bak /etc/hosts.deny
    sudo chmod 666 /etc/hosts.deny
    if [ $current ] ; then
      echo "sshd : $current , $z" >> /etc/hosts.deny
    else
      echo "sshd : $z" >> /etc/hosts.deny
    fi
    sudo chmod 644 /etc/hosts.deny
  fi
done

0

นี่เป็นโซลูชันทางเลือกของฉันสำหรับการโจมตี SSH แนวคิดนี้ปิด SSH daemon หากไม่ได้ใช้ ไม่มีพอร์ตที่เปิดไม่มีการโจมตี คุณสามารถลอง เป็นโอเพนซอร์ซ https://github.com/indy99/nnet_port_guard


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

0

โซลูชันอัตโนมัติสำหรับ Centos / RHEL เพื่อปิดกั้นนักแสดงที่ไม่ดี

ต่อไปนี้เป็นสคริปต์สำหรับ Centos เพื่อตรวจสอบการเข้าสู่ระบบล้มเหลวของ ssh สำหรับบัญชีผู้ใช้ที่ไม่ถูกต้องและรหัสผ่านไม่ถูกต้องสำหรับบัญชีที่ถูกต้อง หาก IP ต้นทางมาถึงเรามากกว่า 3 ครั้งและไม่ได้อยู่ในรายการปฏิเสธมันจะถูกเพิ่มเข้าไปในรายการปฏิเสธ ฉันเรียกใช้สิ่งนี้ทุก ๆ 15 นาทีจาก crontab ของรูท ฉันยังไม่อนุญาตให้ลงชื่อเข้าใช้รูทผ่าน ssh ดังนั้นการรวมกันทำให้สิ่งต่าง ๆ ค่อนข้างเงียบ

     #/bin/bash
     # Save a copy of the existing hosts.deny file for safety
     cp /etc/hosts.deny /etc/hosts.deny.bak
     # Get a list of the offending IP addresses and process them
     for z in `grep "Invalid\|Failed" /var/log/secure | awk '{ print $NF }' | sort | uniq`
     do
     # Get the number of times this IP hit us
     hits=`grep "Invalid\|Failed" /var/log/secure* | grep $z | wc -l`
     # Check whether this IP is already blocked
     blocked=`grep $z /etc/hosts.deny | wc -l`
     # If they hit us more than 3 times and are not already on the deny list
     # add them to the deny list
     if [ $hits -gt 3 -a $blocked -eq 0 ]
     then
          echo "sshd : $z" >> /etc/hosts.deny
     fi
     done

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