IT General
น้องๆ เคยเจอปัญหา login server ด้วย password แล้วโดนแฮกไหม? สมัยผมทำร้านเน็ต SiamCafe.net เมื่อ 20 กว่าปีที่แล้ว (โอ้โห นานจัง!) ก็เจอปัญหาคนแอบ scan password กันบ่อยมาก Ssh Key Based Auth นี่แหละคือพระเอกของเรา ช่วยให้การ login ปลอดภัยขึ้นเยอะเลย
Ssh Key Based Auth หรือการยืนยันตัวตนด้วยกุญแจ SSH แทน password คือการใช้คู่กุญแจ (public key และ private key) ในการยืนยันตัวตนแทนการใช้ password แบบเดิมๆ Public key เราจะเอาไปใส่ไว้ใน server ส่วน private key เราจะเก็บไว้ในเครื่องเราอย่างดี เวลา login server จะตรวจสอบ private key ของเรากับ public key ที่เก็บไว้ ถ้า match กัน ก็แปลว่าเราเป็นเจ้าของ account จริงๆ ไม่ต้องใส่ password ให้เสี่ยงโดนดักเลย
สำคัญยังไงเหรอ? ก็เพราะมันปลอดภัยกว่าไง! Password มันเดาง่าย โดน brute-force ได้ แต่ private key มันซับซ้อนกว่าเยอะ แถมต่อให้คนร้ายได้ private key ไป ก็ต้องเจาะเข้าเครื่องเราก่อนถึงจะเอาไปใช้ได้อีกที
คิดง่ายๆ public key เหมือนแม่กุญแจที่เราเอาไปให้คนอื่นไข ส่วน private key คือลูกกุญแจที่เราเก็บไว้เอง ใครมีลูกกุญแจก็เปิดแม่กุญแจได้ แต่ใครมีแม่กุญแจอย่างเดียวเปิดไม่ได้นะ
Public key เอาไว้ใส่ใน server เพื่อบอกว่า "ใครมี private key ที่คู่กัน สามารถ login เข้ามาได้นะ" ส่วน private key เอาไว้ในเครื่องเรา เพื่อยืนยันว่า "นี่ไง private key ของฉัน ตรงกับ public key ที่เธอมีนะ"
สมัยก่อนตอนทำร้านเน็ต SiamCafe Blog ผมต้องสอนลูกค้าเรื่องนี้กันเยอะมาก เพราะมันใหม่สำหรับคนทั่วไป
SSH (Secure Shell) คือ protocol ที่ใช้ในการเชื่อมต่อและควบคุมเครื่อง server จากระยะไกล มันเข้ารหัสข้อมูลทุกอย่างที่ส่งผ่าน ทำให้คนดักฟังระหว่างทางไม่สามารถอ่านข้อมูลของเราได้
การ login ด้วย password คือการส่ง password ไปให้ server ตรวจสอบ ซึ่งมันเสี่ยงถ้ามีคนดักฟัง แต่การ login ด้วย key จะใช้การเข้ารหัสและถอดรหัสข้อมูลระหว่าง client และ server โดยใช้ public key และ private key ทำให้ปลอดภัยกว่าเยอะ
authorized_keys คืออะไรไฟล์นี้แหละคือที่เก็บ public key ของเราใน server ปกติมันจะอยู่ใน directory ~/.ssh/authorized_keys (~ หมายถึง home directory ของ user นั้นๆ) เวลาเรา login เข้า server ด้วย key, SSH daemon จะตรวจสอบว่า private key ของเราตรงกับ public key ที่อยู่ในไฟล์นี้หรือไม่ ถ้าตรงก็ให้ login ได้เลย
การใช้งาน SSH Key Based Auth ไม่ยากอย่างที่คิด ลองทำตามขั้นตอนง่ายๆ นี้ดูนะ
เราจะใช้คำสั่ง ssh-keygen ในการสร้างคู่กุญแจ เปิด Terminal หรือ Command Prompt แล้วพิมพ์:
ssh-keygen -t rsa -b 4096
-t rsa คือการระบุว่าเราจะใช้ algorithm RSA ในการสร้าง key (จริงๆ มี algorithm อื่นๆ อีก เช่น ed25519 แต่ RSA ก็ยังเป็นที่นิยมอยู่) -b 4096 คือการระบุความยาวของ key เป็น 4096 bits (ยิ่งยาวก็ยิ่งปลอดภัย แต่ก็อาจจะช้าลงนิดหน่อย)
ระบบจะถามว่าจะ save key ไว้ที่ไหน (default คือ ~/.ssh/id_rsa และ ~/.ssh/id_rsa.pub) และจะถาม passphrase (password สำหรับ key) ถ้าใส่ passphrase เวลาใช้ key จะต้องใส่ password นี้ก่อนด้วย เพิ่มความปลอดภัยอีกชั้นหนึ่ง
หลังจากสร้าง key แล้ว เราต้องเอา public key (ไฟล์ ~/.ssh/id_rsa.pub) ไปใส่ไว้ใน server วิธีที่ง่ายที่สุดคือใช้คำสั่ง ssh-copy-id:
ssh-copy-id user@server_ip
แทน user ด้วย username ของ account ใน server และ server_ip ด้วย IP address ของ server ระบบจะให้ใส่ password ของ user นั้นๆ เพื่อทำการ copy public key ไปยัง server
ถ้า ssh-copy-id ใช้ไม่ได้ (เช่น server เก่ามากๆ) เราสามารถ copy public key ไปใส่ในไฟล์ ~/.ssh/authorized_keys ด้วยตัวเองได้ โดยใช้คำสั่ง:
cat ~/.ssh/id_rsa.pub | ssh user@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
คำสั่งนี้จะสร้าง directory ~/.ssh (ถ้ายังไม่มี) และ copy public key ไปใส่ในไฟล์ ~/.ssh/authorized_keys
หลังจากอัพโหลด public key ไปแล้ว ลอง login เข้า server ดู โดยไม่ต้องใส่ password:
ssh user@server_ip
ถ้าทุกอย่างถูกต้อง เราควรจะ login เข้า server ได้เลย โดยไม่ต้องใส่ password อีกต่อไป
สมัยผมทำร้านเน็ต SiamCafe Blog ตอนนั้นพวกระบบจัดการร้านยังไม่ค่อยดีเท่าไหร่ ผมต้อง ssh เข้าไปจัดการ server บ่อยมาก การใช้ key ช่วยลดความยุ่งยากไปได้เยอะ
| วิธีการยืนยันตัวตน | ข้อดี | ข้อเสีย | ความปลอดภัย |
|---|---|---|---|
| Password Authentication | ง่ายต่อการใช้งาน | เสี่ยงต่อการถูก brute-force, dictionary attack | ต่ำ |
| SSH Key Based Authentication | ปลอดภัยกว่า, ไม่ต้องจำ password | ซับซ้อนกว่า, ต้องจัดการ key | สูง |
| Two-Factor Authentication (2FA) | ปลอดภัยสูง, ต้องใช้ password + code | ยุ่งยากกว่า, ต้องมีอุปกรณ์สำหรับ 2FA | สูงมาก |
จะเห็นว่าแต่ละวิธีก็มีข้อดีข้อเสียต่างกัน แต่ถ้าเน้นความปลอดภัย SSH Key Based Authentication ถือว่าเป็นทางเลือกที่ดีมากๆ เลยแหละ
SSH Key Based Auth นี่มันของดีจริงๆ ครับ แต่ต้องใช้ให้เป็นนะ สมัยผมทำร้านเน็ตนี่โดนแฮกกันบ่อยมาก เพราะรหัสผ่านมันง่ายเกินไป พอเปลี่ยนมาใช้ Key Based Auth นี่สบายใจขึ้นเยอะเลย แต่ก็ต้องมีเทคนิคกันหน่อยนะ
1. Passwordless Login ไม่ได้แปลว่าไม่ต้องมี Password เลย: หลายคนเข้าใจผิดว่าพอใช้ Key Based Auth แล้วจะเลิกรหัสผ่านได้เลย ไม่ใช่นะ! ควรตั้งรหัสผ่านให้ User account ด้วย (Strong Password นะ) เผื่อกรณีที่ Key หาย หรือโดนขโมย รหัสผ่านนี่แหละจะเป็นปราการด่านสุดท้าย
2. อย่าใช้ Default Key Name: เวลา generate SSH Key คู่แรกๆ หลายคนมักจะใช้ชื่อ default คือ id_rsa, id_rsa.pub อันนี้ไม่ดีครับ เพราะถ้า Hacker ได้ Key ไป เขาจะรู้ทันทีว่ามันคือ Key อะไร ควรเปลี่ยนชื่อให้มันยากๆ หน่อย เช่น my_secret_server_key
ssh-keygen -t rsa -b 4096 -f ~/.ssh/my_secret_server_key
3. SSH Key Rotation: เหมือนเปลี่ยนรหัสผ่านนั่นแหละครับ ควรเปลี่ยน SSH Key เป็นระยะๆ เช่น ทุก 3 เดือน 6 เดือน หรือ 1 ปี แล้วแต่ความสำคัญของ Server ตัวนั้นๆ วิธีนี้จะช่วยลดความเสี่ยงกรณีที่ Key โดน Compromise ไปแล้ว แต่เรายังไม่รู้ตัว
4. ใช้ SSH Agent Forwarding อย่างระมัดระวัง: SSH Agent Forwarding มันสะดวกมากครับ ทำให้เราไม่ต้องใส่ Passphrase ทุกครั้งที่ SSH เข้าไป แต่ก็มีความเสี่ยง ถ้าเครื่องเราโดนแฮก Hacker ก็จะสามารถ Forward Agent ไป SSH เข้า Server อื่นๆ ได้เลย ทางที่ดีคือ Enable เฉพาะตอนที่จำเป็นจริงๆ และปิดมันเมื่อใช้งานเสร็จ
iCafeForexPassword มันเดาง่ายครับ! คนส่วนใหญ่มักจะใช้รหัสผ่านที่ง่ายต่อการจำ เช่น วันเกิด ชื่อสัตว์เลี้ยง หรือคำศัพท์ทั่วไป Hacker เขามีเครื่องมือช่วยในการเดารหัสผ่านพวกนี้อยู่แล้ว (Brute-Force Attack) แต่ Key Based Auth มันใช้หลักการเข้ารหัสลับที่ซับซ้อนกว่ามาก ทำให้เดาได้ยากกว่าเยอะ
รีบเข้าไปลบ Public Key ที่อยู่ใน ~/.ssh/authorized_keys ของ Server ทันทีครับ! แล้วก็ Generate Key คู่ใหม่ แล้วเอา Public Key ไปใส่แทนที่ Key เก่า
เก็บไว้ในที่ที่ปลอดภัยครับ! เช่น บนเครื่องคอมพิวเตอร์ส่วนตัวที่ตั้งรหัสผ่านไว้ หรือจะใช้ Hardware Security Module (HSM) ก็ได้ แต่ที่สำคัญคือ อย่าเก็บ Private Key ไว้ใน Cloud Storage หรือ Email เด็ดขาด!
Passphrase ก็คือรหัสผ่านสำหรับ Private Key ของเราครับ มันเป็นเหมือนปราการด่านที่สอง ถ้า Hacker ได้ Private Key ไป แต่ไม่มี Passphrase ก็ไม่สามารถใช้ Key นั้นได้
SiamCafe BlogSSH Key Based Auth เป็นเครื่องมือที่ช่วยเพิ่มความปลอดภัยให้กับ Server ของเราได้จริง แต่ต้องใช้อย่างถูกวิธีนะครับ อย่าลืมทำตาม Best Practices ที่ผมแนะนำไป แล้ว Server ของคุณก็จะปลอดภัยจาก Hacker มากขึ้นแน่นอน