ความปลอดภัย VPS เบื้องต้น ที่ต้องทำทันทีหลังเปิดเครื่องครั้งแรก
ซื้อ VPS มาแล้ว login เข้าครั้งแรก สิ่งที่หลายคนทำคือลงเว็บเซิร์ฟเวอร์แล้วจบ แต่นั่นคือความผิดพลาดที่อันตราย บทความนี้รวมขั้นตอนพื้นฐานที่ควรทำก่อนทุกอย่าง
1. เปลี่ยน SSH Port จาก 22
Port 22 คือ default ของ SSH บอททั่วโลก scan และลองเดา password ตลอด 24 ชั่วโมง เปลี่ยน port ไม่ได้ทำให้ปลอดภัย 100% แต่ลด noise ได้มาก
nano /etc/ssh/sshd_config
# แก้บรรทัด: Port 22 → Port 2222
systemctl restart sshd
จากนั้นเปิด port ใหม่ในไฟร์วอลล์ก่อน logout ออก ไม่งั้นจะเข้าเครื่องไม่ได้
2. ปิดการ login ด้วย root โดยตรง
สร้าง user ใหม่แล้วให้สิทธิ์ sudo แทน
adduser myuser
usermod -aG sudo myuser
จากนั้นใน sshd_config แก้:
PermitRootLogin no
3. ใช้ SSH Key แทน Password
Password แม้ซับซ้อนก็ยังถูก brute force ได้ SSH Key ปลอดภัยกว่าเพราะเป็น cryptographic key pair
บนเครื่องของตัวเอง:
ssh-keygen -t ed25519 -C "my-vps-key"
ssh-copy-id -p 2222 myuser@your-server-ip
หลังทดสอบ login ด้วย key ได้แล้ว ปิด password login:
PasswordAuthentication no
4. ตั้งค่า Firewall ด้วย UFW
apt install ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp # SSH port ใหม่
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
ufw enable
5. ติดตั้ง Fail2ban
Fail2ban คอย ban IP ที่ login ผิดซ้ำ ๆ โดยอัตโนมัติ
apt install fail2ban
systemctl enable fail2ban
systemctl start fail2ban
ตรวจสอบสถานะ:
fail2ban-client status sshd
6. อัปเดต Package สม่ำเสมอ
apt update && apt upgrade -y
ตั้ง unattended-upgrades เพื่ออัปเดต security patch อัตโนมัติ:
apt install unattended-upgrades
dpkg-reconfigure unattended-upgrades
สิ่งที่ไม่ควรทำ
- ใช้ password เดิมจาก provider (มักจะสั้นหรือถูก brute force ได้ง่าย)
- เปิด port 3306 (MySQL) หรือ 5432 (PostgreSQL) ออก internet โดยตรง
- ติดตั้ง PhpMyAdmin บน path
/phpmyadminซึ่งเป็นจุดแรกที่บอทจะมาลอง - ปล่อยให้ root password เป็นค่าที่ provider ส่งมา ควรเปลี่ยนทันที
- เปิด port ทุกอย่างใน UFW แบบ allow all แล้วค่อยปิดทีหลัง (ควรทำกลับกัน: deny all ก่อนแล้วค่อย allow เฉพาะที่จำเป็น)
7. ตรวจสอบ Log หาสัญญาณผิดปกติ
แม้จะ harden แล้ว ควรตรวจ log เป็นระยะเพื่อดูว่ามีอะไรผิดปกติ:
# ดู failed login attempts ล่าสุด
journalctl -u sshd | grep "Failed\|Invalid\|error" | tail -20
# ดู IP ที่ถูก ban โดย Fail2ban
fail2ban-client status sshd
# ดู auth log
tail -50 /var/log/auth.log | grep -i "fail\|invalid\|error"
# ดู process ที่รันอยู่ทั้งหมด หาอะไรแปลก ๆ
ps aux --sort=-%cpu | head -20
logwatch เพื่อรับสรุป log รายวันทาง email อัตโนมัติ ไม่ต้องเข้ามา ssh ดูเองทุกวัน8. Security Headers สำหรับ Web Server
ถ้ารัน web service ควรเพิ่ม security headers ที่ Nginx หรือ Apache:
# ใน Nginx server block
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
ตรวจสอบ security headers ด้วย dnsxray.com ฟรีในหน้าเดียว
แก้ปัญหาที่พบบ่อย
SSH ไม่ยอมรับ key และยังต้องใส่ password
ปัญหามักเกิดจาก permission ของไฟล์ไม่ถูกต้อง:
# ตรวจสอบ permission
ls -la ~/.ssh/
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# ตรวจสอบ SSH log ว่า error อะไร
journalctl -u sshd -n 30
UFW enable แล้ว SSH ขาด กลับเข้าไม่ได้
ต้อง allow SSH port ก่อน enable UFW เสมอ ถ้าเกิดแล้วต้องใช้ console ของ provider (KVM console, VNC, SolusVM) เข้าไปแก้:
ufw allow 2222/tcp # หรือ port ที่ใช้
ufw status # ตรวจก่อน
ufw enable # enable หลังสุด
Fail2ban ไม่ ban IP ทั้งที่ login ผิดซ้ำๆ
ตรวจ log path และ backend ของ jail:
fail2ban-client status
# ถ้า jail สีเทา (not active) ให้ตรวจ
tail -50 /var/log/fail2ban.log
# restart
systemctl restart fail2ban
fail2ban-client status sshd
Unattended-upgrades รีสตาร์ท service กลางดึก
เป็น behavior ปกติ แต่ถ้าไม่ต้องการ reboot อัตโนมัติ ให้แก้ config:
nano /etc/apt/apt.conf.d/50unattended-upgrades
# เปลี่ยน Unattended-Upgrade::Automatic-Reboot "true" เป็น "false"
คำถามที่พบบ่อย
ควรเปลี่ยน SSH port จาก 22 เสมอไหม?
เป็น good practice แต่ไม่จำเป็นถ้ามี Fail2ban และใช้ key-based auth แล้ว การเปลี่ยน port ลด noise จาก bot scan แต่ไม่ได้เพิ่มความปลอดภัยจริงจัง ผู้โจมตีที่ตั้งใจสามารถ scan ทุก port ได้ เน้นที่ key-based auth และ Fail2ban มากกว่า
ต้องตั้ง 2FA สำหรับ SSH ด้วยไหม?
แนะนำถ้าต้องการ security layer เพิ่ม ติดตั้ง Google Authenticator PAM แล้วตั้ง ChallengeResponseAuthentication yes และ AuthenticationMethods publickey,keyboard-interactive ใน sshd_config เพื่อให้ต้องใช้ทั้ง key และ TOTP code
VPS provider มี snapshot ให้แล้ว ยังต้องทำ backup เองไหม?
ควรทำ backup เองเพิ่มเติม snapshot ของ provider เก็บอยู่ใน datacenter เดิม ถ้า datacenter มีปัญหาทั้ง VPS และ snapshot หายพร้อมกัน backup ที่ดีควรอยู่ต่างสถานที่ เช่น rclone ไปยัง Cloudflare R2 หรือ Backblaze B2
ควรปิด IPv6 ไหม?
ไม่จำเป็น UFW จัดการ IPv6 ได้ ตรวจสอบว่า IPV6=yes ใน /etc/default/ufw เพื่อให้ rule ใช้กับ IPv6 ด้วย ถ้าปิด IPv6 ทั้งหมดอาจมีผลกระทบกับ application บางตัว
สรุป
ความปลอดภัย VPS ไม่ใช่เรื่องซับซ้อน แต่ต้องทำตั้งแต่แรก เพราะหลังจากเซิร์ฟเวอร์ออนไลน์ไปแล้ว บอทจะเริ่ม scan ภายในไม่กี่นาที ขั้นตอนเหล่านี้ใช้เวลาไม่เกิน 30 นาทีแต่ช่วยลด attack surface ได้อย่างมีนัยสำคัญ