SSH terminal security hardening

Hardening SSH บน VPS ให้ปลอดภัยสุดขีด

มิถุนายน 2026 · อ่าน 8 นาที

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
ก่อน reload: เปิด port ใหม่ใน firewall ก่อน และเปิด terminal อีกหน้าต่างทิ้งไว้ ถ้า SSH session ปัจจุบันถูกตัดจะได้เข้าได้
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
ใช้คู่กัน Fail2ban: SSH hardening ป้องกันในระดับ config แต่ควรติดตั้ง Fail2ban ด้วยเพื่อ ban IP ที่ login ผิดซ้ำๆ โดยอัตโนมัติ

VPS ที่ดีกับ Hosting ที่น่าเชื่อถือ

การ hardening SSH ช่วยได้มาก แต่ถ้าอยากได้ VPS ที่มี infrastructure ที่แข็งแกร่งตั้งแต่ต้น เช่า VPS ไทย กับ asiagb มาพร้อม DDoS protection และ support ภาษาไทยตลอด 24 ชั่วโมง

นอกจาก SSH แล้ว ควรตรวจสอบสุขภาพโดเมนและ Security Headers ของเว็บด้วย ลองใช้ dnsxray.com ซึ่งตรวจได้ฟรีในหน้าเดียว ทั้ง SSL, DNS, HSTS และ response headers


สรุป Checklist

ตรวจสอบว่า 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
ก่อน logout session ปัจจุบัน: เปิด terminal ใหม่ทดสอบ SSH เข้าได้จาก port ใหม่ก่อนเสมอ อย่าปิด session เก่าจนกว่าจะมั่นใจว่าเข้าได้

แก้ปัญหาที่พบบ่อย

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 ที่เปลี่ยนบ่อย