Chuyển đến nội dung chính

Tự động hóa triển khai với Git deploy keys: Thiết lập an toàn cho GitHub và GitLab

Hướng dẫn thiết lập Git Deploy Key chuẩn bảo mật để kéo mã nguồn tự động từ GitHub hoặc GitLab về máy chủ Production: Phân quyền Read-Only, cấu hình SSH Config và tích hợp Webhook tự động cập nhật.

Git Deploy Keys cho máy chủ

Giới thiệu: Vấn đề bảo mật khi tải mã nguồn trên máy chủ Production

Khi triển khai ứng dụng lên máy chủ Linux, bạn cần kéo mã nguồn từ kho Git riêng (Private Repository) trên GitHub hoặc GitLab...

Nhiều lập trình viên thường mắc phải một trong hai lỗi bảo mật nghiêm trọng sau:

  1. Sử dụng Personal Access Token (PAT) hoặc Mật khẩu cá nhân: Nếu máy chủ bị xâm nhập, kẻ tấn công có thể dùng Token đó để truy cập vào TẤT CẢ các dự án khác thuộc tài khoản của bạn.
  2. Sao chép SSH Key cá nhân của bạn lên máy chủ: Khóa cá nhân này có quyền Read & Write trên toàn bộ tổ chức hoặc tài khoản của bạn.

Giải pháp chuẩn mực quốc tế là sử dụng Git Deploy Key:

  • Quyền hạn tối thiểu (Principle of Least Privilege): Deploy Key chỉ có quyền truy cập vào ĐÚNG DUY NHẤT một repository cụ thể.
  • Chỉ đọc (Read-Only): Mặc định Deploy Key chỉ có quyền kéo code (git pull, git clone), không thể đẩy (push) hay can thiệp vào các nhánh mã nguồn.
  • Độc lập hoàn toàn: Nếu máy chủ bị tấn công, bạn chỉ cần xóa bỏ Deploy Key của repository đó mà không ảnh hưởng đến bất kỳ tài khoản hay dự án nào khác.

1. Tạo cặp khóa SSH riêng biệt cho Deploy Key

Đăng nhập vào máy chủ VPS của bạn với tài khoản chạy ứng dụng (ví dụ: devadmin hoặc nodeapp):

bash
# Đăng nhập bằng user quản trị
su - devadmin

Tạo một cặp khóa SSH mới dành riêng cho dự án này:

bash
ssh-keygen -t ed25519 -C "deploy-key-myapp-prod" -f ~/.ssh/id_ed25519_myapp
  • Nhấn Enter hai lần để không đặt Passphrase (vì tiến trình CI/CD và tự động hóa cần đọc khóa mà không bị dừng lại yêu cầu nhập mật khẩu).

Phân quyền bảo mật nghiêm ngặt cho file khóa:

bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_myapp
chmod 644 ~/.ssh/id_ed25519_myapp.pub

In nội dung khóa công khai ra màn hình để chuẩn bị thêm vào GitHub / GitLab:

bash
cat ~/.ssh/id_ed25519_myapp.pub

Sao chép toàn bộ chuỗi ký tự hiển thị (dạng ssh-ed25519 AAAA... deploy-key-myapp-prod).


2. Thêm Deploy Key vào GitHub hoặc GitLab

Thao tác trên GitHub:

  1. Truy cập vào Repository của bạn trên GitHub.
  2. Vào Settings > Deploy Keys (ở thanh menu bên trái).
  3. Nhấp nút Add deploy key.
  4. Title: Đặt tên gợi nhớ (ví dụ: Production Server - Singapore VPS).
  5. Key: Dán chuỗi Public Key vừa copy ở bước 1.
  6. Allow write access: KHÔNG ĐƯỢC TÍCH CHỌN (giữ nguyên chế độ Read-Only an toàn).
  7. Bấm Add key.

Thao tác trên GitLab:

  1. Vào Settings > Repository > Deploy keys.
  2. Nhập tiêu đề và dán Public Key, đảm bảo tắt tùy chọn Write access allowed.

3. Cấu hình file ~/.ssh/config trên máy chủ

Để Git tự động nhận diện đúng file khóa id_ed25519_myapp mỗi khi thao tác với repository của dự án:

Mở file ~/.ssh/config:

bash
nano ~/.ssh/config

Thêm khối cấu hình bí danh (Host Alias):

ini
Host github-myapp
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_myapp
    IdentitiesOnly yes
    StrictHostKeyChecking accept-new

Phân quyền cho file config:

bash
chmod 600 ~/.ssh/config

4. Kiểm tra kết nối và Clone mã nguồn

Kiểm tra kết nối đến GitHub thông qua Host Alias:

bash
ssh -T git@github-myapp

Nếu thành công, GitHub sẽ phản hồi thông điệp: Hi username/repository! You've successfully authenticated, but GitHub does not provide shell access.

Bây giờ bạn có thể clone mã nguồn về thư mục đích (Lưu ý: Thay thế phần domain github.com bằng github-myapp):

bash
# Thay vì: git clone git@github.com:mycompany/my-app.git
# Hãy dùng:
git clone git@github-myapp:mycompany/my-app.git /var/www/my-app

5. Viết Script tự động cập nhật code (deploy.sh)

Tạo file script /var/www/my-app/deploy.sh:

bash
#!/bin/bash
set -e

echo "=== BẮT ĐẦU CẬP NHẬT ỨNG DỤNG ==="
cd /var/www/my-app

# Kéo mã nguồn mới nhất từ nhánh main
git fetch origin main
git reset --hard origin/main

# Cài đặt thư viện phụ thuộc
npm ci --production

# Build ứng dụng
npm run build

# Khởi động lại dịch vụ qua Systemd hoặc Docker
sudo systemctl restart my-app

echo "=== CẬP NHẬT HOÀN TẤT THÀNH CÔNG ==="

Cấp quyền thực thi cho script:

bash
chmod +x /var/www/my-app/deploy.sh

Bảng so sánh các phương thức xác thực Git trên máy chủ

Phương thứcMức độ bảo mậtRủi ro rò rỉĐề xuất sử dụng
Personal Access Token (PAT)KémLộ toàn bộ tài khoản cá nhân và các repo khác❌ Không khuyến nghị
User SSH Key cá nhânKémCó quyền Write trên toàn bộ kho dự án❌ Không khuyến nghị
Git Deploy KeyRất caoChỉ ảnh hưởng 1 repo duy nhất, chỉ có quyền Read✅ Khuyến nghị hàng đầu
GitHub App / CI RunnerRất caoToken tạm thời tự hết hạn trong phiên chạy✅ Phù hợp cho hạ tầng Enterprise lớn

Tổng kết

Bằng cách sử dụng Git Deploy Key kết hợp với cấu hình ~/.ssh/config, bạn đã thiết lập một luồng phân phối mã nguồn an toàn, tự động hóa cao và tuân thủ chặt chẽ các tiêu chuẩn an toàn thông tin doanh nghiệp.

💬

Thảo luận & Bình luận

Đăng nhập bằng tài khoản GitHub để đặt câu hỏi hoặc đóng góp ý kiến cho bài viết.