ตั้งค่า SSH Key และปิดการเข้าสู่ระบบด้วยรหัสผ่านบน Linux
การเข้าสู่ระบบ SSH ด้วยรหัสผ่านเป็นจุดที่ถูกโจมตีบ่อยที่สุดของ Linux Server ที่เปิดสู่อินเทอร์เน็ต บอตจะสุ่มเดารหัสผ่านอยู่ตลอดเวลา การเปลี่ยนมาใช้ SSH Key ซึ่งเป็นคู่กุญแจ Public Key และ Private Key ทำให้ผู้ที่ไม่มีไฟล์ Private Key เข้าสู่ระบบไม่ได้ แม้จะรู้รหัสผ่านก็ตาม
คู่มือนี้อธิบายตั้งแต่การสร้าง Key บนเครื่องของคุณ การนำ Public Key ไปวางบนเซิร์ฟเวอร์ ทดสอบการเข้าสู่ระบบ จนถึงการปิดการเข้าสู่ระบบด้วยรหัสผ่านอย่างปลอดภัย ใช้ได้กับ Ubuntu 22.04/24.04 และ AlmaLinux/Rocky Linux 8-9
สิ่งที่ต้องเตรียม
- Linux Server ที่เข้าสู่ระบบด้วยรหัสผ่านได้อยู่แล้ว และมีสิทธิ์ root หรือผู้ใช้ที่ใช้
sudoได้ - เครื่องที่ใช้เชื่อมต่อ: macOS, Linux หรือ Windows 10/11 ที่มี OpenSSH Client (มีมาให้แล้วใน PowerShell)
- ช่องทางสำรองสำหรับเข้าเซิร์ฟเวอร์กรณีเข้า SSH ไม่ได้ เช่น Console Server ผ่าน Web UI
ขั้นตอนที่ 1: สร้าง SSH Key บนเครื่องของคุณ
รันคำสั่งนี้บนเครื่องที่คุณใช้งาน (ไม่ใช่บนเซิร์ฟเวอร์) ทั้งใน Terminal ของ macOS/Linux และใน PowerShell ของ Windows แนะนำชนิด ed25519 เพราะ Key สั้น ปลอดภัย และรองรับใน OpenSSH ทุกเวอร์ชันที่ยังได้รับการสนับสนุน
ssh-keygen -t ed25519 -C "your-name@company"
โปรแกรมจะถามตำแหน่งไฟล์ ให้กด Enter เพื่อใช้ค่าเริ่มต้น (~/.ssh/id_ed25519) จากนั้นจะถาม Passphrase แนะนำให้ตั้งไว้ เพราะหากไฟล์ Private Key หลุดออกไป ผู้อื่นก็ยังใช้ไม่ได้หากไม่รู้ Passphrase เมื่อเสร็จจะได้ไฟล์สองไฟล์
id_ed25519คือ Private Key ห้ามส่งให้ใครและห้ามอัปโหลดขึ้นเซิร์ฟเวอร์id_ed25519.pubคือ Public Key ไฟล์นี้เท่านั้นที่นำไปวางบนเซิร์ฟเวอร์
หากต้องเชื่อมต่อกับระบบเก่าที่ไม่รองรับ ed25519 ให้ใช้ RSA ขนาด 4096 บิตแทน
ssh-keygen -t rsa -b 4096 -C "your-name@company"
ขั้นตอนที่ 2: คัดลอก Public Key ไปยังเซิร์ฟเวอร์
บน macOS และ Linux
ใช้ ssh-copy-id ซึ่งจะสร้างโฟลเดอร์ ~/.ssh และตั้งสิทธิ์ให้ถูกต้องโดยอัตโนมัติ เปลี่ยน user และ 203.0.113.10 เป็นชื่อผู้ใช้และ IP ของเซิร์ฟเวอร์คุณ
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]
ระบบจะถามรหัสผ่านของเซิร์ฟเวอร์หนึ่งครั้ง เมื่อสำเร็จจะแสดงข้อความประมาณ Number of key(s) added: 1
บน Windows (PowerShell)
Windows ไม่มี ssh-copy-id ให้ใช้คำสั่งนี้แทน ซึ่งอ่านไฟล์ Public Key แล้วส่งไปต่อท้ายไฟล์ authorized_keys บนเซิร์ฟเวอร์
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
ขั้นตอนที่ 3: ทดสอบเข้าสู่ระบบด้วย Key
ssh [email protected]
หากตั้ง Passphrase ไว้ ระบบจะถาม Passphrase ของ Key (ข้อความขึ้นต้นว่า Enter passphrase for key) ไม่ใช่รหัสผ่านของผู้ใช้บนเซิร์ฟเวอร์ ถ้าเข้าได้โดยไม่ถูกถามรหัสผ่านของเซิร์ฟเวอร์ แปลว่า Key ใช้งานได้แล้ว
หมายเหตุ: ห้ามข้ามขั้นตอนนี้ หากยังเข้าด้วย Key ไม่ได้แล้วไปปิดรหัสผ่านในขั้นตอนถัดไป คุณจะถูกล็อกออกจากเซิร์ฟเวอร์ทันที
ขั้นตอนที่ 4: ปิดการเข้าสู่ระบบด้วยรหัสผ่าน
เปิด SSH Session ค้างไว้หนึ่งหน้าต่างตลอดขั้นตอนนี้ และทดสอบด้วยหน้าต่างที่สองเสมอ หากตั้งค่าผิด Session เดิมที่เปิดค้างไว้จะยังใช้งานได้ ทำให้แก้ไขกลับได้
OpenSSH รุ่นใหม่ใน Ubuntu 22.04/24.04 และ AlmaLinux/Rocky 9 อ่านไฟล์ใน /etc/ssh/sshd_config.d/ ก่อนไฟล์หลัก และใช้ค่าที่พบครั้งแรก ตัวอย่างเช่น Ubuntu บน Cloud มักมีไฟล์ 50-cloud-init.conf ที่ตั้ง PasswordAuthentication yes ไว้ หากไปแก้เฉพาะไฟล์หลัก ค่าใหม่จะไม่มีผล วิธีที่แน่นอนคือสร้างไฟล์ที่ชื่อขึ้นต้นด้วย 00- เพื่อให้ถูกอ่านก่อนไฟล์อื่น
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
ใส่ข้อความต่อไปนี้แล้วบันทึก
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
PermitRootLogin prohibit-password หมายถึง root ยังเข้าได้ด้วย Key แต่เข้าด้วยรหัสผ่านไม่ได้ หากคุณมีผู้ใช้ที่ใช้ sudo ได้แล้ว (ดู สร้างผู้ใช้ใหม่และให้สิทธิ์ sudo บน Linux) สามารถตั้งเป็น no เพื่อปิดการเข้าด้วย root ทั้งหมด
บน AlmaLinux/Rocky Linux 8 ให้ตรวจก่อนว่าไฟล์ /etc/ssh/sshd_config มีบรรทัด Include /etc/ssh/sshd_config.d/*.conf หรือไม่ ถ้าไม่มี ให้แก้ค่าทั้งสี่บรรทัดในไฟล์หลักโดยตรงแทน ส่วน RHEL 8 รุ่นเก่าอาจใช้ชื่อ ChallengeResponseAuthentication no แทน KbdInteractiveAuthentication
ตรวจไวยากรณ์ก่อนโหลดค่าใหม่ทุกครั้ง หากไม่มีข้อความใดแสดงออกมาแปลว่าถูกต้อง
sudo sshd -t
จากนั้นโหลดค่าใหม่ ชื่อ Service ต่างกันตาม Distro
# Ubuntu
sudo systemctl reload ssh
# AlmaLinux / Rocky Linux
sudo systemctl reload sshd
ตรวจสอบผลลัพธ์
ดูค่าที่ SSH ใช้งานจริง (รวมทุกไฟล์แล้ว)
sudo sshd -T | grep -Ei 'passwordauthentication|kbdinteractive|permitrootlogin|pubkeyauthentication'
ผลลัพธ์ที่ถูกต้องควรเป็น passwordauthentication no และ pubkeyauthentication yes
จากนั้นเปิดหน้าต่างใหม่บนเครื่องของคุณ แล้วลองบังคับเข้าด้วยรหัสผ่าน
ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password [email protected]
ต้องได้ข้อความ Permission denied (publickey). และต้องยังเข้าได้ตามปกติด้วยคำสั่ง ssh [email protected] ที่ใช้ Key เมื่อทั้งสองกรณีเป็นไปตามนี้จึงค่อยปิด Session เดิม
ปัญหาที่พบบ่อย
ยังถูกถามรหัสผ่านทั้งที่คัดลอก Key แล้ว
สาเหตุที่พบบ่อยที่สุดคือสิทธิ์ไฟล์ไม่ถูกต้อง SSH จะไม่ยอมใช้ authorized_keys ที่ผู้อื่นเขียนได้ ให้แก้ด้วยคำสั่งนี้ในฐานะผู้ใช้เจ้าของบัญชี
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod go-w ~
บน AlmaLinux/Rocky ที่เปิด SELinux ถ้าสร้างไฟล์ด้วยวิธีคัดลอกจากที่อื่น Context อาจผิด ให้รัน restorecon -Rv ~/.ssh ดูรายละเอียดสาเหตุได้จาก Log บนเซิร์ฟเวอร์ด้วย sudo journalctl -u ssh -n 50 (Ubuntu) หรือ sudo journalctl -u sshd -n 50 (AlmaLinux/Rocky)
ปิดรหัสผ่านแล้วแต่ยังเข้าด้วยรหัสผ่านได้
มีไฟล์อื่นใน /etc/ssh/sshd_config.d/ ถูกอ่านก่อนและตั้งค่าเป็น yes ตรวจด้วย grep -ri passwordauthentication /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ แล้วตั้งชื่อไฟล์ของคุณให้เรียงก่อน หรือแก้ไฟล์นั้นให้ตรงกัน จากนั้น reload อีกครั้ง
ทำ Private Key หายหรือเปลี่ยนเครื่อง
Private Key กู้คืนไม่ได้ ให้เข้าเซิร์ฟเวอร์ผ่าน Console แล้วเพิ่ม Public Key ใหม่ลงใน ~/.ssh/authorized_keys พร้อมลบบรรทัดของ Key เก่าที่ไม่ใช้แล้วออก แนะนำให้เก็บสำเนา Private Key ไว้ในที่ปลอดภัย เช่น Password Manager ขององค์กร
Windows เชื่อมต่อแล้วขึ้น UNPROTECTED PRIVATE KEY FILE
ไฟล์ Private Key บน Windows เปิดสิทธิ์ให้ผู้ใช้อื่นอ่านได้ ให้เปิด Properties ของไฟล์ แท็บ Security แล้วให้สิทธิ์เฉพาะบัญชีของคุณ หรือสร้าง Key ใหม่ในโฟลเดอร์ .ssh ของโปรไฟล์ตัวเองด้วย ssh-keygen
เมื่อใช้ SSH Key แล้ว แนะนำให้ติดตั้ง Fail2ban และ Firewall เพิ่มอีกชั้น หากติดปัญหาระหว่างตั้งค่า ติดต่อทีมซัพพอร์ต THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
Related Posts
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี


