วิธีการป้องกัน SSH จากการแฮ็ก วิธีป้องกันเซิร์ฟเวอร์ SSH จากการโจมตีแบบ Brute Force โดยใช้ Fail2ban การเปลี่ยนพอร์ตเริ่มต้น

เพื่อปกป้องเซิร์ฟเวอร์ของเราจากการบังคับใช้รหัสผ่านอย่างดุร้าย คุณสามารถใช้ยูทิลิตี้ sshguard หรือ sshit

หลักการทำงาน.

sshguard และ sshit ทำงานบนหลักการเดียวกัน พวกเขาวิเคราะห์ข้อความของระบบเกี่ยวกับการรับรองความถูกต้องที่ไม่ถูกต้อง และหากถึงค่าที่กำหนด ให้ป้อน IP โจมตีลงในกฎไฟร์วอลล์ที่บล็อก หลังจากช่วงระยะเวลาหนึ่ง IP จะถูกลบออกจากกฎ
ดังนั้นจึงจำเป็นต้องมีไฟร์วอลล์ที่กำหนดค่าไว้เพื่อดำเนินการ

SSHGuard

sshguard สามารถทำงานร่วมกับ

  • ไฟร์วอลล์เนทิฟ AIX- สำหรับระบบปฏิบัติการ IBM AIX
  • netfilter/iptables- สำหรับระบบปฏิบัติการบน Linux
  • ตัวกรองแพ็คเก็ต (PF)- สำหรับระบบปฏิบัติการ BSD (เปิด, ฟรี, Net, DragonFly -BSD)
  • ไอพีไฟร์วอลล์ (IPFW)- สำหรับ FreeBSD และ Mac OS X
  • ไอพีฟิลเตอร์ (IPFILTER)- สำหรับ FreeBSD, NetBSD และ Solaris
  • hosts_access ของ tcpd (/etc/hosts.allow)- พกพาข้าม UNIX
  • โมฆะ- แบ็กเอนด์แบบพกพาที่ไม่ต้องทำอะไรเลยเพื่อใช้การตรวจจับ แต่ไม่ใช่การป้องกัน

ฉันใช้ PF ดังนั้นจึงมีตัวอย่างใน PF ในบันทึกนี้

กำลังติดตั้ง sshguard

ฟรีBSD:

ติดตั้งจากพอร์ต

Cd /usr/ports/security/sshguard-pf/&& ทำให้การติดตั้งสะอาด

หากคุณไม่ได้ใช้พอร์ตด้วยเหตุผลบางประการ ให้ดาวน์โหลดเวอร์ชันล่าสุดจากเว็บไซต์ sshguard และสร้างด้วยตนเอง

./configure --with-firewall=pf && ทำ && ทำการติดตั้ง

เดเบียน:

apt-get ติดตั้ง sshguard

การกำหนดค่าระบบปฏิบัติการเพื่อรัน sshguard

สร้างไฟล์เพื่อจัดเก็บบันทึก

# touch /var/log/sshguard

เดเบียน (เสียงฮืด ๆ):

แก้ไขบรรทัดต่อไปนี้ใน //etc/default/sshguard

#mcedit /etc/default/sshguard #ARGS="-a 40 -p 420 -s 1200" ARGS="-a 5 -p 420 -s 2400 -b 5:/etc/sshguard/blacklist"

และรีสตาร์ท sshguard
บริการ sshguard เริ่มต้นใหม่

ฟรีBSD:

เราจำเป็นต้องเพิ่มสองบรรทัดในการกำหนดค่า PF

โต๊ะ ยังคงอยู่

เราประกาศตารางที่ sshguard เข้าสู่ IP ของโรบ็อต

บล็อกอย่างรวดเร็วด้วย $if0 proto tcp จาก

จริงๆ แล้ว กฎการบล็อกควรถูกทำเครื่องหมายไว้ที่ด้านบนสุดของบล็อกกฎของไฟล์การกำหนดค่า PF $if0 เป็นอินเทอร์เฟซที่การเชื่อมต่อจะถูกบล็อก หากต้องการบล็อกบนอินเทอร์เฟซทั้งหมด ให้แทนที่ด้วยอินเทอร์เฟซใด ๆ
อ่านไฟล์การกำหนดค่าอีกครั้ง

Auth.info;authpriv.info |exec/usr/local/sbin/sshguard

และรีสตาร์ท syslog

#/etc/rc.d/syslogd รีสตาร์ท

ที่จริงแล้วหลังจากการยักย้ายเหล่านี้ sshguard จะบล็อกการโจมตีด้วยพารามิเตอร์เริ่มต้น
เมื่อโจมตีเข้ามา. /var/log/auth.logเราจะเห็นสิ่งต่อไปนี้

Jun1611:01:40 www sshd:การทดสอบผู้ใช้ไม่ถูกต้องจาก61.172.251.183 Jun1612:29:48 www sshd:การทดสอบผู้ใช้ไม่ถูกต้องจาก85.114.130.168 Jun1612:29:49 www sshd:การทดสอบผู้ใช้ไม่ถูกต้องจาก85.114.130.168 Jun1612: 29: 49 www sshd: การทดสอบผู้ใช้ไม่ถูกต้องจาก 85.114.130.168Jun1612:29:50 www sshd: การทดสอบผู้ใช้ไม่ถูกต้องจาก 85.114.130.168Jun1612:29:50 www sshguard: Blocking85.114.130.168:4for>420secs:4 ล้มเหลวมากกว่า 2 วินาที

การกำหนดค่าตัวเลือก sshguard

sshguard มีพารามิเตอร์จำนวนหนึ่งที่เราสามารถแทนที่ได้
-กจำนวนครั้งในการพยายามตรวจสอบสิทธิ์ที่ล้มเหลว หลังจากนั้น IP จะถูกบล็อก ค่าเริ่มต้นคือ 4
-พีหลังจากผ่านไปกี่วินาที ip จะถูกปลดบล็อก ค่าเริ่มต้นคือ 420
-ส sshguard จำ ip ได้กี่วินาที ค่าเริ่มต้นคือ 1200 เพื่อให้ชัดเจนยิ่งขึ้น หากมีการโจมตีหนึ่งครั้งจาก IP ทุก 30 นาที IP จะไม่ถูกแบนด้วยการตั้งค่าเริ่มต้น
-ว IP สีขาว เครือข่าย หรือเส้นทางไปยังไฟล์ที่อยู่สีขาว รูปแบบไฟล์เป็นหนึ่งบรรทัด - หนึ่งรายการ # กำหนดความคิดเห็น
-ขกำหนดจำนวนบล็อก IP ที่จะเพิ่มลงในบัญชีดำและเส้นทางไปยังรายการนั้น บัญชีดำจะถูกโหลดเมื่อ sshguard เริ่มทำงาน และจะไม่ถูกล้างโดยอัตโนมัติ

sshguard ไม่มีไฟล์กำหนดค่า พารามิเตอร์ถูกตั้งค่าเมื่อ sshguard เริ่มทำงาน ในกรณีของเรา sshguard จะเริ่ม syslog ดังนั้นเราจะแก้ไข syslog.conf เพื่อให้ sshguard บล็อก IP หลังจากพยายามตรวจสอบสิทธิ์ไม่สำเร็จ 3 ครั้งเป็นเวลา 30 นาที และหลังจาก 5 บล็อก ให้ขึ้นบัญชีดำ

Auth.info;authpriv.info |exec/usr/local/sbin/sshguard -a 3-p 1500-b 5:/usr/local/etc/sshguard.blacklist

ครั้งแรกที่ถูกบล็อคเป็นเวลา 420 วินาที และถูกลบหลังจากผ่านไป 7 นาที
ครั้งที่สองที่ 2*420y จะถูกลบหลังจาก 14 นาที
ครั้งที่สามที่ 2*2*420 แล้วลบหลังผ่านไป 28 นาที ฯลฯ...
2^(N-1)*420 ครั้งที่ N

เหี้ย

Sshit เป็นสคริปต์ Perl ดังนั้นจึงจำเป็นที่ระบบจะต้องมี Perl เช่นเดียวกับ 2 โมดูล

  • IPC::แชร์ได้
  • Proc::PID::ไฟล์

Sshit ใช้งานได้กับ pf และ ipfw เท่านั้น

กำลังติดตั้งเหี้ยๆ

cd /usr/ports/security/sshit/&& ทำให้การติดตั้งสะอาด

การกำหนดค่าเหี้ยๆ

Sshit มีไฟล์การกำหนดค่า /usr/local/etc/sshit.conf ซึ่งคุณสามารถแทนที่ค่าเริ่มต้นได้

FIREWALL_TYPE = "pf"; # ไฟร์วอลล์ใดที่เราใช้ MAX_COUNT =3; # จำนวนความพยายามในการรับรองความถูกต้องที่ล้มเหลวหลังจากที่ IP ถูกบล็อกภายใน_TIME =60; # ภายในกี่วินาที จำนวนการตรวจสอบสิทธิ์ที่ล้มเหลวที่ระบุจะต้องเกิดขึ้น RESET_IP =300; # หลังจากผ่านไปกี่วินาที IP จะถูกปลดบล็อก PFCTL_CMD = "/sbin/pfctl"; PF_TABLE ="badhosts"#table name ที่มีการป้อน ips ที่ไม่ถูกต้อง

การตั้งค่าระบบปฏิบัติการเพื่อให้ shit ทำงานได้

โดยการเปรียบเทียบกับการตั้งค่าสำหรับ sshguard เราจะแก้ไขไฟล์การกำหนดค่า PF

โต๊ะ คงบล็อกอย่างรวดเร็วบน $if0 proto tcp จาก ถึง $if0 พอร์ต ssh label "ssh brute"

อ่านไฟล์การกำหนดค่าอีกครั้ง

#pfctl -f /etc/pf.conf

การแก้ไข syslog.conf

Auth.info;authpriv.info |exec/usr/local/sbin/sshit

และรีสตาร์ท syslog

SSH เป็นโปรโตคอลที่ปลอดภัยสำหรับการถ่ายโอนข้อมูล (คำสั่ง ไฟล์ วิดีโอ ฯลฯ) ระหว่างคอมพิวเตอร์

มันถูกเปิดใช้งานตามค่าเริ่มต้นบน VPS และเซิร์ฟเวอร์เฉพาะของผู้ให้บริการโฮสติ้งส่วนใหญ่ เนื่องจากช่วยให้คุณจัดการเครื่องระยะไกลได้อย่างง่ายดายและปลอดภัย อย่างไรก็ตาม คุณสามารถเช่าเซิร์ฟเวอร์ VPS บนบริการ Well-Web ได้ในราคาไม่แพง เนื่องจากเปิดใช้งาน SSH บน VPS ทั้งหมด เพื่อหลีกเลี่ยงปัญหาเมื่อใช้ Secure Shell จึงจำเป็นต้องมีการป้องกัน SSH ที่เหมาะสม

ปิดการใช้งานการเข้าถึงจากรูท

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

ในนั้นคุณจะต้องค้นหารายการ PermitRootLogin และแทนที่ค่าด้วย "ไม่" นั่นคือคุณควรได้รับรายการต่อไปนี้:

หมายเลข PermitRootLogin

โดยปกติแล้ว สิ่งนี้จะไม่ป้องกันการแฮ็ก แต่ก็ยังทำให้ยากขึ้นบ้าง

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

การเปลี่ยนพอร์ตเริ่มต้น

เนื่องจากการแฮ็กเซิร์ฟเวอร์ผ่าน SSH มักเกิดขึ้นผ่านการค้นหารหัสผ่าน (กำลังดุร้าย) จึงมีเหตุผลที่จะเปลี่ยนพอร์ตมาตรฐาน 22 เป็นพอร์ตอื่น นี่เป็นเรื่องง่ายมากที่จะทำ ก่อนอื่นคุณต้องเปิดไฟล์ sshd_config ที่กล่าวถึงแล้วและเพิ่มหนึ่งบรรทัดที่นั่น:

พอร์ต port_number

รายการจะมีลักษณะเช่นนี้:

พอร์ต 3048

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

ข้อ จำกัด การเข้าถึง IP

วิธีการป้องกันอีกวิธีหนึ่งที่จะลดโอกาสของการเชื่อมต่อโดยไม่ได้รับอนุญาตจนเกือบเป็นศูนย์คือการตั้งค่าข้อจำกัดการอนุญาต สามารถกำหนดค่า SSH ในลักษณะที่ให้เฉพาะเครื่องระยะไกลที่มีที่อยู่ IP เฉพาะเท่านั้นที่สามารถเข้าสู่ระบบเซิร์ฟเวอร์ได้ ในการดำเนินการนี้ในไฟล์ sshd_config ในบรรทัด AllowUser คุณจะต้องเพิ่ม @IP_number ในชื่อผู้ใช้แต่ละคน รายการอาจมีลักษณะดังนี้:

อนุญาตผู้ใช้ [ป้องกันอีเมล], [ป้องกันอีเมล]

ก่อนที่จะใช้วิธีนี้ ขอแนะนำให้ตรวจสอบให้แน่ใจว่าไม่มีสถานการณ์ที่คุณอาจต้องเข้าสู่ระบบเซิร์ฟเวอร์จากเครื่องที่การกำหนดค่าไม่ได้ระบุที่อยู่ IP

รหัสผ่านที่ปลอดภัย

และแน่นอนว่าคุณควรใช้รหัสผ่านที่ทนทานต่อการใช้กำลังดุร้าย ยาวและมีสัญลักษณ์ที่แตกต่างกันมากที่สุดเท่าที่จะเป็นไปได้ โดยเฉพาะอย่างยิ่งกับ krakozyabrs นี่เป็นสิ่งที่ต้องมี

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

ไฟล์การกำหนดค่า

  • /etc/ssh/sshd_config.php- ไฟล์กำหนดค่าเซิร์ฟเวอร์ OpenSSH;
  • /etc/ssh/ssh_config.php- ไฟล์การกำหนดค่าไคลเอนต์ OpenSSH;
  • ~/.ssh/- ไดเร็กทอรีที่เก็บการตั้งค่า SSH ของผู้ใช้
  • ~/.ssh/authorized_keys หรือ ~/.ssh/authorized_keys- รายการคีย์ (RSA หรือ DSA) ที่ใช้เชื่อมต่อกับบัญชีผู้ใช้
  • /etc/nologin- หากไฟล์นี้มีอยู่ในระบบ sshd จะห้ามผู้ใช้ทั้งหมดยกเว้นรูทไม่ให้เชื่อมต่อกับระบบ
  • /etc/hosts.allow และ /etc/hosts.deny- ระบบห้าม (ส่วนหนึ่งของการรักษาความปลอดภัย) ทำงานคล้ายกับ ACL;
  • พอร์ต SSH เริ่มต้น - 22

ไม่จำเป็น - ปิดมัน

หากเซิร์ฟเวอร์ของคุณไม่ต้องการการเชื่อมต่อ SSH ระยะไกล อย่าลืมปิดการใช้งานแล้ว ในระบบเช่น CentOS/RHEL จะทำดังนี้:

Chkconfig sshd ปิด yum ลบ openssh-server

ใช้ SSH เวอร์ชัน 2

โปรโตคอล SSH เวอร์ชันแรกมีปัญหาด้านความปลอดภัยซึ่งได้รับการแก้ไขในเวอร์ชันที่สอง ดังนั้นให้ใช้เวอร์ชันที่สอง ตรวจสอบให้แน่ใจว่าได้ระบุตัวเลือก Protocol 2 ในไฟล์ /etc/ssh/sshd_config

จำกัดการเข้าถึง SSH

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

AllowUsers รูทเครือข่าย Merion

ในทางกลับกัน คุณสามารถอนุญาตให้ผู้ใช้ทุกคนเข้าถึงได้ ยกเว้นที่ระบุไว้:

DenyUsers รูทเครือข่าย Merion

เวลาไม่มีการใช้งาน

สิ่งสำคัญคือต้องระบุเวลาที่เซสชั่นที่ไม่ได้ใช้งานจะสิ้นสุดลง (เสร็จสิ้น) ซึ่งสามารถทำได้ด้วยตัวเลือกต่อไปนี้:

ClientAliveInterval 300 ClientAliveCountMax 0

ในการตั้งค่านี้ เราระบุเวลาที่ไม่มีการใช้งานเป็น 300 วินาที (5 นาที)

เกี่ยวกับไฟล์ .rhosts

ความจริงก็คือไฟล์นี้มีรายชื่อโฮสต์และผู้ใช้ หากไฟล์นี้มีโฮสต์และผู้ใช้ผสมกัน ผู้ใช้รายนี้จะสามารถเชื่อมต่อกับระบบผ่าน SSH ได้โดยไม่ต้องขอรหัสผ่าน เราขอแนะนำให้ปิดการใช้งานคุณสมบัติ "มหัศจรรย์" นี้:

ไม่สนใจRhosts ใช่

ไม่มีการรับรองความถูกต้องตามโฮสต์!

ที่เรียกว่า การรับรองความถูกต้องตามโฮสต์อนุญาตให้ผู้ใช้จากโฮสต์เฉพาะเชื่อมต่อกับเซิร์ฟเวอร์ ปิดการใช้งาน:

หมายเลขการตรวจสอบความถูกต้องตามโฮสต์

การเชื่อมต่อโดยตรงผ่านรูท

หมายเลข PermitRootLogin

ทำแบนเนอร์

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

พอร์ต 22 จากภายในเท่านั้น!

เข้าถึงพอร์ตระบบ 22 ผ่านกฎไฟร์วอลล์แบบลูกโซ่เท่านั้น วิธีที่ดีที่สุดคือปล่อยให้เข้าถึงได้จากภายใน LAN เท่านั้น ตัวอย่างเช่นใน ไอพีเทเบิลคุณสามารถให้สิทธิ์เข้าถึง 192.168.11.0/24:

RH-Firewall-1-INPUT -s 192.168.11.0/24 -m state --state ใหม่ -p tcp --dport 22 -j ยอมรับ

ฟังได้ที่ไหน.

ตามค่าเริ่มต้น SSH จะรับฟังการเชื่อมต่อบนอินเทอร์เฟซที่มีอยู่ทั้งหมด เราขอแนะนำให้เปลี่ยนพอร์ตเริ่มต้นและระบุที่อยู่ IP ที่จะรอการเชื่อมต่อ เช่น เราจะระบุพอร์ต 962 และที่อยู่ IP 192.168.11.24

พอร์ต 962 ListenAddress 192.168.11.24

รหัสผ่านที่รัดกุมแบบเข้ารหัส

ใช้รหัสผ่านที่รัดกุม มีเครื่องมือมากมายบนอินเทอร์เน็ตที่จะสร้างรหัสผ่านที่รัดกุมแบบออนไลน์ ไม่มีค่าใช้จ่ายและไม่มี SMS :)

ห้ามรหัสผ่านที่ว่างเปล่า

มีผู้ใช้ที่ไม่มีรหัสผ่าน การเข้าถึง SSH จะต้องถูกปฏิเสธโดยใช้ตัวเลือก:

พอร์ต 962 PermitEmptyPasswords no

วิเคราะห์บันทึก

ตั้งค่าการบันทึกเหตุการณ์เป็นโหมด INFO หรือ DEBUG ซึ่งจะช่วยให้คุณขยายการควบคุมระบบได้:

ข้อมูลระดับบันทึก

บทความนี้มีประโยชน์กับคุณหรือไม่?

บอกฉันทีว่าทำไม?

ขออภัยที่บทความนี้ไม่มีประโยชน์สำหรับคุณ: (โปรดหากไม่ยากระบุสาเหตุ เราจะขอบคุณมากสำหรับคำตอบโดยละเอียด ขอบคุณที่ช่วยให้เราดีขึ้น!

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

คุณสมบัติหลักของการโจมตี SSH bruteforce ขนาดใหญ่คือการสแกนช่วง IP อย่างครอบคลุมบนพอร์ตเปิด 22 และการใช้ชื่อผู้ใช้และรหัสผ่านที่ใช้กันทั่วไป (เช่น root:passwd123, admin:server123 ฯลฯ)

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

Cat /var/log/secure* | grep "รหัสผ่านล้มเหลว" | grep sshd | awk "(พิมพ์ $1,$2)" | การเรียงลำดับ -k 1,1M -k 2n | ยูนิค -ซี

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

1. ถ้าคุณ ไม่ใช้สำหรับการอนุญาตชื่อผู้ใช้ที่ใช้บ่อย เช่น รูท ผู้ดูแลระบบ ผู้ดูแลระบบ ผู้ใช้ ฯลฯ และใช้รหัสผ่านที่ซับซ้อนในการอนุญาต จากนั้นคุณสามารถไปยังจุดที่สองได้ทันที หากต้องการเปลี่ยนรหัสผ่านให้ซับซ้อนยิ่งขึ้น ให้ป้อนคำสั่ง:

รหัสผ่าน #your_login#

ที่ไหน #ของคุณ_เข้าสู่ระบบ#— ชื่อผู้ใช้ของคุณ
เมื่อป้อนรหัสผ่านใหม่ รหัสผ่านจะไม่แสดง เคอร์เซอร์จะยังคงอยู่ในที่เดียว

เข้าสู่เซิร์ฟเวอร์ผ่าน SSH สร้างผู้ใช้ใหม่และให้รหัสผ่านแก่เขาเพื่อดำเนินการนี้ให้ป้อนคำสั่ง:

Adduser #ผู้ใช้ใหม่# passwd #ผู้ใช้ใหม่#

ที่ไหน #ผู้ใช้ใหม่#— ชื่อผู้ใช้ใหม่ของคุณ อย่าใช้ชื่อผู้ใช้ที่ใช้บ่อยเป็นชื่อผู้ใช้ ซึ่งเป็นตัวเลือกที่ดี your_nameadmin(ตัวอย่างเช่น foxadmin, useralex, rootidler)

2. หลังจากนั้นเข้าสู่ระบบผ่าน SSH ด้วยชื่อผู้ใช้และรหัสผ่านใหม่ และเปิดการกำหนดค่า SSH daemon (sshd_config) ด้วยคำสั่ง:

Vi /etc/ssh/sshd_config.vi

หลังจากนั้นคุณควรเห็นสิ่งนี้:

เส้นที่ขึ้นต้นด้วย # ถูกแสดงความคิดเห็น

ถึง ปกป้อง SSH จากความดุร้ายขนาดใหญ่ยกเลิกหมายเหตุและเปลี่ยนแปลงหรือเพิ่มพารามิเตอร์ต่อไปนี้ ไฟล์:
ก) ท่าเรือ- ท่าเรือที่ SSHDยอมรับและเชื่อมต่อบริการ ไม่ใส่ข้อคิดเห็น (ลบก่อนเริ่มบรรทัด # ) และเปลี่ยนค่าเริ่มต้น 22 ไปยังอื่น ๆ ตั้งแต่ 1024 ถึง 65536 ยกเว้นพอร์ตที่สงวนไว้ - รายการพอร์ตที่สงวนไว้เช่น:

พอร์ต 2022

ลบ # และเปลี่ยนค่า พอร์ต 22ให้กดบนคีย์บอร์ดของคุณก่อน ฉันหลังจากแก้ไขบรรทัดที่ต้องการแล้ว ให้กดปุ่ม เอสซี

ข) เข้าสู่ระบบ GraceTime— ระยะเวลารอการลงทะเบียนผู้ใช้ในระบบ หากผู้ใช้ล้มเหลวในการเข้าสู่ระบบภายในเวลาที่กำหนดโดยคำสั่งนี้ เซสชันจะสิ้นสุดลง มาลดค่านี้กัน:

เข้าสู่ระบบGraceTime 1น

ค) อนุญาตการรูทเข้าสู่ระบบ- อนุญาตให้ผู้ใช้ รากเข้าสู่ระบบผ่านโปรโตคอล SSH มาเปลี่ยนเป็น เลขที่.

หมายเลข PermitRootLogin

ง) อนุญาตผู้ใช้— ชื่อผู้ใช้ที่อนุญาตให้เข้าสู่ระบบผ่านโปรโตคอล SSH โดยคั่นด้วยช่องว่าง ที่นี่ แทนที่จะเป็น #your_login# เราจะระบุชื่อผู้ใช้ที่สร้างขึ้นใหม่

อนุญาตให้ผู้ใช้ #your_login#

จ) MaxAuthTries— จำนวนความพยายามเข้าสู่ระบบต่อเซสชัน เมื่อถึงจำนวนความพยายามสูงสุดที่อนุญาต เซสชันจะสิ้นสุดลง

MaxAuth ลอง 2

เป็นผลให้เราได้รับ:

พอร์ต 2022 LoginGraceTime 1m PermitRootLogin ไม่ AllowUsers #your_login# MaxAuthTries 2

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

หากคุณทำอะไรผิด (เช่น ลบบางสิ่งโดยไม่ตั้งใจ) เพื่อออกโดยไม่บันทึกใช้แทนแป้นพิมพ์ลัด , กุญแจ คิว!

หลังจากตั้งค่า SSH เสร็จแล้ว ให้รีสตาร์ท daemon ด้วยคำสั่ง:

บริการ sshd เริ่มต้นใหม่

ตอนนี้เมื่อเชื่อมต่อผ่าน SSH ให้ใช้พอร์ตใหม่ 2022 (หรืออันที่คุณระบุไว้ในการตั้งค่า) แทน พอร์ตมาตรฐาน 22.

ในบทความถัดไปเกี่ยวกับการตั้งค่า SSH ฉันอยากจะบอกคุณว่าเราจะห้ามการตรวจสอบรหัสผ่านและอนุญาตให้มีการอนุญาตโดยใช้คีย์ SSH ส่วนตัวเท่านั้น ดังนั้นจึงปกป้องตัวเราเองจากการเดารหัสผ่านให้มากที่สุด

ติดต่อกับ

ในบันทึกสั้นๆ นี้ ฉันได้รวบรวมวิธีต่างๆ ในการเพิ่มความปลอดภัยของเซิร์ฟเวอร์ ssh มีการอธิบายเทคนิคพื้นฐานและง่ายที่สุดในการดำเนินการ และเทคนิคที่ซับซ้อนกว่านั้นมีไว้สำหรับผู้อ่านที่สนใจเท่านั้น

เทคนิคพื้นฐาน

การดำเนินการทั้งหมดจะดำเนินการในไฟล์การกำหนดค่า sshd daemon - /etc/ssh/sshd_config ด้านล่างนี้ฉันจะให้ส่วนหนึ่งของไฟล์การกำหนดค่าของฉันพร้อมความคิดเห็น

### เครือข่าย ### # เราใช้พอร์ตที่ไม่ได้มาตรฐาน (>1024) พอร์ต 5679 # เราใช้เฉพาะการเชื่อมต่อ IPv4 # inet = IPv4, inet6 = IPv6, any = ทั้งสอง AddressFamily inet # คุณสามารถยอมรับการเชื่อมต่อจาก IP ที่แน่นอนเท่านั้น ที่อยู่ #ListenAddress 0.0.0.0 # เราใช้โปรโตคอลเวอร์ชันที่สองเพราะว่า อันแรกอยู่ภายใต้ช่องโหว่ # โปรโตคอลที่รู้จัก 2 # ปิดการใช้งานการเปลี่ยนเส้นทางกราฟิก (เซิร์ฟเวอร์ X) จนกระทั่ง # คุณต้องการมันอย่างชัดเจน X11 ไม่มีการส่งต่อ # ปิดการใช้งาน TCPKeepAlive และใช้ ClientAliveInterval แทน # เพื่อป้องกันการโจมตีเช่น TCP Spoofing TCPKeepAlive no # เตะผู้ใช้หลังจาก 10 นาที ( 600 วินาที) ของการไม่มีการใช้งาน ClientAliveInterval 600 ClientAliveCountMax 3 ### ไฟล์การกำหนดค่าคีย์ ### # HostKeys สำหรับโปรโตคอลเวอร์ชัน 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key # ใช้กระบวนการที่ไม่มีสิทธิพิเศษเพื่อ # ประมวลผลขาเข้าจากไคลเอ็นต์ Traffic # Sandbox - openSSH >= 5.9 ("ใช่" - สำหรับเวอร์ชันที่ต่ำกว่า) UsePrivilegeSeparation Sandbox # เมื่อเปลี่ยนค่าเหล่านี้ จะต้องลบคีย์เก่า # /etc/ssh/ssh_host_rsa_key(,.pub) และสร้างคีย์ใหม่ # โดยการรีสตาร์ท sshd # # อายุการใช้งานที่สำคัญ เช่น หลังจากเวลาใดรหัสใหม่จะถูกสร้างขึ้น # หากมีการใช้รหัสก่อนหน้า KeyRemodelInterval 1h # ความแรงของคีย์ ServerKeyBits 2048 # อนุญาตการอนุญาตโดยใช้คีย์สาธารณะ PubkeyAuthentication ใช่ # ตำแหน่งที่เก็บข้อมูลของคีย์ที่เชื่อถือได้ในไดเร็กทอรีผู้ใช้ AuthorizedKeysFile .ssh/authorized_keys ### การบันทึก ### # คำนำหน้าสำหรับ syslog SyslogFacility AUTH # ระดับรายละเอียดข้อความสำหรับ sshd ข้อมูล LogLevel ของตัวเอง ### การตรวจสอบสิทธิ์ ### # รายชื่อผู้ใช้ที่อนุญาต AllowUsers ivan # จำกัด เวลาในการป้อนรหัสผ่านสำหรับคีย์ ssh LoginGraceTime 30s # ห้ามการเข้าสู่ระบบระยะไกลภายใต้บัญชีรูท PermitRootLogin no # เปิดใช้งานการตรวจสอบสิทธิ์ของไฟล์อย่างชัดเจน และไดเรกทอรีที่มีคีย์ ssh StrictModes ใช่ # กี่ครั้งที่จะขอรหัสผ่านหากคุณป้อนไม่ถูกต้อง MaxAuthTries 3 # ห้ามเข้าสู่ระบบด้วยรหัสผ่านที่ว่างเปล่า PermitEmptyPasswords ไม่ # ห้ามเข้าสู่ระบบด้วยรหัสผ่านในหลักการ # (ใช้รหัสสาธารณะ/ส่วนตัวแทน) การตรวจสอบรหัสผ่านหมายเลข # ปิดการใช้งานการอนุญาต "การตอบสนองต่อความท้าทาย" # เพราะ มันไม่มีประโยชน์เมื่อใช้คีย์ ChallengeResponseAuthentication no # เนื่องจากเราไม่ใช้รหัสผ่าน เราจึงไม่จำเป็นต้องใช้ (PAM, ล็อกอิน (1)) UsePAM no UseLogin no # อนุญาตให้ไคลเอ็นต์ส่งผ่านตัวแปรสภาพแวดล้อมบางชุดเท่านั้น # RH BZ # CVE-2014-2532 # การใช้ประโยชน์จาก ShellShock AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL

เหล่านี้เป็นพารามิเตอร์ที่ได้รับการกำหนดค่าในไฟล์การกำหนดค่า sshd หลังจากเปลี่ยนการตั้งค่าแล้ว คุณต้องเริ่มบริการ sshd ใหม่

ความคิดเห็น

  • เมื่อใช้การรับรองความถูกต้องของคีย์ จำเป็นต้องมีคีย์ ก่อนหน้านี้สร้างบนเครื่องไคลเอนต์และคัดลอกกุญแจสาธารณะไปยังเซิร์ฟเวอร์ ตัวอย่าง:
ลูกค้า $ ssh-keygen ลูกค้า $ cat ~/.ssh/id_rsa.pub | ssh -p 5679 [ป้องกันอีเมล]"แมว >> ~/.ssh/authorized_keys"
  • ไฟล์ /var/log/auth.log จะมีข้อความจาก sshd- ในกรณีที่ไฟล์นี้หายไป คุณจะต้องกำหนดค่าระบบการบันทึกของคุณ ตัวอย่างสำหรับ syslog และ syslon-ng ฉันใช้ syslog-ng และจำเป็นต้องเพิ่มบรรทัดต่อไปนี้ในไฟล์ /etc/syslog-ng/syslog-ng.conf:
การรับรองความถูกต้องปลายทาง ( file("/var/log/auth.log"); ); เข้าสู่ระบบ ( แหล่งที่มา (src); ปลายทาง (รับรองความถูกต้อง); );

และรีสตาร์ทบริการ syslog-ng

  • หากคุณใช้พอร์ตที่ไม่ได้มาตรฐาน คุณอาจต้องกำหนดค่าไฟร์วอลล์ของคุณ (iptables, firewalld ฯลฯ)
    ตัวอย่างการตั้งค่าสำหรับ iptables:
root# iptables -A INPUT -p tcp -m state --state ใหม่, ก่อตั้งขึ้นแล้ว --dport 5679 -j ยอมรับ root# บริการ iptables บันทึก root# iptables -L -n Chain INPUT (ยอมรับนโยบาย) เป้าหมาย prot เลือกต้นทางปลายทาง ยอมรับ icmp -- 0.0.0.0/0 0.0.0.0/0 ยอมรับ tcp -- 0.0.0.0/0 0.0.0.0/0 สถานะ ใหม่ tcp dpt:22 ยอมรับ tcp -- 0.0.0.0/0 0.0.0.0/0 สถานะ ใหม่ tcp dpt :80 ยอมรับ tcp -- 0.0.0.0/0 0.0.0.0/0 สถานะ ใหม่ ก่อตั้งแล้ว tcp dpt:5679 ...

หากนั่นยังไม่พอ

นี่เป็นเพียงการตั้งค่าพื้นฐาน นอกจากนี้ คุณยังสามารถกำหนดค่าได้

  • ไฟร์วอลล์ (iptables)