เช่าเซิร์ฟเวอร์มาใหม่ ตั้งค่า SSH ให้ปลอดภัยใน 7 ขั้นตอน
ทำทันทีหลังได้เซิร์ฟเวอร์ Ubuntu ใหม่ สร้างผู้ใช้ ใช้คีย์แทนรหัสผ่าน ปิดล็อกอิน root เปิดไฟร์วอลล์ fail2ban และอัปเดตอัตโนมัติ พร้อมกับดักที่หลายคนพลาด
- ใช้คีย์ SSH แทนรหัสผ่าน และปิดการล็อกอินด้วยรหัสผ่าน
- ไม่ล็อกอินเป็น root ตรง ๆ ใช้ผู้ใช้ทั่วไปที่มีสิทธิ์ sudo
- เปิดไฟร์วอลล์ให้ผ่านเฉพาะพอร์ตที่ใช้
- ไฟล์ใน sshd_config.d สามารถทับค่าที่ตั้งไว้ได้ ต้องเช็คค่าที่ใช้งานจริงทุกครั้ง
เซิร์ฟเวอร์ที่เปิดพอร์ต SSH บนอินเทอร์เน็ตจะโดนบอทลองเดารหัสผ่านภายในไม่กี่นาทีหลังเปิดเครื่อง ไม่ได้เพราะใครเล็งเรามา แต่เพราะบอทสแกนทุกหมายเลข IP อยู่ตลอดเวลา 7 ขั้นตอนนี้ปิดช่องทางที่บอทใช้ได้เกือบทั้งหมด ทำครั้งเดียวจบ ใช้เวลาไม่ถึง 20 นาที
ตัวอย่างทั้งหมดใช้ Ubuntu 22.04 และ 24.04
1. สร้างผู้ใช้สำหรับทำงาน
ไม่ควรทำงานประจำด้วย root เพราะพิมพ์ผิดคำสั่งเดียวพังได้ทั้งเครื่อง
adduser dev
usermod -aG sudo dev
2. สร้างคีย์ SSH บนเครื่องเรา แล้วส่งขึ้นเซิร์ฟเวอร์
ทำบนคอมพิวเตอร์ของเรา ไม่ใช่บนเซิร์ฟเวอร์
ssh-keygen -t ed25519 -C "my-laptop"
ssh-copy-id dev@IP_เซิร์ฟเวอร์
บน Windows ไม่มีคำสั่ง ssh-copy-id ใช้คำสั่งนี้ใน PowerShell แทน
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh dev@IP_เซิร์ฟเวอร์ "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
chmod ท้ายคำสั่งสำคัญ ถ้าไฟล์คีย์เขียนได้โดยคนอื่น SSH จะไม่ยอมใช้คีย์นั้นโดยไม่บอกเหตุผล
ลอง ssh dev@IP_เซิร์ฟเวอร์ ถ้าเข้าได้โดยไม่ถามรหัสผ่านของเซิร์ฟเวอร์ แปลว่าคีย์ใช้งานได้ ห้ามข้ามขั้นนี้ เพราะขั้นต่อไปจะปิดการล็อกอินด้วยรหัสผ่าน
3. ปิดรหัสผ่านและปิดล็อกอิน root
สร้างไฟล์ตั้งค่าของเราเองใน /etc/ssh/sshd_config.d/
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
ตั้งชื่อไฟล์ขึ้นต้นด้วย 00 เพราะ SSH ใช้ค่าแรกที่เจอ และอ่านไฟล์ในโฟลเดอร์นี้ตามลำดับชื่อ
4. กับดัก: ไฟล์ของ cloud-init ทับค่าเรา
เซิร์ฟเวอร์จากผู้ให้บริการคลาวด์หลายเจ้ามีไฟล์ 50-cloud-init.conf ที่ตั้ง PasswordAuthentication yes ไว้ ถ้าไฟล์เราชื่อขึ้นหลังมัน ค่าของเราจะไม่มีผล ให้เช็คค่าที่ใช้งานจริงเสมอ
sudo sshd -t
sudo sshd -T | grep -E 'passwordauthentication|permitrootlogin|kbdinteractive'
ต้องเห็น passwordauthentication no และ permitrootlogin no ถ้ายังเป็น yes ให้ดูไฟล์อื่นในโฟลเดอร์ sshd_config.d
แล้วโหลดค่าใหม่
sudo systemctl reload ssh
อย่าเพิ่งปิดหน้าต่างเดิม เปิดหน้าต่างใหม่แล้วลองล็อกอิน ถ้าเข้าได้ค่อยปิดหน้าต่างเก่า
5. เปิดไฟร์วอลล์เฉพาะพอร์ตที่ใช้
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full' # ถ้าเป็นเว็บเซิร์ฟเวอร์
sudo ufw enable
sudo ufw status
ต้องอนุญาต OpenSSH ก่อน enable เสมอ ไม่อย่างนั้นจะตัดการเชื่อมต่อตัวเอง
6. fail2ban บล็อก IP ที่เดารหัสซ้ำ ๆ
sudo apt install fail2ban
sudo fail2ban-client status sshd
บน Ubuntu ตัวติดตั้งเปิดการป้องกัน SSH ให้แล้ว คำสั่งที่สองใช้ดูว่าบล็อก IP ไปกี่ตัว
7. อัปเดตความปลอดภัยอัตโนมัติ
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
เลือก Yes ระบบจะติดตั้งแพตช์ความปลอดภัยให้เองทุกวัน
สรุปเช็คลิสต์
| ขั้น | เช็คยังไง |
|---|---|
| ล็อกอินด้วยคีย์ | ssh dev@IP เข้าได้โดยไม่ถามรหัสเซิร์ฟเวอร์ |
| ปิดรหัสผ่านและ root | sudo sshd -T เห็น no ทั้งสองค่า |
| ไฟร์วอลล์ | sudo ufw status เห็นแค่พอร์ตที่ใช้ |
| fail2ban | sudo fail2ban-client status sshd ทำงานอยู่ |
| อัปเดตอัตโนมัติ | ไฟล์ /etc/apt/apt.conf.d/20auto-upgrades มีค่าเป็น 1 |
คำถามที่พบบ่อย
เปลี่ยนพอร์ต SSH จาก 22 ช่วยให้ปลอดภัยขึ้นไหม
ช่วยลดการสแกนอัตโนมัติที่รกล็อก แต่ไม่ได้ทำให้ปลอดภัยขึ้นจริง ความปลอดภัยมาจากการใช้คีย์และปิดรหัสผ่าน ถ้าเปลี่ยนพอร์ตต้องเปิดพอร์ตใหม่ในไฟร์วอลล์ก่อนเสมอ
ถ้าล็อกตัวเองออกจากเซิร์ฟเวอร์แล้วทำยังไง
ผู้ให้บริการส่วนใหญ่มีคอนโซลผ่านหน้าเว็บ เช่น Recovery Console หรือ Droplet Console ใช้เข้าไปแก้ไฟล์ตั้งค่าได้ จึงควรรู้ไว้ก่อนว่าเข้าตรงไหน
คำสั่งและค่าตั้งในบทความทดสอบบนระบบตัวอย่าง ลองบนเครื่องทดสอบก่อนใช้กับระบบจริงเสมอ