0311 | วิธีเข้าระบบ Linux ไม่ต้องใส่รหัสผ่าน โดยใช้ SSH Keys

ก่อนอื่น ขอแนะนำก่อนว่ามันคืออะไรและดีอย่างไร ลองอ่านได้จากที่นี่ครับ เพิ่มความปลอดภัยให้ SSH Server ด้วย Key Authentication

เนื่องจากทุกวันนี้ จำนวน server ที่ดูแลอยู่มีหลายเครื่องเพิ่มขึ้นเรื่อยๆ และชีวิตก็ยุ่งยากในการจำรหัสผ่าน เลยต้องหาวิธีที่ง่ายในการเข้าระบบ Linux ที่จริงวิธีทำก็ไม่ได้ยากอะไร แต่ทำไมผมจึงไม่ใช้วิธีนี้ตั้งแต่ก่อนหน้านี้ก็ไม่ทราบ 😀

โดยในบทความนี้ จะพูดถึงการใช้งานบนเครื่อง Windows และโปรแกรมที่นิยมก็คงเป็น putty ซึ่งสามารถโหลดได้จากเว็บไซต์ http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html โดยเลือกในส่วนของ A Windows MSI installer package for everything except PuTTYtel ดังรูปครับ
ssh keys

เมื่อติดตั้งโปรแกรม putty เรียบร้อยแล้ว ให้เปิด puttygen ขึ้นมา จากนั้นเปลี่ยนตัวเลขในช่อง Number of bits in a generated key เป็น 4096 และกดปุ่ม Generate ดังรูป
ssh key

หลังจากกดปุ่ม Generate แล้ว ให้ลาก Mouse ไปมา จะลากยังไงก็ได้ภายในกรอบสี่เหลื่ยม จนโปรแกรม generate เสร็จ
how to generate ssh keys

เมื่อโปรแกรม generate เสร็จแล้ว ให้ตั้ง Key passphrase ดังรูป เพื่อเป็นรหัสในการเปิดไฟล์ private key (แนะนำ) แต่หากเป็นการใช้เพื่อเขียน script ก็ไม่ต้องตั้งครับ หลังจากนั้นกด Save private key
ssh key

ตั้งชื่อเป็นอะไรก็ได้ และจำตำแหน่งที่ save ไว้ดีๆ
private key

จากนั้นมาที่ Public key ให้คลิกขวาบริเวณของ public key เลือก Select All
public key

เลือก copy
ssh key

แล้วนำไปวางใน Notepad โดย public key ที่ได้ copy มาจะมีบรรทัดเดียวดังรูปตัวอย่าง
ssh

เป็นอันเรียบร้อยในส่วนของการสร้าง public key และ private key โดย public key ผมจะใช้วิธีอัพโหลดไปไว้ยัง web server เพื่อที่จะง่ายในการดึง public key ไปใส่ไว้ใน server ต่างๆ

มาต่อกันที่ server ที่เราต้องการเข้าระบบ ให้โหลดไฟล์ public key ที่เราใส่ไว้ใน web server เรียบร้อยแล้ว โดยไฟล์ public key นี้ ไม่ต้องกลัวว่าคนอื่นจะรู้ ชื่อมันก็บอกแล้วว่า public

wget http://IP Address or URL/public-key.txt

(IP ในรูปเป็น ip ของที่บ้านผมเอง หลังจากเขียนบทความนี้จบก็คงปิด เปิด เร้าเตอร์ใหม่ :D)
ssh keys

จากนั้นให้นำ public key ของเราไปใส่ไว้ใน ~/.ssh/authorized_keys หากยังไม่มีให้สร้างขึ้นมาใหม่

mkdir -p ~/.ssh
chmod 700 ~/.ssh/

นำ public key ไปใส่ (หากมี public key อื่นอยู่แล้ว ก็ใส่ในบรรทัดใหม่ได้เลย โดยคำสั่งได้ด้านจะเป็นการใส่ในบรรทัดใหม่ให้อยู่แล้ว)

cat public-key.txt >> ~/.ssh/authorized_keys

public key

หลังจากนั้นแก้ไขไฟล์ config ของ SSHD

nano /etc/ssh/sshd_config

แก้ไขให้เป็นดังตัวอย่างด้านล่าง

RSAAuthentication yes           #(นำเครื่องหมาย # ด้านหน้าออก)
PubkeyAuthentication yes        #(นำเครื่องหมาย # ด้านหน้าออก)
PasswordAuthentication no       #(เปลี่ยนจาก yes เป็น no)

สิ่งที่แนะนำอีกอย่างก็คือ port ของ ssh ควรเป็นจาก 22 เป็น port อื่นด้วยครับ เช่น 1122 แต่ต้องแน่ใจก่อนว่า Firewall ได้เปิด port ที่ต้องการเปลี่ยนแล้วด้วย ไม่งั้นอาจงานเข้าต้องไปหน้าเครื่องครับ

จากนั้น restart sshd
CentOS 7

systemctl restart sshd.service

CentOS 6

/etc/init.d/sshd restart

เรียบร้อยในส่วนของ server หลังจากนี้เราจะมาตั้งค่าในส่วนของโปรแกรม putty กันครับ

เปิดโปรแกรม putty ใส่ ip และ port ของ server ลงไป
putty

จากนั้นไปที่เมนูด้านซ้าย Connection > SSH > Auth
ssh

คลิก Browse เพื่อเลือกไฟล์ private key ที่เราได้บันทึกเอาไว้
putty

จากนั้นคลิกเมนู Session ที่อยู่ด้านซ้าย เมนูแรก ตั้งชื่อของ server ตามใจชอบ แล้วกด Save
putty

ดับเบิ้ลคลิกชื่อที่ได้ตั้งเอาไว้ (ตรงนี้คงไม่มใครใช้ไม่เป็นแล้วมั้ง)
putty

ใส่ชื่อ username ที่เราจะใช้เข้าระบบ public key ที่เราวางไว้ใน authorized_keys อยู่ใน user ไหนก็เข้าด้วย user นั้นครับ ในที่นี้ผมวางไว้ที่ root ก็เข้าระบบด้วย root
putty

มาถึงตอนนี้ หวังว่ายังคงจำ passphrase ที่เราตั้งไว้ในขั้นตอน generate public key และ private key ได้ ให้ใส่รหัสที่เราได้ตั้งเอาไว้ (เห็นไหม ตั้งไว้ปลอดภัยกว่า เพราะใครได้ private key ของเราไป ก็ใช้งานไม่ได้)
ssh

เพียงแค่นี้เราก็สามารถเข้าระบบโดยไม่ต้องใส่หรัสผ่านอีกต่อไปแล้วครับ แต่สำหรับ passphrase นั้น เราต้องกรอกทุกครั้งที่เข้าระบบ คงไม่สะดวกนักหากมี server หลายๆเครื่อง แต่ก็มีตัวช่วยครับ คือ Pageant เอาไว้จะมาต่อในบทความต่อไป หรือลองค้นหาวิธีใช้ได้จากชื่อโปรแกรมครับ