Hardening SSH บน VPS ให้ปลอดภัยสุดขีด
SSH คือประตูหลักของ VPS ทุกเครื่อง และเป็นเป้าหมายแรกที่ bot และ hacker จะพยายามเจาะ ถ้าดูจาก log จะเห็น login attempt วันละหลายพันครั้ง บทความนี้ปิดช่องโหว่ทีละจุดอย่างเป็นระบบ
1. เปลี่ยน Port จาก 22
Port 22 คือ default ที่ bot scan ตลอดเวลา เปลี่ยนเป็นเลขอื่นช่วยลด noise ได้มาก
# แก้ไฟล์ sshd_config
nano /etc/ssh/sshd_config
# หาบรรทัด Port แล้วเปลี่ยน
Port 2222 # หรือเลขที่ต้องการ 1024–65535
ufw allow 2222/tcp
systemctl reload sshd
2. ปิด Root Login
# ใน sshd_config
PermitRootLogin no
ต้อง login ด้วย user ปกติก่อนแล้วค่อย sudo ขึ้น root แทน
3. ใช้ Key-Based Authentication แทน Password
# สร้าง key pair บนเครื่องตัวเอง (ไม่ใช่ VPS)
ssh-keygen -t ed25519 -C "myserver"
# Copy public key ไป VPS
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-vps-ip
หลังจาก test login ด้วย key สำเร็จแล้วค่อยปิด password auth:
# ใน sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
4. จำกัด User ที่ SSH ได้
# ใน sshd_config — ระบุชื่อ user ที่อนุญาตเท่านั้น
AllowUsers deploy admin
5. ตั้ง Idle Timeout
# ใน sshd_config
ClientAliveInterval 300
ClientAliveCountMax 2
Session ที่ไม่มี activity 10 นาทีจะถูกตัดอัตโนมัติ
6. ปิด X11 Forwarding และ Features ที่ไม่ใช้
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
PrintMotd no
7. ตั้ง Login Grace Time และ Max Retries
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 5
8. ใช้ Ed25519 แทน RSA
Ed25519 ปลอดภัยกว่าและเร็วกว่า RSA 2048/4096 ถ้ายังใช้ RSA อยู่ให้ regenerate:
ssh-keygen -t ed25519 -a 100
Reload และตรวจสอบ Config
# ตรวจ syntax ก่อน reload
sshd -t
# Reload
systemctl reload sshd
# ดู status
systemctl status sshd
VPS ที่ดีกับ Hosting ที่น่าเชื่อถือ
การ hardening SSH ช่วยได้มาก แต่ถ้าอยากได้ VPS ที่มี infrastructure ที่แข็งแกร่งตั้งแต่ต้น เช่า VPS ไทย กับ asiagb มาพร้อม DDoS protection และ support ภาษาไทยตลอด 24 ชั่วโมง
นอกจาก SSH แล้ว ควรตรวจสอบสุขภาพโดเมนและ Security Headers ของเว็บด้วย ลองใช้ dnsxray.com ซึ่งตรวจได้ฟรีในหน้าเดียว ทั้ง SSL, DNS, HSTS และ response headers
สรุป Checklist
- เปลี่ยน Port จาก 22
- ปิด
PermitRootLogin - ใช้ key-based auth และปิด password login
- ตั้ง
AllowUsersระบุเฉพาะที่จำเป็น - ตั้ง idle timeout และ max retries
- ปิด feature ที่ไม่ใช้ (X11, TCP forwarding)
- ติดตั้ง Fail2ban คู่กัน
ตรวจสอบว่า SSH Hardening มีผล
# ตรวจ sshd config อีกครั้ง
sshd -T | grep -E "port|permitrootlogin|passwordauth|pubkeyauth|allowusers"
# ดู connection attempt ล่าสุด
grep "Failed password" /var/log/auth.log | tail -20
grep "Accepted publickey" /var/log/auth.log | tail -10
# ดูว่า brute force ลดลงไหม
grep "Invalid user" /var/log/auth.log | wc -l
แก้ปัญหาที่พบบ่อย
Error: "Connection refused" หลังเปลี่ยน SSH port
Firewall ยังไม่ได้เปิด port ใหม่ หรือ sshd ยังไม่ได้ reload:
# เปิด port ใหม่ใน UFW
ufw allow 2222/tcp
ufw status | grep 2222
# ตรวจว่า sshd listening บน port ใหม่
ss -tlnp | grep sshd
# ต้องเห็น :2222
# Reload sshd
systemctl reload sshd
Error: "Permission denied (publickey)" หลังปิด password auth
Key ยังไม่ได้ copy ไป VPS หรือ authorized_keys permission ผิด:
# ตรวจ authorized_keys
cat ~/.ssh/authorized_keys
# ต้องมี public key ของเครื่องตัวเอง
# ตรวจ permission (สำคัญมาก)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown USER:USER ~/.ssh ~/.ssh/authorized_keys
# ดู ssh debug ที่ฝั่ง client
ssh -v -p 2222 user@vps-ip
Error: "Too many authentication failures"
SSH client พยายาม key หลาย key จนเกิน MaxAuthTries:
# ระบุ key โดยตรงเมื่อ connect
ssh -i ~/.ssh/id_ed25519 -p 2222 user@vps-ip
# หรือแก้ ~/.ssh/config บนเครื่องตัวเอง
Host myserver
HostName vps-ip
Port 2222
User myuser
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ล็อกตัวเองออกจาก VPS ทั้งหมด (ไม่มี console access)
ต้องใช้ KVM/VNC console จาก VPS provider ซึ่งเชื่อมตรงกับ server ไม่ผ่าน SSH:
# ใน VPS provider console เข้า root แล้วแก้ sshd_config
# เปลี่ยน port กลับ หรือเพิ่ม password auth ชั่วคราว
PasswordAuthentication yes
systemctl restart sshd
คำถามที่พบบ่อย
เปลี่ยน SSH port ช่วยได้จริงไหม?
ช่วยลด noise ได้มากจาก bot ที่ scan แค่ port 22 แต่ไม่ใช่ security ที่แท้จริง การปิด password auth และใช้ key-based auth สำคัญกว่า เปลี่ยน port เป็น security-by-obscurity ที่เสริมมาตรการหลัก
จำเป็นต้องมีทั้ง SSH key และ Fail2ban ไหม?
ใช่ แนะนำทั้งคู่ SSH key ป้องกันไม่ให้ login ด้วย password ได้เลย Fail2ban block IP ที่ probe ซ้ำๆ ลด attack surface และ log noise ทั้งคู่ทำงานเสริมกัน
ถ้าทำงานจากหลาย IP เช่น ที่บ้านและที่ทำงาน ต้องทำยังไง?
ถ้าปิด password auth แล้วต้องมี private key บนทุกเครื่องที่จะใช้ login หรือใช้ SSH agent forwarding นอกจากนี้ตั้ง AllowUsers ระบุ user ที่อนุญาตแทนการจำกัด IP ที่เปลี่ยนบ่อย