ถ้าใครจะตั้งค่า SSH สำหรับ Remote Server อื่นๆ ก็ใช้หลักการเดียวกันได้ เพียงแต่ในบทความนี้ยกตัวอย่าง GitHub
บทความนี้จะแบ่งจะเป็น 2 ส่วนใหญ่ๆ คือฝั่ง Unix-based (Mac OS, Ubuntu, WSL) และฝั่ง Windows ครับ ก่อนจะเข้าเรื่อง ผมขออธิบายหลักการของ SSH เบื้องต้นนะครับ การเชื่อมต่อผ่าน SSH หรือ Secure Shell นั้น คือการเชื่อมต่อไปเครื่องต้นทาง (Local) ไปยังเครื่องปลายทาง (Remote) ผ่านการเข้ารหัส ซึ่งมั่นใจได้ว่าการเชื่อมต่อนั้นปลอดภัยในระดับที่ยอมรับได้ในระดับสากล
ในการเชื่อมต่อนั้นจะเป็นแบบ Asymmetric Encryption หรือ การเข้ารหัสแบบไม่สมมาตร โดยก่อนจะมีการส่งข้อมูลจะมีการสร้างคู่ของกุญแจ ที่ก็ต้องใช้ร่วมกันเท่านั้น เราจะเรียกว่า Public key และ Private key ซึ่งวิธีเข้ารหัสที่ได้รับนิยมคือ RSA
โดยก่อนที่จะมีการส่งข้อมูลจะมีการเข้ารหัสด้วย Public Key ทุกครั้ง และเมื่อข้อมูลถูกส่งมายั่งเครื่องต้นทางที่มี Private key แล้วก็จะสามารถถอดรหัสเพื่อเห็นข้อมูลจริงๆ ได้
สามารถอ่านเพิ่มได้ที่ 4 Cryptography Concept ที่ Developer ทุกคนควรรู้ โดยคุณ Kittitorn Kanokwalai
ก่อนที่เข้าเรื่องในบทความนี้จะเป็นวิธีการใช้ OpenSSH ที่ใช้อยากแพร่หลายใน Linux และ Mac มาอย่างยาวนาน และแนะนำวิธีการตั้งค่า OpenSSH บน Windows (แทนที่จะเป็น Putty) โดยการใช้งาน OpenSSH จะมี ssh-agent
ที่เป็น service ที่ทำงานหลังบ้าน เพื่อให้เราสามารถนำ key ของเราไปเชื่อมต่อกับ server ปลายทางได้
สร้าง SSH key
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/id_rsa
Note: ถ้าเป็น Windows ต้องใส่
-f ~/.ssh/id_rsa
ไม่งั้นจะ error ว่า SSH-Keygen "no such file or directory"
Copy ข้อมูลในไฟล์ ~/.ssh/id_rsa.pub
(ซึ่งก็คือ Public Key) ไปวางที่ GitHub account settings (https://github.com/settings/keys).
ติดตั้ง SSH Agent
eval "$(ssh-agent -s)"
Add ตัว private key
ssh-add ~/.ssh/id_rsa
ลองทดสอบ SSH key:
$ ssh -T git@github.com
Hi [Your Username]! You've successfully authenticated, but GitHub does not provide shell access.
ไปยังโฟลเดอร์ที่ของ Git Repo ในเครื่องเราแล้วเปลี่ยน Git remote ให้เป็นแบบ SSH
$ git remote set-url origin git@github.com:username/your-repository.git
จากนั้นลอง commit และ push ดู ระบบไม่ควรถามหารหัสผ่านแล้ว
Ref: Finnian Anderson, GitHub Official Doc
เมื่อปี 2018 ผมได้เขียนบทความ วิธีตั้งค่าการใช้งาน Github (แบบไม่ต้องกรอกรหัสผ่านทุกครั้ง) ผ่าน SSH บน Windows ซึ่งได้แนะนำวิธีการใช้ Putty สำหรับทำงานเป็นเบื้องหลัง แต่เราจำเป็นต้องเปิดตัว agent ขึ้นมาทุกครั้ง หรือถ้าไม่อย่างนั้นก็ต้อง ตั้งค่า startup เอง
เมื่อปี 2019 Windows ได้ปล่อยความสามารถอย่างหนึ่งคือ OpenSSH Client ที่เป็น service อยู่บน Windows ซึ่งดีมากๆ เลย ที่เราไม่ต้องพึ่งโปรแกรมอื่นๆ อย่างเช่น Putty
ในหัวข้อนี้จะเน้นที่ Powershell เท่านั้นนะครับ ถ้าใครใช้ WSL หรือ Git Bash บน Windows แล้วแนะนำให้ใช้หัวข้อข้างบนแทน
OpenSSH ได้ถูกปล่อยออกมาเป็นส่วนหนึ่งของ Windows 10 ทำให้เราสามารถใช้คำสั่ง SSH ผ่าน cmd หรือ powershell ได้ เพื่อให้สามารถใช้งาน OpenSSH ได้เราจำเป็นจะต้องติดตั้ง OpenSSH และสั่งให้ service ssh-agent
ทำงานเบื้องหลังไว้
เปิด Manage optional features
จาก start menu แล้วติดตั้ง OpenSSH Client
เปิด Powershell แบบ Admin
Get-Service -Name ssh-agent | Set-Service -StartupType Automatic
Get-Service -Name ssh-agent | Set-Service -Status Running
แนะนำให้อ่านบทความการตั้งค่า OpenSSH ของ Microsoft เพิ่มเติม
ถ้าใครไม่ถนัดการใช้ผ่าน command-line สามารถดูการตั้งค่าแบบ UI ได้ที่ newbedev.com หรือ SSH keys on Windows 10 โดย Richard Ballard
สามารถใช้วิธีการเดียวกันจาก Mac OS, Ubuntu, WSL ได้เลย ที่เขียนไว้แล้วข้างบน
เราสามารถใช้งานทั้ง Mac OS, Ubuntu, WSL และ Windows เลย โดยมี 2 วิธี ขอบคุณ Daniel Dogeanu
ssh-agent
by issuing the ssh-add
command and entering your passphrase:ssh-add $HOME/.ssh/your_file_name
ถ้าใครจะใช้ SSH Key มากกว่าหนึ่ง แนะนำให้ใช้วิธีการที่ 2 ซึ่งเราสามารถ setup ชื่อของ Host ที่แตกต่างกันได้ เมื่อเราใช้คนละ account กัน แนะนำให้ดูเพิ่มใน หัวข้อที่ 4. การใช้งานหลาย Key ในเครื่องเดียวกัน
~/.ssh/config
$HOME\.ssh\config
Host *
AddKeysToAgent yes
IdentitiesOnly yes
โดยที่เราสามารถใส่ config ของ SSH key ที่เราสร้างขึ้นมาได้ หรือจะสามารถใส่หลาย key ได้ด้วย
Host github.com
HostName github.com
User your_user_name
IdentityFile ~/.ssh/your_file_name
เราสามารถใช้งานทั้ง Mac OS, Ubuntu, WSL และ Windows เลย
โดยการเข้าไปแก้ไขไฟล์ ~/.ssh/config
และเพิ่มหัวข้อ Host ใหม่ โดยในทีนี้ผมเลือกให้ Host github.com
เป็นค่าเริ่มต้นของ account github ส่วนตัว และใช้ Host work.github.com
เป็น host สำหรับ account github ที่ทำงาน
Host *
AddKeysToAgent yes
IdentitiesOnly yes
Host github.com
HostName github.com
User personal-user
IdentityFile ~/.ssh/personal_rsa
Host work.github.com
HostName github.com
User work-user
IdentityFile ~/.ssh/work_rsa
ลองตรวจสอบดูว่า key ของเราถูกติดตั้งหรือยัง?
ssh-add -l
4096 SHA256:XXXXXXXXXXXXXX personal@email.com (RSA)
4096 SHA256:XXXXXXXXXXXXXX work@email.com (RSA)
ตัวอย่างวิธีการใช้ เราสามารถใช้
## สำหรับเปลี่ยน Remote location ของบัญชีส่วนตัว
git remote set-url origin git@work.github.com:your-username/your-repo.git
## สำหรับเปลี่ยน Clone ของบัญชีส่วนตัว
git clone git@work.github.com:your-username/your-repo.git
ซึ่งตรงนี้จะเหมือนกับหน้าเว็บ GitHub แนะนำเลย
แต่ถ้าเราจะใช้ Host work.github.com
เป็น host สำหรับ account github ที่ทำงาน เพียงแค่เปลี่ยน host ใน URL เท่านั้นเอง
## สำหรับเปลี่ยน Remote location ของบัญชีที่ทำงาน
git remote set-url origin git@github.com:your-username/your-repo.git
## สำหรับเปลี่ยน Remote location ของบัญชีที่ทำงาน
git clone origin git@github.com:your-username/your-repo.git
eval "$(ssh-agent -s)"
เพื่อ Start Agent ขึ้นมา (เฉพาะ Mac, Linux, WSL)$ ssh-add -l
Could not open a connection to your authentication agent.
ssh-add /path/key
ไปก่อน เพื่อเพิ่ม key เข้าไป$ ssh-add -l
The agent has no identities.
ssh -vv -T git@work.github.com
ถ้าลองทำแล้วได้ไม่ได้ยังไง มาแบ่งปันกันได้นะครับ
เราจำเป็นต้องใช้ SourceTree แบบ Admin ถ้าสังเกตุในหัวข้อ 2.1 เตรียม SSH สำหรับ Windows 10 มีการสั่งให้ service
ssh-agent
เริ่มทำงาน จำเป็นต้องใช้สิทธิ Admin ไปด้วยในการใช้งานบน SourceTree มิเช่นนั้นมันจะ Error "ssh-agent failed with code-1 system.componentmodel.win32exception access is denied"
Sourcetree สามารถอ่านไฟล์ ~/.ssh/config
ได้ ดังนั้น custom hostname เราจะสามารถใช้งานได้
ให้เราอัพเดท Remote ไปที่
git@work.github.com:your-username/your-repo.git