การใช้ รหัสผ่าน (Password) Login เข้า VPS ทุกวันนี้ถือว่าเสี่ยงมาก เพราะ Bot ทั่วโลกสแกนหาเซิร์ฟเวอร์เปิด Port 22 และพยายาม Brute Force ตลอด 24 ชั่วโมง วิธีแก้ที่ดีที่สุดคือการเปลี่ยนไปใช้ SSH Key Authentication — วิธีนี้ไม่มี Password ให้เดา จึงทำให้การโจมตีแบบ Brute Force เป็นไปไม่ได้เลย
SSH Key Authentication คือระบบพิสูจน์ตัวตนที่ใช้ คู่กุญแจเข้ารหัส (Cryptographic Key Pair) ประกอบด้วย:
~/.ssh/authorized_keysเมื่อเชื่อมต่อ เซิร์ฟเวอร์จะส่ง Challenge มาให้ เครื่องของคุณตอบโดยใช้ Private Key เซิร์ฟเวอร์ยืนยันด้วย Public Key — ทั้งกระบวนการไม่มีการส่ง Password ผ่านเครือข่ายเลย
RSA 4096-bit และ Ed25519 โดย Ed25519 ถือว่าดีกว่าในแง่ความปลอดภัยและความเร็ว
| หัวข้อเปรียบเทียบ | Password Login | SSH Key Login |
|---|---|---|
| ความปลอดภัยจาก Brute Force | ❌ เสี่ยงสูง | ✅ ไม่สามารถเดาได้ |
| ความสะดวกในการใช้งาน | ต้องพิมพ์ password ทุกครั้ง | ✅ ไม่ต้องพิมพ์ (ใช้ Agent) |
| ความเสี่ยง Phishing | ❌ Password ถูกขโมยได้ | ✅ Key ไม่ส่งผ่านเครือข่าย |
| การใช้หลายเซิร์ฟเวอร์ | ต้องจำหลาย Password | ✅ ใช้ Key เดียวได้หลายเซิร์ฟเวอร์ |
| การ Audit Log | ยากต่อการติดตาม | ✅ ระบุได้ว่าใคร Login |
| ความต้านทาน Man-in-the-Middle | ❌ เสี่ยงถ้า TOFU พัง | ✅ Host Key Pinning ป้องกันได้ |
ข้อมูลจาก Shodan พบว่าเซิร์ฟเวอร์ที่เปิด SSH ด้วย Password เฉลี่ยถูกโจมตีหลายพันครั้งต่อวัน การเปลี่ยนเป็น SSH Key ปิดช่องโหว่นี้ได้ทันที
กระบวนการ Authentication ด้วย SSH Key เป็นแบบ Asymmetric Cryptography:
authorized_keysรันคำสั่งสร้าง Ed25519 Key (แนะนำสำหรับ 2026):
ssh-keygen -t ed25519 -C "[email protected]"
หรือถ้าต้องการ RSA 4096:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
Enter file in which to save the key (/home/user/.ssh/id_ed25519): [กด Enter]
Enter passphrase (empty for no passphrase): [ใส่ passphrase หรือกด Enter ข้าม]
Enter same passphrase again: [ยืนยัน passphrase]
แนะนำใส่ Passphrase ด้วย — ถ้ามีคนได้ไฟล์ Private Key ไป ยังต้องรู้ Passphrase อีกชั้น
~/.ssh/id_ed25519 # Private Key — เก็บไว้บนเครื่องคุณ เท่านั้น
~/.ssh/id_ed25519.pub # Public Key — ส่งขึ้นเซิร์ฟเวอร์
ดู Public Key ของคุณด้วยคำสั่ง:
cat ~/.ssh/id_ed25519.pub
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@your-vps-ip
คำสั่งนี้จะ Login ด้วย Password ครั้งสุดท้าย แล้วคัดลอก Public Key ไปใส่ที่ ~/.ssh/authorized_keys บนเซิร์ฟเวอร์โดยอัตโนมัติ
# 1. ดู Public Key บนเครื่อง
cat ~/.ssh/id_ed25519.pub
# 2. Login เข้าเซิร์ฟเวอร์
ssh username@your-vps-ip
# 3. สร้างไดเรกทอรีและไฟล์ (ถ้ายังไม่มี)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 4. วาง Public Key
echo "ตัวอย่าง: ssh-ed25519 AAAA...xxx [email protected]" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# เปิด Terminal ใหม่ แล้วทดสอบ
ssh -i ~/.ssh/id_ed25519 username@your-vps-ip
ถ้า Login สำเร็จโดยไม่ต้องพิมพ์ Password (หรือแค่ Passphrase ของ Key) แสดงว่าพร้อมแล้ว
แก้ไขไฟล์ /etc/ssh/sshd_config บนเซิร์ฟเวอร์:
sudo nano /etc/ssh/sshd_config
ตรวจสอบและตั้งค่าดังนี้:
# ยืนยันว่า Public Key Auth เปิดอยู่
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# ห้าม Login ด้วย Root โดยตรง
PermitRootLogin no
# จำนวน Auth Attempt สูงสุด
MaxAuthTries 3
# เปลี่ยน Port (ไม่บังคับ แต่ช่วยลด Bot Noise)
# Port 2222
# ปิด X11 Forwarding (ถ้าไม่ใช้)
X11Forwarding no
ขั้นตอนนี้สำคัญมาก — ทำหลังจาก ทดสอบ SSH Key Login สำเร็จแล้วเท่านั้น
# ใน /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
บันทึกไฟล์แล้ว Restart SSH Service:
# Ubuntu/Debian
sudo systemctl restart ssh
# CentOS/Rocky Linux
sudo systemctl restart sshd
ทดสอบด้วย Terminal ใหม่อีกครั้งว่ายัง Login ได้ — และลองว่าการ Login แบบ Password ถูกปฏิเสธหรือไม่:
ssh -o PasswordAuthentication=yes username@your-vps-ip
# ควรได้ข้อความ: Permission denied (publickey)
# เปิด PowerShell แล้วรัน
ssh-keygen -t ed25519
# ดู Public Key
type $env:USERPROFILE\.ssh\id_ed25519.pub
# คัดลอกไปเซิร์ฟเวอร์
ssh-copy-id -i $env:USERPROFILE\.ssh\id_ed25519.pub username@your-vps-ip
authorized_keys บนเซิร์ฟเวอร์.ppk.ppkเมื่อต้องการใช้หลาย Key สำหรับหลายเซิร์ฟเวอร์ ใช้ไฟล์ ~/.ssh/config:
# ~/.ssh/config
Host my-vps-th
HostName 203.0.113.10
User ubuntu
IdentityFile ~/.ssh/id_ed25519_vps_th
Host my-vps-sg
HostName 198.51.100.20
User root
IdentityFile ~/.ssh/id_ed25519_vps_sg
Port 2222
จากนั้น Login ด้วยชื่อ Alias ได้เลย:
ssh my-vps-th
ssh my-vps-sg
# เริ่ม SSH Agent
eval "$(ssh-agent -s)"
# เพิ่ม Key เข้า Agent
ssh-add ~/.ssh/id_ed25519
# ตรวจสอบ Key ที่โหลดแล้ว
ssh-add -l
| ปัญหา | สาเหตุ | วิธีแก้ |
|---|---|---|
| Permission denied (publickey) | ไม่พบ Key หรือ authorized_keys ผิด Permission | chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys |
| Bad permissions on .ssh | Permission ไดเรกทอรีไม่ถูกต้อง | chmod 700 ~/.ssh |
| Host key verification failed | Host Key เปลี่ยน (เซิร์ฟเวอร์ถูก Re-provision) | ssh-keygen -R your-vps-ip |
| Connection refused | SSH Service ไม่ทำงาน หรือ Firewall บล็อก Port | ตรวจ sudo systemctl status ssh และ Firewall |
| Warning: Unprotected private key | Permission ไฟล์ Private Key กว้างเกิน | chmod 600 ~/.ssh/id_ed25519 |
# เพิ่ม -v ดู Log ละเอียด
ssh -v username@your-vps-ip
# -vvv สำหรับ Debug เต็มรูปแบบ
ssh -vvv username@your-vps-ip
~/.ssh/authorized_keys (แต่ละ Key อยู่บรรทัดแยก) เมื่อต้องการยกเลิกสิทธิ์ลบบรรทัด Public Key ของคนนั้นออก และ Reload SSH Serviceการตั้งค่า SSH Key Authentication บน VPS เป็นขั้นตอนพื้นฐานที่ควรทำทันทีหลังได้ VPS มา มีประโยชน์ดังนี้: