การป้องกันเซิร์ฟเวอร์ Linux จะทำอะไรก่อน

การป้องกันเซิร์ฟเวอร์ Linux จะทำอะไรก่อน
Habib M'henni/วิกิมีเดียคอมมอนส์, CC BY-SA

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

Содержание

ผู้ใช้ที่ไม่ใช่รูท

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

ดังนั้น คุณต้องสร้างผู้ใช้รายอื่น และปิดใช้งานการดูแลระบบระยะไกลผ่าน SSH สำหรับรูท

ผู้ใช้ใหม่เริ่มต้นโดยคำสั่ง useradd:

useradd [options] <username>

จากนั้นเพิ่มรหัสผ่านด้วยคำสั่ง passwd:

passwd <username>

สุดท้าย ผู้ใช้รายนี้จำเป็นต้องเพิ่มลงในกลุ่มที่มีสิทธิ์ดำเนินการคำสั่งยกระดับ sudo. ขึ้นอยู่กับการกระจาย Linux กลุ่มเหล่านี้อาจเป็นกลุ่มที่แตกต่างกัน ตัวอย่างเช่น ใน CentOS และ Red Hat ผู้ใช้จะถูกเพิ่มลงในกลุ่ม wheel:

usermod -aG wheel <username>

ใน Ubuntu จะถูกเพิ่มเข้าในกลุ่ม sudo:

usermod -aG sudo <username>

คีย์แทนรหัสผ่าน SSH

การบังคับเดรัจฉานหรือการรั่วไหลของรหัสผ่านเป็นเวกเตอร์การโจมตีมาตรฐาน ดังนั้นจึงเป็นการดีที่สุดที่จะปิดใช้งานการตรวจสอบรหัสผ่านใน SSH (Secure Shell) และใช้การตรวจสอบสิทธิ์ด้วยคีย์แทน

มีโปรแกรมต่าง ๆ สำหรับการนำโปรโตคอล SSH ไปใช้ เช่น ครับ и ดรอปแบร์แต่ที่นิยมมากที่สุดคือ OpenSSH การติดตั้งไคลเอนต์ OpenSSH บน Ubuntu:

sudo apt install openssh-client

การติดตั้งเซิร์ฟเวอร์:

sudo apt install openssh-server

การเริ่มต้น SSH daemon (sshd) บนเซิร์ฟเวอร์ Ubuntu:

sudo systemctl start sshd

เริ่ม daemon โดยอัตโนมัติในทุกการบู๊ต:

sudo systemctl enable sshd

ควรสังเกตว่าส่วนเซิร์ฟเวอร์ของ OpenSSH รวมถึงส่วนไคลเอนต์ นั่นคือผ่าน openssh-server คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์อื่นได้ ยิ่งไปกว่านั้น จากเครื่องไคลเอนต์ของคุณ คุณสามารถเริ่มอุโมงค์ SSH จากเซิร์ฟเวอร์ระยะไกลไปยังโฮสต์ของบุคคลที่สาม จากนั้นโฮสต์ของบุคคลที่สามจะถือว่าเซิร์ฟเวอร์ระยะไกลเป็นแหล่งที่มาของคำขอ คุณลักษณะที่มีประโยชน์มากสำหรับการปกปิดระบบของคุณ ดูบทความสำหรับรายละเอียด "เคล็ดลับการปฏิบัติ ตัวอย่าง และอุโมงค์ SSH".

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

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

ssh-keygen -t rsa

รหัสสาธารณะถูกเก็บไว้ในไฟล์ .pub และดูเหมือนสตริงของอักขระสุ่มที่ขึ้นต้นด้วย ssh-rsa.

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJzTX7J6zsCrywcjAM/7Kq3O9ZIvDw2OFOSXAFVqilSFNkHlefm1iMtPeqsIBp2t9cbGUf55xNDULz/bD/4BCV43yZ5lh0cUYuXALg9NI29ui7PEGReXjSpNwUD6ceN/78YOK41KAcecq+SS0bJ4b4amKZIJG3JWm49NWvoo0hdM71sblF956IXY3cRLcTjPlQ84mChKL1X7+D645c7O4Z1N3KtL7l5nVKSG81ejkeZsGFzJFNqvr5DuHdDL5FAudW23me3BDmrM9ifUmt1a00mWci/1qUlaVFft085yvVq7KZbF2OP2NQACUkwfwh+iSTP username@hostname

จากนั้น สร้างไดเร็กทอรี SSH บนเซิร์ฟเวอร์ในไดเร็กทอรีโฮมของผู้ใช้ จากภายใต้รูท และเพิ่มคีย์สาธารณะ SSH ลงในไฟล์ authorized_keysโดยใช้โปรแกรมแก้ไขข้อความเช่น Vim:

mkdir -p /home/user_name/.ssh && touch /home/user_name/.ssh/authorized_keys

vim /home/user_name/.ssh/authorized_keys

สุดท้าย ตั้งค่าการอนุญาตที่ถูกต้องสำหรับไฟล์:

chmod 700 /home/user_name/.ssh && chmod 600 /home/user_name/.ssh/authorized_keys

และเปลี่ยนความเป็นเจ้าของให้กับผู้ใช้รายนี้:

chown -R username:username /home/username/.ssh

ในฝั่งไคลเอ็นต์ คุณต้องระบุตำแหน่งของรหัสลับสำหรับการตรวจสอบสิทธิ์:

ssh-add DIR_PATH/keylocation

ตอนนี้คุณสามารถเข้าสู่เซิร์ฟเวอร์โดยใช้ชื่อผู้ใช้โดยใช้คีย์นี้:

ssh [username]@hostname

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

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

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

บน CentOS/Red Hat เราพบบรรทัด PermitRootLogin yes ในไฟล์คอนฟิก /etc/ssh/sshd_config และเปลี่ยน:

PermitRootLogin no

บน Ubuntu ให้เพิ่มบรรทัด PermitRootLogin no ไปยังไฟล์ปรับแต่ง 10-my-sshd-settings.conf:

sudo echo "PermitRootLogin no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf

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

บน CentOS/Red Hat เราพบบรรทัด PasswordAuthentication yes ในไฟล์คอนฟิก /etc/ssh/sshd_config และเปลี่ยนดังนี้:

PasswordAuthentication no

บน Ubuntu ให้เพิ่มบรรทัด PasswordAuthentication no เพื่อยื่น 10-my-sshd-settings.conf:

sudo echo "PasswordAuthentication no" >> /etc/ssh/sshd_config.d/10-my-sshd-settings.conf

สำหรับคำแนะนำในการเปิดใช้งานการยืนยันตัวตนแบบสองปัจจัยผ่าน SSH โปรดดู ที่นี่.

ไฟร์วอลล์

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

ก่อนติดตั้งไฟร์วอลล์ คุณต้องแน่ใจว่า SSH รวมอยู่ในรายการการยกเว้น และจะไม่ถูกบล็อก มิฉะนั้นหลังจากเริ่มไฟร์วอลล์แล้ว เราจะไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้

การแจกจ่าย Ubuntu มาพร้อมกับไฟร์วอลล์ที่ไม่ซับซ้อน (ufw) และด้วย CentOS/Red Hat - firewalld.

การอนุญาต SSH ในไฟร์วอลล์บน Ubuntu:

sudo ufw allow ssh

บน CentOS/Red Hat ให้ใช้คำสั่ง firewall-cmd:

sudo firewall-cmd --zone=public --add-service=ssh --permanent

หลังจากขั้นตอนนี้ คุณสามารถเริ่มไฟร์วอลล์ได้

บน CentOS/Red Hat ให้เริ่มบริการ systemd สำหรับไฟร์วอลล์:

sudo systemctl start firewalld
sudo systemctl enable firewalld

บน Ubuntu เราใช้คำสั่งต่อไปนี้:

sudo ufw enable

Fail2Ban

บริการ Fail2Ban วิเคราะห์บันทึกบนเซิร์ฟเวอร์และนับจำนวนความพยายามในการเข้าถึงจากแต่ละที่อยู่ IP การตั้งค่าระบุกฎสำหรับจำนวนความพยายามในการเข้าถึงที่อนุญาตในช่วงเวลาหนึ่ง - หลังจากนั้นที่อยู่ IP นี้จะถูกบล็อกตามระยะเวลาที่กำหนด ตัวอย่างเช่น อนุญาตให้พยายามตรวจสอบสิทธิ์ SSH ที่ล้มเหลว 5 ครั้งภายใน 2 ชั่วโมง จากนั้นบล็อกที่อยู่ IP ที่กำหนดเป็นเวลา 12 ชั่วโมง

การติดตั้ง Fail2Ban บน CentOS และ Red Hat:

sudo yum install fail2ban

การติดตั้งบน Ubuntu และ Debian:

sudo apt install fail2ban

ปล่อย:

systemctl start fail2ban
systemctl enable fail2ban

โปรแกรมมีไฟล์การกำหนดค่าสองไฟล์: /etc/fail2ban/fail2ban.conf и /etc/fail2ban/jail.conf. มีการระบุข้อจำกัดการแบนในไฟล์ที่สอง

คุกสำหรับ SSH เปิดใช้งานโดยค่าเริ่มต้นด้วยการตั้งค่าเริ่มต้น (5 ครั้ง, เว้น 10 นาที, แบน 10 นาที)

[ค่าเริ่มต้น] เพิกเฉยคำสั่ง = bantime = 10m findtime = 10m maxretry = 5

นอกจาก SSH แล้ว Fail2Ban ยังสามารถปกป้องบริการอื่นๆ บนเว็บเซิร์ฟเวอร์ nginx หรือ Apache

อัปเดตความปลอดภัยอัตโนมัติ

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

บนเซิร์ฟเวอร์ Ubuntu การอัปเดตความปลอดภัยอัตโนมัติจะเปิดใช้งานตามค่าเริ่มต้น ดังนั้นจึงไม่จำเป็นต้องดำเนินการใดๆ เพิ่มเติม

บน CentOS/Red Hat คุณต้องติดตั้งแอปพลิเคชัน dnf-อัตโนมัติ และเปิดเครื่องจับเวลา:

sudo dnf upgrade
sudo dnf install dnf-automatic -y
sudo systemctl enable --now dnf-automatic.timer

ตรวจสอบตัวจับเวลา:

sudo systemctl status dnf-automatic.timer

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

SSH ได้รับการพัฒนาในปี 1995 เพื่อแทนที่ telnet (พอร์ต 23) และ ftp (พอร์ต 21) ดังนั้นผู้เขียนโปรแกรม Tatu Iltonen เลือกพอร์ต 22 ตามค่าเริ่มต้นและได้รับการรับรองจาก IANA

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

การเปลี่ยนพอร์ตมาตรฐาน - ทำให้ยุ่งเหยิง - หลายครั้งช่วยลดปริมาณการรับส่งข้อมูลขยะ ขนาดของบันทึกและโหลดบนเซิร์ฟเวอร์ และยังลดพื้นผิวการโจมตีด้วย แม้ว่าบางคน วิจารณ์วิธีการ “ป้องกันโดยปิดบัง” เช่นนี้ (ความปลอดภัยผ่านความสับสน) เหตุผลก็คือเทคนิคนี้ตรงข้ามกับพื้นฐาน การป้องกันทางสถาปัตยกรรม. ตัวอย่างเช่น US National Institute of Standards and Technology in "คู่มือการรักษาความปลอดภัยของเซิร์ฟเวอร์" ระบุถึงความต้องการสถาปัตยกรรมเซิร์ฟเวอร์แบบเปิด: "ความปลอดภัยของระบบไม่ควรขึ้นอยู่กับความลับของการนำส่วนประกอบต่างๆ ไปใช้" เอกสารระบุ

ในทางทฤษฎี การเปลี่ยนพอร์ตดีฟอลต์ขัดต่อหลักปฏิบัติของสถาปัตยกรรมแบบเปิด แต่ในทางปฏิบัติ ปริมาณการรับส่งข้อมูลที่เป็นอันตรายจะลดลงจริง ๆ ดังนั้นนี่จึงเป็นมาตรการที่ง่ายและมีประสิทธิภาพ

หมายเลขพอร์ตสามารถกำหนดค่าได้โดยการเปลี่ยนคำสั่ง Port 22 ในไฟล์คอนฟิก / etc / SSH / sshd_config. นอกจากนี้ยังระบุด้วยพารามิเตอร์ -p <port> в sshd. ไคลเอนต์ SSH และโปรแกรม SFTP ยังสนับสนุนตัวเลือก -p <port>.

พารามิเตอร์ -p <port> สามารถใช้ระบุหมายเลขพอร์ตเมื่อเชื่อมต่อด้วยคำสั่ง ssh ในลินุกซ์ ใน SFTP и scp ใช้พารามิเตอร์ -P <port> (ป.). คำสั่งบรรทัดคำสั่งแทนที่ค่าใด ๆ ในไฟล์คอนฟิกูเรชัน

หากมีเซิร์ฟเวอร์หลายตัว การกระทำเหล่านี้เกือบทั้งหมดเพื่อปกป้องเซิร์ฟเวอร์ Linux สามารถทำได้โดยอัตโนมัติในสคริปต์ แต่ถ้ามีเซิร์ฟเวอร์เพียงเครื่องเดียว จะเป็นการดีกว่าที่จะควบคุมกระบวนการด้วยตนเอง

เป็นโฆษณา

สั่งซื้อและเริ่มต้นได้ทันที! การสร้าง VDS การกำหนดค่าใด ๆ และกับระบบปฏิบัติการใด ๆ ภายในหนึ่งนาที การกำหนดค่าสูงสุดจะช่วยให้คุณใช้งานได้อย่างเต็มที่ - 128 คอร์ CPU, 512 GB RAM, 4000 GB NVMe มหากาพย์🙂

การป้องกันเซิร์ฟเวอร์ Linux จะทำอะไรก่อน

ที่มา: will.com