
SSH key là gì? Đó là một cặp khoá mật mã gồm public key (khoá công khai) và private key (khoá riêng tư), dùng để xác thực bạn là ai khi đăng nhập vào máy chủ từ xa mà không cần gõ mật khẩu. Khoá công khai đặt trên máy chủ, khoá riêng tư giữ kín trên máy của bạn — hai thứ này được sinh ra cùng nhau nhưng vai trò hoàn toàn khác nhau.

SSH (Secure Shell) là giao thức mã hoá dùng để quản lý và truy cập máy chủ từ xa. Mặc định, SSH xác thực bằng mật khẩu — và đó là điểm yếu lớn nhất: mật khẩu có thể bị đoán (brute-force), bị đánh cắp qua keylogger, hoặc bị lộ trong script tự động hoá. SSH key thay thế toàn bộ mật khẩu bằng cặp khoá bất đối xứng, khiến việc tấn công dò mật khẩu trở nên vô nghĩa.
Cơ chế hoạt động
Quá trình bắt tay (handshake) diễn ra theo kiểu “thách thức — phản hồi”, không bao giờ truyền khoá bí mật qua mạng:
- Máy chủ gửi tín hiệu thử thách (challenge) — một chuỗi số ngẫu nhiên.
- Máy khách dùng private key của bạn để ký chuỗi thử thách đó thành một chữ ký số.
- Máy chủ xác minh chữ ký bằng public key đã lưu trong
~/.ssh/authorized_keys. - Chữ ký khớp thì phiên đăng nhập được mở. Không có gì bí mật từng byte nào đi trên đường truyền.

Sinh cặp khoá
Mở terminal và chạy lệnh sau — lệnh này dùng thuật toán Ed25519, được khuyến nghị hơn RSA vì khoá ngắn hơn, nhanh hơn và an toàn hơn với cùng độ mạnh:
ssh-keygen -t ed25519 -C "may-cua-toi"
Sau đó bạn sẽ được hỏi passphrase. Đây là mật khẩu bảo vệ private key — mất private key là mất toàn bộ quyền truy cập, nên đừng bao giờ để trống nếu laptop có thể bị lấy cắp.
Sinh ra hai file:
~/.ssh/id_ed25519— khoá riêng tư, không bao giờ gửi cho ai, không commit lên Git.~/.ssh/id_ed25519.pub— khoá công khai, an toàn để chia sẻ.
Kiểm tra nội dung khoá công khai bằng cat ~/.ssh/id_ed25519.pub. Đó là một dòng bắt đầu bằng ssh-ed25519 và kết thúc bằng tên máy của bạn.
Đưa khoá công khai lên máy chủ
Cách nhanh nhất là chạy lệnh này từ máy của bạn, thay user@host bằng thông tin thật:
ssh-copy-id user@host
Lệnh sẽ hỏi mật khẩu một lần duy nhất, rồi tự động chép khoá công khai vào ~/.ssh/authorized_keys trên máy chủ. Nếu máy chủ dùng cổng khác 22, thêm -p 2222.
Nếu không có ssh-copy-id, bạn có thể làm thủ công:
cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Quyền trên file là quan trọng: authorized_keys phải là 600 và thư mục .ssh là 700, nếu không OpenSSH sẽ từ chối đăng nhập vì nghi vấn cấu hình không an toàn.
Cấu hình để tiện hơn
Thêm vào ~/.ssh/config để không phải gõ địa chỉ dài mỗi lần:
Host ten-server
HostName 192.168.1.100
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Từ giờ chỉ cần gõ ssh ten-server. Cờ IdentitiesOnly yes rất quan trọng nếu bạn có nhiều khoá — nó buộc SSH chỉ dùng đúng khoá đã khai báo, tránh việc server từ chối do quá nhiều lần thử khoá.
Agent forwarding và ssh-agent
Khi bạn SSH vào máy chủ A rồi từ máy A SSH tiếp vào máy chủ B, bạn cần truyền khoá qua. ssh-agent giữ khoá trong bộ nhớ của tiến trình nền để bạn không phải nhập passphrase nhiều lần:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Đây chính là agent forwarding. Cần cảnh báo: tính năng này có rủi ro — máy chủ trung gian có thể dùng agent của bạn để đăng nhập đi places khác trong thời gian phiên đó. Với server công cộng, hãy dùng -o ForwardAgent=no và cấu hình khoá riêng trên từng máy.
Tắt đăng nhập bằng mật khẩu
Chỉ khi bạn đã chắc chắn SSH key hoạt động, hãy tắt mật khẩu trên máy chủ. Sửa /etc/ssh/sshd_config:
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password
Reload dịch vụ: sudo systemctl reload sshd. Giữ một phiên SSH đang mở trong khi kiểm tra, để không tự khoá chính mình ra khỏi máy chủ.
So sánh nhanh
| Tiêu chí | Mật khẩu | SSH key |
|---|---|---|
| Chống brute-force | Yếu | Không thể dò |
| Dùng cho tự động hoá | Rất bất tiện | Tự nhiên |
| Phân quyền | Không | Có, từng khoá một user |
| Thu hồi | Đổi mật khẩu | Xoá dòng trong authorized_keys |
| Nguy cơ lộ khi máy bị đánh cắp | Cao | Trung bình (cần passphrase) |
Lỗi thường gặp
Permission denied (publickey)— kiểm tra quyền file (600/700), kiểm traauthorized_keyscó đúng user không, thửssh -vđể xem log chi tiết.- Đăng nhập vòng lặp — nếu bạn dùng SSH để sửa chính config SSH hãy giữ phiên cũ mở song song.
- Quên passphrase và mất private key — không có cách khôi phục, chỉ có thể thêm khoá mới qua
cloud-inithoặc console provider. - Private key lọt lên Git — thêm
.ssh/vào.gitignorengay từ đầu.
Nguồn tham khảo: trang chính thức OpenSSH, tài liệu ssh-keygen, tài liệu ssh_config.
