กลับไปหน้าบทความ
#Ubuntu#SSH#2FA#Google Authenticator#PAM

เปิดใช้ 2FA สำหรับ SSH บน Ubuntu ด้วย Google Authenticator ผ่าน PAM

การเพิ่ม 2FA ให้ SSH บน Ubuntu เป็นวิธีเสริมความปลอดภัยที่ทำได้รวดเร็วและมีประสิทธิภาพ โดยใช้ TOTP ผ่าน PAM เพื่อให้ต้องยืนยันรหัส 6 หลักเพิ่มจากรหัสผ่านหรือ SSH key.

28 มกราคม 2569อ่านประมาณ 2 นาที

แชร์บทความ

เปิดใช้ 2FA สำหรับ SSH บน Ubuntu ด้วย Google Authenticator ผ่าน PAM

เปิดใช้ 2FA สำหรับ SSH บน Ubuntu ด้วย Google Authenticator ผ่าน PAM

การเปิดใช้งาน Two-Factor Authentication (2FA) สำหรับ SSH บน Ubuntu เป็นอีกชั้นของการป้องกันที่ช่วยลดความเสี่ยงจากการถูกขโมยรหัสผ่านหรือการโจมตีแบบ brute force ได้อย่างมาก แนวทางที่นิยมและทำได้เร็วคือการใช้ Google Authenticator แบบ TOTP ผ่าน PAM เพื่อให้ระบบ SSH ขอรหัส 6 หลักเพิ่มเติมจากวิธีล็อกอินหลัก เช่น รหัสผ่านหรือ SSH key

สิ่งที่ควรรู้ก่อนเริ่ม

ก่อนเริ่มตั้งค่า ควรระวังเรื่องการเข้าถึงเครื่องระยะไกลเป็นพิเศษ หากกำลังทำงานอยู่บนเครื่องที่เชื่อมต่อผ่าน SSH ควรเปิด session สำรองค้างไว้อีกหนึ่งหน้าต่างเสมอ เผื่อกรณีตั้งค่าผิดพลาดแล้วไม่สามารถล็อกอินกลับเข้าไปได้

นอกจากนี้ หากมีการใช้งานไฟร์วอลล์หรือ cloud security group ควรตรวจสอบให้แน่ใจว่าพอร์ต 22 สำหรับ SSH ยังเปิดใช้งานได้ตามปกติ

เครื่องมือที่ใช้

การตั้งค่านี้ใช้เครื่องมือหลักดังต่อไปนี้

  • แพ็กเกจ libpam-google-authenticator สำหรับเชื่อม PAM กับระบบ TOTP
  • แอป Authenticator บนมือถือ เช่น Google Authenticator, Authy หรือ Microsoft Authenticator

ขั้นตอนที่ 1 ติดตั้งแพ็กเกจ

เริ่มต้นด้วยการอัปเดตแพ็กเกจและติดตั้งโมดูลที่จำเป็น

sudo apt update
sudo apt install libpam-google-authenticator

ขั้นตอนที่ 2 สร้าง secret สำหรับผู้ใช้ที่จะล็อกอิน

ล็อกอินเป็นผู้ใช้ที่ต้องการเปิด 2FA แล้วรันคำสั่งต่อไปนี้

google-authenticator

ระหว่างขั้นตอนการตั้งค่า ควรเลือกตัวเลือกดังนี้

  • ใช้ time-based tokens
  • อัปเดตไฟล์ ~/.google_authenticator
  • เปิด rate-limit เพื่อป้องกันการเดารหัส เช่น 3 ครั้งต่อ 30 วินาที
  • เปิดใช้งาน emergency scratch codes สำหรับกรณีฉุกเฉิน

เมื่อตั้งค่าเสร็จ ระบบจะสร้าง QR code ให้นำไปสแกนด้วยแอปบนมือถือ หลังจากนั้นแอปจะสร้างรหัส 6 หลักใหม่ทุก 30 วินาที ควรเก็บ scratch codes ไว้ในที่ปลอดภัย และถ้าเป็นไปได้ควรเก็บแบบออฟไลน์

ขั้นตอนที่ 3 ผูก PAM ให้ SSH ขอ OTP

แก้ไขไฟล์การตั้งค่าของ PAM สำหรับ SSH

sudo nano /etc/pam.d/sshd

เพิ่มบรรทัดต่อไปนี้ไว้ช่วงบนของไฟล์

auth required pam_google_authenticator.so

หากต้องการยกเว้นบางผู้ใช้ไม่ให้ถูกบังคับใช้ 2FA เช่น บัญชีสำหรับ automation สามารถใช้ตัวเลือก nullok ได้

auth required pam_google_authenticator.so nullok

แนวทางนี้หมายความว่า หากผู้ใช้นั้นยังไม่ได้รัน google-authenticator ก็จะไม่ถูกบังคับใช้ OTP อย่างไรก็ตาม สำหรับเครื่องที่เปิดให้เข้าถึงจากอินเทอร์เน็ต ไม่ควรใช้ nullok กับบัญชีที่มีความสำคัญหรือมีสิทธิ์สูง

ขั้นตอนที่ 4 ตั้งค่า SSHD ให้ถามสองชั้น

แก้ไขไฟล์ตั้งค่าของ SSH daemon

sudo nano /etc/ssh/sshd_config

ตรวจสอบและกำหนดค่าหลักให้ถูกต้อง

UsePAM yes
ChallengeResponseAuthentication yes

ใน Ubuntu รุ่นใหม่ อาจพบการใช้ค่าต่อไปนี้แทนหรือใช้ร่วมกัน

KbdInteractiveAuthentication yes

จากนั้นเลือกวิธีการยืนยันตัวตนที่เหมาะสม

แบบปลอดภัยและนิยม: SSH key + OTP

แนวทางนี้เหมาะสำหรับการใช้งานจริงบนเซิร์ฟเวอร์ เพราะลดการพึ่งพารหัสผ่าน

PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive

แบบยืดหยุ่น: รหัสผ่าน + OTP

เหมาะสำหรับสภาพแวดล้อมที่ยังไม่ได้บังคับใช้ SSH key

PasswordAuthentication yes
AuthenticationMethods password,keyboard-interactive

แบบเข้มมาก: SSH key + รหัสผ่าน + OTP

เป็นโหมดที่ปลอดภัยมาก แต่ใช้งานจริงอาจไม่สะดวก

AuthenticationMethods publickey,password,keyboard-interactive

ขั้นตอนที่ 5 รีโหลดบริการ SSH

หลังแก้ไขค่าต่าง ๆ แล้ว ให้รีโหลดหรือรีสตาร์ตบริการ SSH

sudo systemctl reload ssh

หรือ

sudo systemctl restart ssh

ขั้นตอนที่ 6 ทดสอบอย่างปลอดภัย

ควรเปิดเทอร์มินัลใหม่สำหรับทดสอบ โดยไม่ปิด session เดิมที่ยังเข้าใช้งานได้อยู่ การล็อกอินที่ถูกต้องควรมีการถาม 2 จังหวะ เช่น

  1. ขอ SSH key หรือรหัสผ่าน
  2. ขอ Verification code หรือ OTP

หากทำงานครบตามนี้ แปลว่า 2FA ถูกเปิดใช้งานเรียบร้อยแล้ว

คำแนะนำเพื่อเพิ่มความปลอดภัย

นอกจากการเปิด 2FA แล้ว ยังสามารถเสริมความปลอดภัยให้ SSH ได้อีกหลายทาง เช่น

  1. จำกัดรายชื่อผู้ใช้ที่เข้า SSH ได้ด้วย AllowUsers
  2. การเปลี่ยนพอร์ตอาจไม่ใช่มาตรการความปลอดภัยหลัก แต่ช่วยลดการสแกนจากบอทได้บ้าง
  3. ใช้ fail2ban เพื่อช่วยบล็อกการโจมตีแบบ brute force
  4. หากใช้รูปแบบ SSH key + OTP แล้ว ควรปิด PasswordAuthentication เพื่อลดความเสี่ยงเพิ่มเติม

ข้อผิดพลาดที่พบบ่อยและวิธีแก้

ปัญหาที่พบบ่อยหลังเปิด 2FA มักมาจากการตั้งค่า SSHD หรือ PAM ไม่ครบ เช่น ลืมเปิด UsePAM yes หรือไม่ได้เปิด ChallengeResponseAuthentication หรือ KbdInteractiveAuthentication

อีกกรณีหนึ่งคือเวลาในเครื่องไม่ตรง ทำให้ OTP ไม่ถูกต้อง ควรตรวจสอบด้วยคำสั่ง timedatectl และเปิดใช้งาน NTP ให้เรียบร้อย

หากลืมหรือทำมือถือหาย ยังสามารถใช้ scratch code ที่บันทึกไว้ หรือเข้าเครื่องผ่าน console จากผู้ให้บริการคลาวด์เพื่อรีเซ็ตการตั้งค่าได้

สรุป

การใช้ TOTP ผ่าน PAM เพื่อเพิ่ม 2FA ให้ SSH บน Ubuntu เป็นวิธีที่ทำได้เร็ว ใช้ต้นทุนต่ำ และกำหนดการใช้งานแยกตามผู้ใช้ได้อย่างยืดหยุ่น สำหรับเซิร์ฟเวอร์ที่ใช้งานจริง แนวทางที่สมดุลที่สุดมักเป็นการใช้ "SSH key + OTP" เพราะให้ทั้งความปลอดภัยและความสะดวกในการดูแลระบบ

หากตั้งค่าอย่างรอบคอบและทดสอบอย่างถูกวิธี 2FA จะช่วยยกระดับความปลอดภัยของเซิร์ฟเวอร์ได้อย่างชัดเจน โดยไม่เพิ่มความซับซ้อนมากเกินไป