SSH คืออะไร? + วิธีสร้าง SSH Key
สวัสดีครับ วันนี้ขอมาเขียนเป็นบันทึก วิธีการสร้าง SSH การ Setup SSH ต่างๆ เพราะเนื่องจากว่า ทุกครั้งที่จะ Generate ใหม่ หรือสร้างใหม่ หรือไปเพิ่ม SSH ทำ Deploy Key ทีไร ก็ลืมคำสั่งทุกที (พิมพ์ Google ทุกครั้งเลย ฮ่าๆ) ก็เลยคิดว่า มาเขียนเป็นบทความไว้ดีกว่า เผื่อไว้อ่านง่ายๆด้วย
เคยเขียนเรื่องการตั้งค่า SSH ไว้ เกี่ยวกับการ Setup ให้สามารถใช้ Git หลายๆ Account ในเครื่องเดียวกันได้ วิธีการใช้งาน Git หลายๆ account ในเครื่องเดียวกัน
TLDR
ขอแบบสั้นๆ
SSH คืออะไร?
SSH หรือเรียกว่า Secure Shell เป็น network protocol ที่เอาไว้ให้เราเชื่อมต่อระหว่าง Server กับ Server โดยที่ไม่ต้องใช้ Username หรือ Password แต่ใช้สิ่งที่เรียกว่า Public Key และ Private Key เพื่อยืนยันตัวตนแทนครับ
ข้อดีคือ หากเราต้องการเข้าถึง Machine A กับ B โดยที่ทั้งสองเครื่องอยู่ไกลกันมาก เราก็แค่ใช้ SSH เข้าผ่าน Internet ได้เลย อารมณ์คล้ายๆ Remote Desktop เข้าไปคุมเครื่องนั่นเอง
หลักการทำงานของ SSH
เวลารับส่งข้อมูลระหว่างเครื่อง มันจะมีสิ่งที่เรียกว่า Hashing และ Encryption คือการเข้ารหัส ลองอ่านเพิ่มเติม หรือค้นหา keyword Cryptography ได้ครับ เกี่ยวกับ Hashing และ Decrypt / Encrypt มันจะมีรายละเอียดอีกเยอะมากๆ ทั้ง Algorithm, Signature, HMAC ไรพวกนี้
หลักๆเลย คือ SSH เวลาคุยกัน จะใช้ 2 อย่างคือ
- Public Key - เป็นสิ่งที่เราไว้ใช้บอกใครๆ หรือเอาให้ Server อื่นๆ ที่เค้าอยากมาติดต่อกับเรา (มองว่าเป็น Id ของเรา หรือ username ก็ได้ แต่ว่ามันยาวนะ)
- Private Key - ห้ามให้คนอื่นรู้เด็ดขาด เปรียบเสมือน Password ของเราเลยก็ว่าได้
สมมติว่าผมมี Server A และเครื่อง Client ถ้า Client อยากเข้าถึง Server ได้ สิ่งที่ Server ต้องทำคือ
- ทำการสร้าง Private / Public Key
- แจก Public Key ให้ Client หรือใครก็ได้ ที่อยากเข้าถึง Server
- เวลา Client ส่งข้อมูลมาที่ Server ฝั่ง Client จะเข้าเข้ารหัสด้วย public key ที่ Server gen ให้
- Server ต้องใช้ Private Key ของตัวเอง ในการถอดรหัส ที่ Client ส่งมาครับ
- หากคนไม่มี Private Key เพื่อใช้ถอดรหัส ก็ไม่สามารถอ่านข้อมูลได้ มันก็เลยทำให้ มันค่อนข้างจะ Secure ครับ
เริ่มสร้าง SSH Key
เปิด Terminal / Git Bash ขึ้นมาจ้า
ใส่ Email ตัวเองลไป ขั้นตอนนี้จะทำการสร้าง public/private rsa key pair ครับ
ขั้นต่อมา มันจะถามว่า ให้สร้างไฟล์ไว้ที่ไหน (ถ้ามีแล้ว มันจะ override นะ) default คือ ~/.ssh/id_rsa
อยากเปลี่ยนชื่อ ก็พิมพ์ชื่อไปได้
ขั้นตอนต่อมาก็ใส่ Passphrase (หรือก็คือ Password นั่นแหละ) เป็น Security Layer อีกขั้น นอกจาก Private / Public key pair แล้ว ก็ต้องใส่ passphrase ยืนยันอีกทีนึง
เพิ่ม SSH Key ไป ssh-agent เอาไว้จัดการ key
เวลาจะ Add SSH Keys ไปที่ Github หรือ Providers อื่นๆ เราก็ต้อง copy public key ของเราไปให้ Github นั่นเอง
จากนั้นก็ก็อปปี้ซะ (ขึ้นต้นด้วย ssh-rsa
อะไรเทือกนี้) ถ้าเห็นว่าขึ้นต้นด้วย ----BEGIN
มีคำว่า PRIVATE KEY
อันนั้นไม่ใช่แล้วนะครับ อย่าก็อปผิดละ!
เราสามารถ Test/Verify ว่า SSH เรา connect ไปที่ target ได้ตรงมั้ยด้วยคำสั่งนี้ (ตัวอย่าง Github)
Note: ใน Mac OS เราสามารถเก็บ Passphrase ใน Keychain ก็ได้ ทำให้เราใส่ passphrase แค่ครั้งเดียว ครั้งถัดมาไม่ต้องแล้ว
SSH Config ซักนิด
สมมติ อยากใช้ SSH หลายๆ Key เช่น Gitub / Gitlab / Bicbucket และ Hosting แยกกันไปเลย ก็ทำได้ โดยใช้กำหนดที่ ~/.ssh/config
(ถ้าไม่มีไฟล์นี้ ก็สร้างขึ้นมาเลยครับ)
เช่น ผมมี 2 account ใช้ github ผมก็จะแยกแบบนี้
อันนี้ข้อดีคือ ช่วยให้เราสามารถ SSH เพื่อ Deploy github คนละ account ได้ เช่นสมมติ url เราเป็นแบบนี้
account แรก ที่กำหนด config ไม่ต้องเปลี่ยนไร แต่ถ้าเราอยากให้ SSH มันไปเรียก ~/.ssh/github_work
เราก็แค่เปลี่ยน git remote url มันซะ แบบนี้
จะเห็นว่า Url เพิ่มมาคือ
github.com-work
พอเวลา connect SSH ด้วย Git มันก็จะรู้เอง ว่าจะต้องใช้ rsa key อันไหน
ลองอ่านเพิ่มเติมเรื่อง วิธีการใช้งาน Git หลายๆ account ในเครื่องเดียวกัน ได้ครับ
สรุป
- SSH Keys สร้าง Public / Private key pairs
- Public key แชร์ให้คนอื่นได้ เช่น ใส่ไว้ใน Github, Gitlab หรือ CI/CD
- Private Key อยู่บนเครื่องเราเท่านั้น และห้ามแชร์ใครเด็ดขาด
- OpenSSH เป็น Key Management
- Passphrase เป็น Security layer อีกชั้นนึง ที่ secure ขึ้น เพราะใช้แค่ public / private อาจจะไม่พอ
- สามารถใช้ ssh agent หรือ Keychain สำหรับเซฟ passphrase ได้
Reference
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust