ปกติแล้วเวลาที่เราจะทำการ remote login เข้าระบบที่เป็น Linux Server เราก็จะใช้ Username และ Password ในการ SSH เข้าไป แต่การใช้ username password ก็อาจจะไม่ปลอดภัยเพราะแฮกเกอร์อาจจะโจมตีแบบ Brute Force เพื่อเดารหัสผ่านเข้ามาได้ ถึงแม้เราจะใช้ fail2ban เพื่อป้องกันการโจมตีลักษณะนี้ได้ แต่ถ้ารหัสผ่านไม่แข็งแกรงพอก็มีความเป็นไปได้ที่แฮกเกอร์จะใช้พรอกซีและแฮกเข้ามาได้ หรือในกรณีที่แย่ที่สุดที่ผมเคยเจอคือผู้ดูแลระบบตั้งรหัสผ่านของอีเมล,ดาตาเบส,ssh เป็นรหัสเดียวกัน และเราหาช่องโหว่เพื่อแฮกไปอ่านค่าคอนฟิกของเว็บนั้นได้ว่าใช้รหัสผ่านดาตาเบสอะไรเราก็มีโอกาสที่จะ ssh เข้าไปควบคุมเซิฟเวอร์ได้ทั้งเครื่อง ส่วน SSH Key จะใช้การจับคู่กันระหว่าง private key และ public key ซึ่งยาว 2048 หรือ 4096 bit ทำให้เป็นไปได้ยากที่แฮกเกอร์จะรู้คีย์นี้ (ยกเว้นว่าเครื่องเราจะโดนขโมย) โดยในตัวอย่างนี้ผมจะใช้ putty ในการสร้างคีย์ และเมื่อเราล็อกอินด้วย SSH key ได้แล้วเราจะทำการปิดการล็อกอินด้วยรหัสผ่านไปเลย
เริ่มจากการสร้างคีย์โดยใช้โปรแกรม PuTTYgen ถ้าลง putty ไว้มันก็อยู่ที่เดียวกันกับ putty นั้นหละครับ หรือถ้ายังไม่มีหรือหาไม่เจอก็ไปเอามาจากเว็บหลักเขาได้เลย http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
เมื่อเปิด PuTTYgen ขึ้นมาแล้วก็กด Generate และเอาเมาส์เลือนไปเลือนมาในช่อง Key จนกว่าจะขึ้นครบ 100%
เมื่อเสร็จแล้วให้ทำการบันทึกคีย์ที่ได้โดยกด Save private key และให้ทำการ copy ค่าในช่อง Public key for pasting into OpenSSH authorized_keys file เอาไว้ก่อน (ส่วน Save public key ไม่ต้องบันทึกก็ได้เพราะเป็นค่าเดียวกับในช่อง Public key for pasting into OpenSSH authorized_keys file นั้นหละ แต่ putty กับ OpenSSH ใช้ฟอร์แมตต่างกันเฉยๆ)
หลังจากนั้นทำการล็อกอินเข้าเซิฟเวอร์ด้วย username และ password ตามปกติก่อน เสร็จแล้วให้เอาค่า Public key ที่ก๊อปปี้ไว้ตะกี่มาใส่ในไฟล์ ~/.ssh/authorized_keys เมื่อเสร็จแล้วก็ทำการล็อกเอาท์ออกจากระบบ
1 2 3 4 | mkdir ~/.ssh chmod 0700 ~/.ssh nano ~/.ssh/authorized_keys chmod 0644 ~/.ssh/authorized_keys |
ต่อไปทำการคอนฟิก putty ให้ใช้ private key แทนการใช้ username และ password โดยทำการเลือกที่แท๊บ data และใส่ Auto-login username เป็นยูเซอร์ที่เราจะใช้ในการล็อกอิน
จากนั้นมาที่แท๊บ Connection -> SSH -> Auth ให้เลือก private key ที่เราบันทึกเอาไว้
กลับมาที่แท๊บ Session ให้ใส่ IP, Port กด Save และ Open เพื่อเริ่มใช้งาน จะเห็นว่าสามารถล็อกอินเข้าระบบได้โดยไม่ต้องใส่ username และ password แล้ว
ขั้นตอนถัดไปทำการ disable การล็อกอินด้วย username และ password โดยให้ทำการแก้ไขไฟล์ /etc/ssh/sshd_config (อันนี้ต้องใช้สิทธิ์รูทให้การแก้นะครับ)
1 | sudo nano /etc/ssh/sshd_config |
จากนั้นหาบรรทัด PasswordAuthentication กับ UsePAM และแก้ไขเป็นดังนี้
1 2 | PasswordAuthentication no UsePAM no |
หลังจากแก้ไขเสร็จแล้วให้ทำการ restart ssh และทำการล็อกเอาท์ออกจากระบบ จากนั้นทดสอบทำการล็อกอินด้วย username และ password จะเห็นว่าไม่สามารถล็อกอินได้แล้ว ตอนนี้ทั้งระบบก็จะสามารถใช้งานได้ผ่านทาง SSH Key ได้เพียงอย่างเดียว
1 | systemctl restart ssh |
ถ้าหากคิดว่าการล็อกอินอัตโนมัตโดยใช้ SSH Key แบบนี้อาจจะไม่ปลอดภัยถ้าหากเครื่องโดนขโมย เราสามารถตั้งรหัสผ่านของ SSH Key ได้ในขั้นตอนการสร้างคีย์ โดยให้เรากำหนดรหัสผ่านที่ต้องการลงไปในช่อง Key passphrase ซึ่งทุกครั้งที่มีการใช้ SSH Key นี้ระบบก็จะให้เราใส่รหัสผ่านชุดนี้ทุกครั้ง