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

เปิดใช้ 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 จังหวะ เช่น
- ขอ SSH key หรือรหัสผ่าน
- ขอ Verification code หรือ OTP
หากทำงานครบตามนี้ แปลว่า 2FA ถูกเปิดใช้งานเรียบร้อยแล้ว
คำแนะนำเพื่อเพิ่มความปลอดภัย
นอกจากการเปิด 2FA แล้ว ยังสามารถเสริมความปลอดภัยให้ SSH ได้อีกหลายทาง เช่น
- จำกัดรายชื่อผู้ใช้ที่เข้า SSH ได้ด้วย
AllowUsers - การเปลี่ยนพอร์ตอาจไม่ใช่มาตรการความปลอดภัยหลัก แต่ช่วยลดการสแกนจากบอทได้บ้าง
- ใช้
fail2banเพื่อช่วยบล็อกการโจมตีแบบ brute force - หากใช้รูปแบบ 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 จะช่วยยกระดับความปลอดภัยของเซิร์ฟเวอร์ได้อย่างชัดเจน โดยไม่เพิ่มความซับซ้อนมากเกินไป