Sử dụng Ssh Key Trong Github Actions là một phương pháp quan trọng để tự động hóa các tác vụ cần truy cập vào máy chủ hoặc các dịch vụ bên ngoài một cách an toàn. Nếu bạn đang xây dựng quy trình CI/CD (Continuous Integration/Continuous Delivery) trên GitHub Actions và cần một giải pháp để xác thực, bài viết này sẽ cung cấp cho bạn một hướng dẫn toàn diện, từ cơ bản đến nâng cao, để triển khai SSH key một cách hiệu quả và bảo mật.
Tại sao cần dùng SSH Key trong GitHub Actions?
GitHub Actions giúp bạn tự động hóa các công việc trong quy trình phát triển phần mềm. Tuy nhiên, đôi khi bạn cần thực hiện các tác vụ như:
- Triển khai ứng dụng lên server: Cần truy cập vào server để sao chép file, khởi động lại dịch vụ.
- Chạy script trên server: Thực hiện các lệnh quản trị hệ thống.
- Kết nối đến các dịch vụ bên ngoài: Truy cập databases, APIs.
Để thực hiện các tác vụ này một cách an toàn, SSH key là một lựa chọn lý tưởng hơn so với việc sử dụng mật khẩu, vì nó cung cấp một cơ chế xác thực mạnh mẽ hơn và ít rủi ro hơn. Thay vì lưu trữ mật khẩu trực tiếp trong mã nguồn hoặc cấu hình, bạn sử dụng cặp khóa công khai (public key) và khóa bí mật (private key). Khóa công khai được đặt trên server mà bạn muốn truy cập, còn khóa bí mật được giữ an toàn trong GitHub Actions.
“Sử dụng SSH key không chỉ tăng cường bảo mật mà còn đơn giản hóa quy trình tự động hóa, giúp bạn tập trung vào phát triển phần mềm thay vì lo lắng về vấn đề xác thực,” theo anh Nguyễn Hoàng Nam, một chuyên gia DevOps với hơn 10 năm kinh nghiệm.
SSH Key là gì và cách thức hoạt động?
SSH (Secure Shell) là một giao thức mạng cho phép bạn kết nối đến một máy chủ từ xa một cách an toàn. SSH key là một cặp khóa mật mã, bao gồm khóa công khai (public key) và khóa bí mật (private key), được sử dụng để xác thực người dùng mà không cần mật khẩu.
- Khóa công khai: Được chia sẻ với server mà bạn muốn truy cập. Nó được sử dụng để mã hóa dữ liệu.
- Khóa bí mật: Được giữ bí mật và chỉ được sử dụng bởi bạn. Nó được sử dụng để giải mã dữ liệu được mã hóa bằng khóa công khai.
Khi bạn kết nối đến server bằng SSH, client (máy tính của bạn) sẽ gửi khóa công khai của mình đến server. Server sau đó sẽ sử dụng khóa công khai này để mã hóa một thông điệp và gửi lại cho client. Client sẽ sử dụng khóa bí mật của mình để giải mã thông điệp này. Nếu giải mã thành công, server sẽ xác thực client.
Tạo SSH Key
Trước khi sử dụng SSH key trong GitHub Actions, bạn cần tạo một cặp khóa SSH. Bạn có thể sử dụng lệnh ssh-keygen
trên máy tính của mình.
-
Mở terminal hoặc command prompt.
-
Nhập lệnh sau:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
-t rsa
: Chỉ định loại khóa là RSA.-b 4096
: Chỉ định độ dài khóa là 4096 bit (độ dài khóa càng lớn, độ bảo mật càng cao).-C "[email protected]"
: Thêm một comment vào khóa (thường là địa chỉ email của bạn).
-
Bạn sẽ được hỏi nơi lưu khóa. Bạn có thể chọn vị trí mặc định (
~/.ssh/id_rsa
) hoặc chỉ định một vị trí khác. -
Bạn sẽ được hỏi nhập passphrase (mật khẩu bảo vệ khóa). Bạn có thể nhập một mật khẩu hoặc để trống (không nên để trống để tăng cường bảo mật).
Sau khi hoàn thành, bạn sẽ có hai file:
id_rsa
: Khóa bí mật (private key). Giữ file này an toàn và không chia sẻ với bất kỳ ai.id_rsa.pub
: Khóa công khai (public key).
Thêm SSH Key vào Server
Sau khi tạo SSH key, bạn cần thêm khóa công khai (id_rsa.pub
) vào file ~/.ssh/authorized_keys
trên server mà bạn muốn truy cập.
- Sao chép nội dung của file
id_rsa.pub
. Bạn có thể sử dụng lệnhcat ~/.ssh/id_rsa.pub
để hiển thị nội dung của file. - Kết nối đến server bằng SSH (sử dụng mật khẩu nếu cần).
- Mở file
~/.ssh/authorized_keys
bằng một text editor (ví dụ:nano ~/.ssh/authorized_keys
). Nếu file này chưa tồn tại, hãy tạo nó. - Dán nội dung của file
id_rsa.pub
vào file~/.ssh/authorized_keys
. Đảm bảo rằng mỗi khóa công khai nằm trên một dòng riêng biệt. - Lưu và đóng file
~/.ssh/authorized_keys
.
Lưu ý quan trọng: Đảm bảo rằng thư mục ~/.ssh
và file ~/.ssh/authorized_keys
có quyền truy cập phù hợp. Thông thường, quyền nên là 700
cho thư mục ~/.ssh
và 600
cho file ~/.ssh/authorized_keys
. Bạn có thể sử dụng lệnh chmod
để thay đổi quyền:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Lưu trữ SSH Key một cách an toàn trong GitHub Secrets
Bây giờ bạn đã có SSH key và đã thêm khóa công khai vào server, bạn cần lưu trữ khóa bí mật một cách an toàn trong GitHub Actions. GitHub cung cấp một tính năng gọi là “Secrets” để lưu trữ thông tin nhạy cảm như SSH key, API key, mật khẩu.
- Truy cập repository của bạn trên GitHub.
- Click vào tab “Settings”.
- Chọn “Secrets” > “Actions”.
- Click vào “New repository secret”.
- Nhập tên cho secret (ví dụ:
SSH_PRIVATE_KEY
). - Dán nội dung của file
id_rsa
vào ô “Value”. Đảm bảo bạn sao chép toàn bộ nội dung của file, bao gồm cả dòng-----BEGIN RSA PRIVATE KEY-----
và-----END RSA PRIVATE KEY-----
. - Click “Add secret”.
Lưu ý quan trọng: Đảm bảo bạn không vô tình commit khóa bí mật vào repository của mình. Điều này có thể gây ra hậu quả nghiêm trọng về bảo mật. GitHub sẽ tự động quét các commit để tìm kiếm các khóa bí mật đã biết và cảnh báo bạn nếu phát hiện ra.
Sử dụng SSH Key trong GitHub Actions Workflow
Sau khi lưu trữ SSH key trong GitHub Secrets, bạn có thể sử dụng nó trong workflow của mình. Bạn cần sử dụng một action để thiết lập SSH key trước khi thực hiện bất kỳ tác vụ nào cần truy cập SSH.
Dưới đây là một ví dụ về workflow sử dụng SSH key để kết nối đến server và chạy một script:
name: Deploy to Server
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Install SSH client
run: apt-get update && apt-get install -y openssh-client
- name: Add SSH key to agent
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Deploy to server
run: |
ssh user@your_server_ip "bash /path/to/deploy.sh"
Giải thích:
name: Install SSH client
: Cài đặt SSH client trên môi trường GitHub Actions.name: Add SSH key to agent
: Sử dụng actionwebfactory/[email protected]
để thêm SSH key vào SSH agent. Action này sẽ tự động khởi động SSH agent và thêm khóa bí mật từ secretSSH_PRIVATE_KEY
vào agent.with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
: Chỉ định secret chứa khóa bí mật.secrets.SSH_PRIVATE_KEY
là cách bạn truy cập secret đã được lưu trữ trong GitHub Secrets.name: Deploy to server
: Sử dụng lệnhssh
để kết nối đến server và chạy scriptdeploy.sh
. Thay thếuser@your_server_ip
bằng thông tin đăng nhập và địa chỉ IP của server của bạn. Thay thế/path/to/deploy.sh
bằng đường dẫn đến script deploy trên server.
“Việc sử dụng
webfactory/ssh-agent
giúp đơn giản hóa việc quản lý SSH key trong workflow. Bạn không cần phải lo lắng về việc lưu trữ khóa bí mật trực tiếp trong file cấu hình,” chị Trần Thu Hương, một kiến trúc sư giải pháp đám mây, cho biết.
Bạn có thể tham khảo thêm về [triển khai ci/cd cho project php](https://mekong.wiki/devops-tu-dong-hoa/ci-cd-co-ban/trien-khai-ci-cd-cho-project-php/)
để hiểu rõ hơn về quy trình CI/CD.
Mẹo bảo mật khi sử dụng SSH Key trong GitHub Actions
-
Sử dụng passphrase cho SSH key: Mặc dù không bắt buộc, việc sử dụng passphrase sẽ tăng cường bảo mật cho SSH key của bạn. Nếu ai đó có được khóa bí mật của bạn, họ vẫn cần phải biết passphrase để sử dụng nó.
-
Giới hạn quyền truy cập của SSH key: Khi thêm khóa công khai vào file
~/.ssh/authorized_keys
, bạn có thể giới hạn quyền truy cập của khóa bằng cách sử dụng các tùy chọn nhưcommand=
,from=
,no-port-forwarding
,no-X11-forwarding
,no-agent-forwarding
,no-pty
. Ví dụ:command="/path/to/script.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2E...
Trong ví dụ này, khóa công khai chỉ được phép chạy script
/path/to/script.sh
và không được phép thực hiện port forwarding, X11 forwarding, agent forwarding hoặc tạo PTY. -
Sử dụng SSH key riêng cho GitHub Actions: Không sử dụng SSH key mà bạn dùng cho các mục đích khác. Tạo một SSH key riêng biệt chỉ dành cho GitHub Actions. Điều này giúp giảm thiểu rủi ro nếu SSH key bị lộ.
-
Kiểm tra lại quyền truy cập của thư mục
~/.ssh
và file~/.ssh/authorized_keys
: Đảm bảo rằng quyền truy cập được thiết lập đúng cách (700 cho thư mục và 600 cho file). Nếu quyền truy cập quá rộng, kẻ tấn công có thể thay đổi nội dung của file~/.ssh/authorized_keys
và giành quyền truy cập vào server của bạn.
Các vấn đề thường gặp và cách khắc phục
-
Lỗi “Permission denied (publickey)”: Lỗi này thường xảy ra khi SSH key chưa được thiết lập đúng cách. Hãy kiểm tra lại các bước sau:
- Đảm bảo rằng bạn đã thêm khóa công khai vào file
~/.ssh/authorized_keys
trên server. - Kiểm tra lại quyền truy cập của thư mục
~/.ssh
và file~/.ssh/authorized_keys
. - Đảm bảo rằng bạn đã nhập đúng user và hostname khi kết nối đến server.
- Kiểm tra xem server có cho phép xác thực bằng SSH key hay không.
- Đảm bảo rằng bạn đã thêm khóa công khai vào file
-
Lỗi “Could not open SSH connection”: Lỗi này có thể do nhiều nguyên nhân, bao gồm:
- Server không hoạt động.
- Firewall chặn kết nối SSH.
- Địa chỉ IP hoặc hostname của server không chính xác.
-
Không thể truy cập secret trong GitHub Actions: Đảm bảo rằng bạn đã lưu trữ secret đúng cách trong GitHub Secrets và bạn đang sử dụng đúng tên secret trong workflow.
Tối ưu hóa quy trình làm việc với SSH Key
Để tối ưu hóa quy trình làm việc với SSH key trong GitHub Actions, bạn có thể áp dụng một số kỹ thuật sau:
-
Sử dụng SSH config file: Bạn có thể tạo một file
~/.ssh/config
trên môi trường GitHub Actions để lưu trữ các cấu hình SSH, chẳng hạn như hostname, user, port, identityfile. Điều này giúp bạn đơn giản hóa các lệnh SSH trong workflow. Ví dụ:Host your_server Hostname your_server_ip User user Port 22 IdentityFile ~/.ssh/id_rsa
Sau đó, bạn có thể sử dụng lệnh
ssh your_server
thay vìssh user@your_server_ip
. -
Sử dụng SSH multiplexing: SSH multiplexing cho phép bạn sử dụng lại một kết nối SSH đã được thiết lập để thực hiện nhiều tác vụ. Điều này có thể giúp giảm thời gian kết nối và cải thiện hiệu suất. Để sử dụng SSH multiplexing, bạn cần thêm các tùy chọn sau vào file
~/.ssh/config
:ControlMaster auto ControlPath ~/.ssh/control-%r@%h:%p ControlPersist 600
Sau đó, bạn có thể sử dụng lệnh
ssh -M your_server
để khởi động một kết nối multiplexing. Các lệnhssh your_server
sau đó sẽ sử dụng lại kết nối này. -
Sử dụng SSH agent forwarding: SSH agent forwarding cho phép bạn sử dụng SSH key trên máy tính của mình để xác thực trên server từ xa. Điều này có thể hữu ích nếu bạn cần truy cập vào nhiều server khác nhau từ server ban đầu. Tuy nhiên, SSH agent forwarding có thể gây ra rủi ro bảo mật, vì vậy hãy sử dụng nó một cách cẩn thận.
Kết luận
Sử dụng SSH key trong GitHub Actions là một phương pháp quan trọng để bảo mật quy trình CI/CD của bạn. Bằng cách làm theo hướng dẫn trong bài viết này, bạn có thể thiết lập và sử dụng SSH key một cách hiệu quả và an toàn. Hãy nhớ luôn tuân thủ các biện pháp bảo mật tốt nhất để bảo vệ khóa bí mật của bạn và giảm thiểu rủi ro. Việc bảo mật quy trình CI/CD không chỉ bảo vệ mã nguồn và dữ liệu của bạn, mà còn đảm bảo tính liên tục và tin cậy của quá trình phát triển phần mềm.
Câu hỏi thường gặp (FAQ)
-
SSH Key có an toàn hơn mật khẩu không?
Có, SSH Key an toàn hơn mật khẩu vì nó sử dụng mã hóa khóa công khai, khó bị tấn công brute-force hơn và không dễ bị đánh cắp như mật khẩu. SSH Key sử dụng cặp khóa công khai và bí mật, giúp xác thực mà không cần truyền mật khẩu qua mạng.
-
Làm thế nào để tạo SSH Key trên Windows?
Bạn có thể sử dụng Git Bash (đi kèm với Git) hoặc Windows Subsystem for Linux (WSL) để tạo SSH Key. Mở terminal và sử dụng lệnh
ssh-keygen -t rsa -b 4096 -C "[email protected]"
và làm theo hướng dẫn. -
Secret GitHub Actions là gì?
Secret GitHub Actions là các biến môi trường được mã hóa, được sử dụng để lưu trữ thông tin nhạy cảm như SSH Key, API Key, mật khẩu. Chúng được lưu trữ an toàn và chỉ có thể truy cập trong quá trình chạy workflow.
-
Tôi có thể sử dụng lại một SSH Key cho nhiều repository GitHub không?
Mặc dù có thể, nhưng không nên. Để bảo mật tốt hơn, hãy tạo một SSH Key riêng cho mỗi repository. Điều này giúp hạn chế thiệt hại nếu một trong các khóa bị xâm phạm.
-
Nếu tôi làm lộ SSH Key bí mật thì sao?
Ngay lập tức vô hiệu hóa SSH Key bị lộ bằng cách xóa nó khỏi file
authorized_keys
trên server và tạo một SSH Key mới. Đồng thời, kiểm tra các hệ thống đã sử dụng khóa bị lộ để đảm bảo không có truy cập trái phép. -
Có cách nào để tự động rotate SSH Key trong GitHub Actions không?
Có, bạn có thể sử dụng các công cụ và script để tự động rotate SSH Key định kỳ. Tuy nhiên, quy trình này khá phức tạp và đòi hỏi kiến thức về quản lý khóa và tự động hóa.
-
Tại sao tôi nhận được lỗi “Permission denied (publickey)” khi sử dụng SSH Key trong GitHub Actions?
Lỗi này thường xảy ra do khóa công khai chưa được thêm vào file
~/.ssh/authorized_keys
trên server, hoặc quyền truy cập của thư mục~/.ssh
và file~/.ssh/authorized_keys
không đúng. Hãy kiểm tra lại các bước cài đặt và đảm bảo rằng khóa công khai được thêm đúng cách và quyền truy cập được thiết lập chính xác.