เราจะใช้ SSH กับ Github ได้ยังไงบ้าง
Tags: github, ssh
Published: 2022-02-06 08:50:01

การเข้ารหัสข้อมูลไม่ใช่เรื่องใหม่ แต่มีมานานมากแล้ว ในสมัยสมัครสงครามโลกครั้งที่ 2 นั้น นาซีเยอรมันได้ประดิษฐ์เครื่องสำหรับเข้ารหัสสื่อสารชื่อ Enigma ซึ่งในตอนท้ายถูกฝั่งอังกฤษถอดรหัสได้ด้วยการใช้เครื่อง Turing Machine อันเป็นต้นแบบคอมพิวเตอร์ยุคปัจจุบัน 

ในปัจจุบันการเข้ารหัสใช้กันอย่างแพร่หลายในวงการคอมพิวเตอร์ โดยเราจะเรียกว่าการสร้างความปลอดภัยภายในการสื่อสารระหว่างกันว่า Cryptography ซึ่ง secure shell (ssh) ก็ถือเป็นหนึ่งในการทำ Cryptography อย่างหนึ่งเช่นกัน แต่มันจะทำอะไรได้บ้างนั้น เรามาลองดูกันครับ

## Secure Shell and Client-Server
ก่อนเราจะเข้าใจ Secure Shell เรามาทวนเรื่อง Client-Server กันซักหน่อยก่อน 


![client-server architecture](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mntjpeml01tm0ftm379g.png)

การทำงานของ Client-Server นั้นจะมี client ขอส่ง request message เข้าหา server เพื่อทำการ manipulate บางสิ่ง จากนั้น return message response กลับไปให้ client เพื่อใช้งานต่อ ซึ่งจุดสังเกตุคือ หากว่ามีคนสามารถดักเส้นการส่ง message ดังกล่าวได้ แล้วแทรก message เพื่อโจมตี server หรือ client ระหว่างการขนส่ง (communication) ก็จะสร้างความเสียหายได้

ดังนั้นเพื่อป้องกันเหตุการดังกล่าว จึงจำเป็นต้องมีการเข้ารหัสข้อความเอาไว้ เหมือนใส่ข้อความไว้ในกล่องที่มี**แม่กุญแกล็อก**ไว้ และส่งออกไป จากนั้นเมื่อถึงปลายทางจึงให้คนที่มี**ลูกกุญแจ**เท่านั้น สามารถเปิดอ่านข้อความได้


![asymmetric key](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qdyl5yurt778pya6mv1s.png)

การทำ secure shell (ssh) เป็นการสร้างกุญแจ (key) รูปแบบ asymmetric key โดยจะมี

- public key: ที่ถูกแชร์ให้กับทุกคนที่ต้องการจะระบุตัวตนของข้อความ (verify)
- private key: จะถูกเก็บเอาไว้กับผู้ส่งข้อความเท่านั้น เพื่อทำการเข้ารหัส


![asymmetric key](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4g6bkq086kskb9dkr3u2.png)

## SSH with Github
โดยการประยุกต์ใช้ ssh ที่ชัดเจนที่สุดคือการระบุตัวตนในการเข้าถึง server เช่น การ login เข้า server ผ่าน client เพื่อส่งข้อมูล ส่งไฟล์ หรือแม้แต่การ remote control

การใช้งาน git นั้นสามารถใช้ ssh เพื่อเพิ่มความปลอดภัยในการทำงานร่วมกันภายในทีมได้ ในทางปฏิบัติแล้วการใช้ ssh จะทำให้เราเข้าถึง remote server บน git ได้โดยไม่ต้องให้ username หรือ personal access token ทุกครั้ง เพราะข้อมูลเหล่านั้นถูกเก็บไว้ใน ssh key-pair หมดแล้ว

**การตั้งค่า ssh และการใช้งานกับ github**

1. เปิด Terminal และสร้าง ssh key-pair (public & private) ด้วยคำสั่ง 
`ssh-keygen -t [algorithm] -C [comment message]` 

จากนั้นให้ระบุ path และชื่อไฟล์ที่ต้องการสร้าง รวมถึง password 


![generate ssh key-pair](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3eyr951lfhomrj37z2og.png)

2. ทำการนำ key-pair สร้างเป็น default ใน ssh config ของเครื่อง เพื่อที่ทุก ครั้งที่ request หา git จะใช้ key-pair นี้ โดยให้ใช้คำสั่งสร้าง config ใน folder .ssh ที่ root directory.

`vim ~/.ssh/config` 

จากนั้นใส่ config ตามด้านล่างลงไปและบันทึกการเปลี่ยนแปลง


![สร้าง ssh config file](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4m44qq31s6ii3tj665tx.png)

3. เพิ่ม public key ลงใน github account 
ทำการคัดลอกค่า public key เอาไว้

![github ssh create](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wuli4otjqug4clk4sjbr.png)

จากนั้นเปิด setting ของ github account และ copy ค่า public key ลงไปและบันทึก

![github ssh create](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ev0njoyeu906aqa18jc9.png)


![github ssh create](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/03afkv5359ggouxl2jda.png)

4. ทดสอบความถูกต้องด้วยการลองพยายาม secure shell เข้าที่ git remote server ด้วยคำสั่ง
`ssh -T git@github.com` 
หากขึ้นผลลัพท์ที่ถูกต้องจะเป็นอย่างรูปด้านล่าง


![ssh -T git@github.com result](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xraatao1npiaja1nhgx3.png)

## สรุป
การทำ secure shell เป็นการเพิ่มความปลอดภัยให้กับการส่งข้อมูลผ่านเครือข่าย โดยใน github เราสามารถใช้งาน ssh key-pair สำหรับการยืนยันตัวตนเพื่อทำงานร่วมกันภายใน github ได้ 

จริงๆ แล้วการทำ Cryptography ไม่ได้จำกัดเฉพาะ client-server หรือการส่งข้อมูลเพียงเท่านั้น แต่ยังสามารถใช้สำหรับงานอื่น อาทิเช่นการสร้าง transaction ใน blockchain ได้อีกด้วย ซึ่งจะเป็นอย่างไร เรามาติดตามกันต่อในบทความต่อๆ ไปครับ