SSH คืออะไร? + วิธีสร้าง SSH Key

Chai Phonbopit

Software Engineer & Blogger

24 July 2020

In

สวัสดีครับ วันนี้ขอมาเขียนเป็นบันทึก วิธีการสร้าง SSH การ Setup SSH ต่างๆ เพราะเนื่องจากว่า ทุกครั้งที่จะ Generate ใหม่ หรือสร้างใหม่ หรือไปเพิ่ม SSH ทำ Deploy Key ทีไร ก็ลืมคำสั่งทุกที (พิมพ์ Google ทุกครั้งเลย ฮ่าๆ) ก็เลยคิดว่า มาเขียนเป็นบทความไว้ดีกว่า เผื่อไว้อ่านง่ายๆด้วย

เคยเขียนเรื่องการตั้งค่า SSH ไว้ เกี่ยวกับการ Setup ให้สามารถใช้ Git หลายๆ Account ในเครื่องเดียวกันได้ วิธีการใช้งาน Git หลายๆ account ในเครื่องเดียวกัน

TLDR

ขอแบบสั้นๆ

# Generate new SSH Key
ssh-keygen -t rsa -b 4096 -C "EMAIL"
# Start ssh agent
eval "$(ssh-agent -s)"
# Mac OS
ssh-add -K ~/.ssh/id_rsa
# Linux
ssh-add ~/.ssh/id_rsa
# Add new SSH key to Github or Other Providers (public key)
cat ~/.ssh.id_rsa.pub
# Verify
# Fixing permission keys
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

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 ต้องทำคือ

  1. ทำการสร้าง Private / Public Key
  2. แจก Public Key ให้ Client หรือใครก็ได้ ที่อยากเข้าถึง Server
  3. เวลา Client ส่งข้อมูลมาที่ Server ฝั่ง Client จะเข้าเข้ารหัสด้วย public key ที่ Server gen ให้
  4. Server ต้องใช้ Private Key ของตัวเอง ในการถอดรหัส ที่ Client ส่งมาครับ
  5. หากคนไม่มี Private Key เพื่อใช้ถอดรหัส ก็ไม่สามารถอ่านข้อมูลได้ มันก็เลยทำให้ มันค่อนข้างจะ Secure ครับ

เริ่มสร้าง SSH Key

เปิด Terminal / Git Bash ขึ้นมาจ้า

ssh-keygen -t rsa -b 4096 -C "EMAIL"

ใส่ Email ตัวเองลไป ขั้นตอนนี้จะทำการสร้าง public/private rsa key pair ครับ

ขั้นต่อมา มันจะถามว่า ให้สร้างไฟล์ไว้ที่ไหน (ถ้ามีแล้ว มันจะ override นะ) default คือ ~/.ssh/id_rsa อยากเปลี่ยนชื่อ ก็พิมพ์ชื่อไปได้

Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]

ขั้นตอนต่อมาก็ใส่ Passphrase (หรือก็คือ Password นั่นแหละ) เป็น Security Layer อีกขั้น นอกจาก Private / Public key pair แล้ว ก็ต้องใส่ passphrase ยืนยันอีกทีนึง

เพิ่ม SSH Key ไป ssh-agent เอาไว้จัดการ key

eval "$(ssh-agent -s)"
# Mac OS ใช้บรรทัดนี้
ssh-add -K ~/.ssh/id_rsa
# Linux ใช้นี้
ssh-add ~/.ssh/id_rsa

เวลาจะ Add SSH Keys ไปที่ Github หรือ Providers อื่นๆ เราก็ต้อง copy public key ของเราไปให้ Github นั่นเอง

cat ~/.ssh/id_rsa.pub

จากนั้นก็ก็อปปี้ซะ (ขึ้นต้นด้วย 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 ผมก็จะแยกแบบนี้

Host github.com
User git
IdentityFile ~/.ssh/github
Host github.com-work
User git
IdentityFile ~/.ssh/github_work

อันนี้ข้อดีคือ ช่วยให้เราสามารถ SSH เพื่อ Deploy github คนละ account ได้ เช่นสมมติ url เราเป็นแบบนี้

[email protected]/Devahoy/myrepo

account แรก ที่กำหนด config ไม่ต้องเปลี่ยนไร แต่ถ้าเราอยากให้ SSH มันไปเรียก ~/.ssh/github_work เราก็แค่เปลี่ยน git remote url มันซะ แบบนี้

git remote set-url origin [email protected]/Devahoy/myrepo

จะเห็นว่า 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

  • #SSH
  • #Linux
  • #DevOps
  • #Server
  • #Cryptography
  • #Hashing