ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home ตั้งค่า SSH Key และปิดการเข้าสู่ระบบด้วยรหัสผ่านบน Linux

ตั้งค่า 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/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security