GitHub/GitLab Access Token vs SSH Key: เลือกวิธี Authentication ที่ปลอดภัย
การเลือกวิธีการยืนยันตัวตนกับ GitHub หรือ GitLab เป็นหนึ่งในตัดสินใจสำคัญสำหรับนักพัฒนา มีสองวิธีหลักที่นิยม: Access Token และ SSH Key บทความนี้จะเปรียบเทียบความแตกต่างและช่วยให้คุณเลือกวิธีที่เหมาะสมที่สุดสำหรับงานของคุณ
Access Token คืออะไร
Access Token เป็นสตริงข้อความยาวที่ GitHub หรือ GitLab สร้างขึ้นเพื่อใช้ยืนยันตัวตนแทนรหัสผ่าน Token นี้ให้สิทธิ์ในการเข้าถึง Repository และ API ผ่านการเชื่อมต่อ HTTP/HTTPS
ข้อดีของ Access Token:
- ทำให้ใช้งานง่าย - สร้างและใช้งานได้อย่างรวดเร็ว ไม่ต้องสร้าง Key Pair
- ง่ายต่อการปรับปรุง - สามารถ Rotate หรือ Regenerate ได้ง่ายผ่าน Web Interface
- ควบคุมสิทธิ์แบบละเอียด - สามารถกำหนด Fine-grained Scopes และระยะเวลาหมดอายุ (Expiration)
- ใช้งานกับ CI/CD ได้ดี - เหมาะสำหรับ Automated Scripts และ Third-party Applications
- รองรับหลายประเภท - รองรับทั้ง Personal Access Token (PAT) และ OAuth Token
SSH Key คืออะไร
SSH Key เป็นคู่กุญแจสำหรับเข้ารหัส (Cryptographic Key Pair) ที่ประกอบด้วย Public Key และ Private Key ใช้สำหรับยืนยันตัวตนโดยไม่ต้องส่งรหัสผ่านข่าวสาร
ข้อดีของ SSH Key:
- ปลอดภัยสูงกว่า - ใช้ SSH Protocol และการเข้ารหัสแบบสองกุญแจแทนการส่งรหัสผ่าน
- ไม่ต้องเก็บรหัสผ่านข่าวสาร - เก็บเฉพาะ Private Key บนเครื่องของคุณ
- ใช้งานได้นานกว่า - SSH Key ไม่มีระยะเวลาหมดอายุโดยค่าเริ่มต้น
- เหมาะสำหรับ Automation - ใช้ได้ดีสำหรับ Server-to-Server Authentication และ Deployment Scripts
- ไม่มีข้อจำกัด Port - ใช้ SSH Protocol (Port 22) ซึ่งอาจผ่านไฟร์วอลล์บางแห่ง
เปรียบเทียบ Access Token กับ SSH Key
| คุณลักษณะ | Access Token | SSH Key |
| ความยุ่งยาก | ง่าย เพียงสร้างจาก Web Interface | ซับซ้อนกว่า ต้องสร้าง Key Pair |
| การควบคุมสิทธิ์ | สามารถกำหนดเพื่อให้ละเอียด | มักให้สิทธิ์เต็มที่สำหรับ Repository |
| การยกเลิก (Revoke) | ง่าย ทำได้ผ่าน Web Interface ทันที | มีความยุ่งยาดเพราะต้องลบจากเซิร์ฟเวอร์ |
| โปรโตคอล | HTTP/HTTPS เท่านั้น | SSH Protocol (Port 22) |
| การใช้งานบนหลาย Device | ใช้ได้ง่ายบนเครื่องต่างๆ | แต่ละเครื่องต้องมี Private Key ของตัวเอง |
| ระยะเวลาหมดอายุ | สามารถกำหนดให้มีการหมดอายุได้ | ไม่มีการหมดอายุโดยค่าเริ่มต้น |
สำหรับ GitHub:
- เข้าไป Settings ในบัญชี GitHub ของคุณ
- คลิก Developer settings
- คลิก Personal access tokens
- คลิก Generate new token
- ตั้งชื่อ Token และเลือก Scopes ที่ต้องการ
- กำหนดวันหมดอายุ (Expiration)
- คลิก Generate token และคัดลอก Token ไว้
สำหรับ GitLab:
- เข้าไป Settings ในบัญชี GitLab ของคุณ
- คลิก Access Tokens
- คลิก Create personal access token
- ตั้งชื่อและเลือก Scopes
- กำหนดวันหมดอายุ
- คลิก Create personal access token
1. สร้าง SSH Key Pair:
# สร้าง Ed25519 SSH Key (แนะนำ)
ssh-keygen -t ed25519 -C "your_email@example.com"
# หรือใช้ RSA Key (ความเข้ากันได้ดีกว่า)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
ระบบจะถามที่เก็บ Key และ Passphrase ให้กด Enter เพื่อใช้ค่าเริ่มต้นหรือกำหนดเอง
2. เพิ่ม Public Key ไปยัง GitHub/GitLab:
# สำหรับ GitHub
1. เข้า GitHub Settings
2. คลิก SSH and GPG keys
3. คลิก New SSH key
4. Paste Public Key (ที่ไฟล์ ~/.ssh/id_ed25519.pub)
5. คลิก Add SSH key
# สำหรับ GitLab
1. เข้า GitLab Settings
2. คลิก SSH Keys
3. Paste Public Key
4. คลิก Add key
3. ทดสอบการเชื่อมต่อ SSH:
# ทดสอบเชื่อมต่อ GitHub
ssh -T git@github.com
# ควรเห็นข้อความ: Hi [username]! You've successfully authenticated...
# ทดสอบเชื่อมต่อ GitLab
ssh -T git@gitlab.com
ใช้งาน Access Token กับ Git
# Clone Repository ด้วย HTTPS (Access Token)
git clone https://github.com/username/repository.git
# ระบบจะถามชื่อผู้ใช้และรหัสผ่าน
# Username: your_username
# Password: your_personal_access_token
# หรือใส่ Token ในการเชื่อมต่อ
git clone https://your_token@github.com/username/repository.git
ใช้งาน SSH Key กับ Git
# Clone Repository ด้วย SSH
git clone git@github.com:username/repository.git
# ระบบจะใช้ Private Key สำหรับการยืนยันตัวตนโดยอัตโนมัติ
# ชั้นแรก ต้องเพิ่ม SSH Key ไปยัง SSH Agent
ssh-add ~/.ssh/id_ed25519
เลือก Access Token เมื่อ:
- ใช้งานใน CI/CD Pipelines เช่น GitHub Actions, GitLab CI ที่ต้องเก็บ Credentials ในตัวแปรสภาพแวดล้อม (Environment Variables)
- ต้องการ ควบคุมสิทธิ์แบบละเอียด โดยกำหนดเฉพาะสิ่งที่แอปพลิเคชันต้องการ
- ทำงานกับ Third-party Applications เช่น GitHub CLI หรือเครื่องมือ Integrations
- ต้องการ ความสะดวกสบาย ในการสร้างและลบอย่างรวดเร็ว
- ใช้งาน API Calls จากโปรแกรมประยุกต์
เลือก SSH Key เมื่อ:
- ต้องการ ความปลอดภัยสูงสุด สำหรับการทำงานในเครื่องส่วนตัว (Local Development)
- ทำงาน Server-to-Server Authentication เช่น Deployment Scripts บน VPS
- ต้องการ ไม่เคลื่อนไหว โดยไม่ต้องกำหนดระยะเวลาหมดอายุ
- ใช้งาน Enterprise Deployments ที่มีความต้องการด้านความปลอดภัยสูง
- ทำงานบน Multiple Servers ที่ต้อง Centralized Key Management
Best Practices สำหรับการเลือก Authentication
- ใช้ SSH Key สำหรับ Local Development - เป็นวิธีที่ปลอดภัยและเป็นมาตรฐาน
- ป้องกัน Private Key - ไม่ควรเชื่อ Private Key ลง Version Control หรือแชร์ออนไลน์
- ใช้ Passphrase สำหรับ SSH Key - เพิ่มชั้นความปลอดภัยพิเศษ
- ใช้ SSH Agent - สำหรับการใช้งานสะดวก โดยไม่ต้องพิมพ์ Passphrase ทุกครั้ง
- กำหนด Expiration สำหรับ Access Token - ลดความเสี่ยงจากการรั่วไหล
- Rotate Credentials เป็นประจำ - สร้าง Token หรือ Key ใหม่อย่างน้อยทุก 90 วัน
- ตรวจสอบและลบ Credentials ที่ไม่ใช้ - ลบ Token หรือ SSH Key เก่าที่ไม่จำเป็น
- ใช้ Fine-grained Scopes - ให้สิทธิ์เพียงสิ่งที่จำเป็นเท่านั้น
- สำหรับ Deployment Scripts บน VPS ควรใช้ SSH Key เพราะความปลอดภัยและเสถียรภาพ
- สำหรับ CI/CD Pipeline ที่เรียกใช้ API ของ GitHub/GitLab ให้ใช้ Personal Access Token และเก็บไว้ใน Environment Variables
- ควร Rotate SSH Keys และ Tokens เป็นประจำ โดยเฉพาะในสภาพแวดล้อม Production
- ใช้ Passphrase สำหรับ SSH Key บนเซิร์ฟเวอร์เพื่อป้องกันการใช้ Brute Force
สรุป
การเลือกระหว่าง Access Token และ SSH Key ขึ้นอยู่กับความต้องการของคุณ:
- SSH Key เป็นทางเลือกที่ดีสำหรับการพัฒนาในเครื่องส่วนตัว (Local Development) และ Deployment Scripts เนื่องจากมีความปลอดภัยสูง
- Access Token เหมาะสมสำหรับ CI/CD Pipelines และการใช้งาน API เนื่องจากสามารถควบคุมสิทธิ์ได้ละเอียด
- Best Practice คือการใช้ SSH Key สำหรับ Local Development และ Server-to-Server Authentication พร้อมกับการ Rotate Keys เป็นประจำ
- หากใช้งาน ผู้ให้บริการโฮสติ้ง Cloud Hosting หรือ Cloud VPS ให้จำไว้ว่าการเลือกวิธี Authentication ที่ปลอดภัยเป็นส่วนหนึ่งของการบริหารความเสี่ยง (Risk Management)