SSH Key là gì? Đăng nhập VPS an toàn không cần mật khẩu
Hướng dẫn tạo SSH key, thêm public key vào VPS, cấu hình SSH alias, sửa permission và xử lý lỗi publickey trên Windows, Linux.
Mục lục bài viết
VPS & Hosting cho dự án của bạn
Khám phá các gói máy chủ và lưu trữ phù hợp từ website cá nhân đến ứng dụng production.
SSH là công cụ quan trọng khi quản trị VPS Linux từ xa. Bạn có thể dùng SSH để mở terminal, thực thi lệnh, chuyển file và tự động deploy.
SSH là gì?
SSH là viết tắt của Secure Shell. Đây là giao thức đăng nhập và chạy lệnh từ xa qua kết nối mã hóa.
ssh user@server-ip
Ví dụ:
ssh thien@203.0.113.10
SSH mặc định thường dùng port 22.
SSH key là gì?
SSH key là một cặp khóa:
Private key → giữ bí mật trên máy cá nhân
Public key → đặt trên VPS
Server lưu public key được phép trong:
~/.ssh/authorized_keys
Khi đăng nhập:
- Client đưa ra public key muốn dùng.
- Server kiểm tra key có được cho phép không.
- Client chứng minh mình sở hữu private key tương ứng.
- Private key không được gửi lên server.
Private key và public key
Private key
Ví dụ:
~/.ssh/id_ed25519
Không được:
- Gửi cho người khác.
- Dán lên chat.
- Commit Git.
- Đặt trong source project.
- Lưu công khai.
Nên bảo vệ bằng passphrase.
Public key
Ví dụ:
~/.ssh/id_ed25519.pub
Nội dung có dạng:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... laptop
Public key có thể đặt trên nhiều server.
Tạo SSH key trên Windows
Mở PowerShell:
ssh-keygen -t ed25519 -C "deployeasy-laptop"
Nhấn Enter để dùng đường dẫn mặc định:
C:\Users\YourName\.ssh\id_ed25519
Sau đó nhập passphrase.
Xem public key:
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
Tạo SSH key trên Linux/macOS
ssh-keygen -t ed25519 -C "deployeasy-laptop"
File:
~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub
Xem:
cat ~/.ssh/id_ed25519.pub
Thêm public key vào VPS
Dùng ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub thien@203.0.113.10
Thêm thủ công
Đăng nhập bằng mật khẩu:
ssh thien@203.0.113.10
Tạo thư mục:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
Mở:
nano ~/.ssh/authorized_keys
Dán toàn bộ public key trên một dòng:
chmod 600 ~/.ssh/authorized_keys
Kiểm tra owner:
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
Nếu sai:
sudo chown -R thien:thien /home/thien/.ssh
Gửi từ PowerShell
type $env:USERPROFILE\.ssh\id_ed25519.pub |
ssh thien@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Chỉ dùng file .pub, không gửi private key.
Kiểm tra đăng nhập
Windows:
ssh -i $env:USERPROFILE\.ssh\id_ed25519 thien@203.0.113.10
Linux/macOS:
ssh -i ~/.ssh/id_ed25519 thien@203.0.113.10
Nếu key ở đường dẫn mặc định:
ssh thien@203.0.113.10
Vì sao chỉ định sai tên key vẫn đăng nhập được?
Ví dụ:
ssh -i ~/.ssh/id_ed25520 thien@server
File không tồn tại nhưng SSH vẫn có thể:
- Thử key mặc định.
- Dùng key từ ssh-agent.
- Đọc key trong config.
- Chuyển sang đăng nhập mật khẩu.
Xem chi tiết:
ssh -vvv thien@203.0.113.10
Tìm:
Offering public key
Server accepts key
Authenticated to
SSH agent
SSH agent giữ key trong bộ nhớ để giảm số lần nhập passphrase.
Linux/macOS:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l
Windows:
Get-Service ssh-agent
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519
Tạo SSH alias
Windows:
C:\Users\YourName\.ssh\config
Linux/macOS:
~/.ssh/config
Nội dung:
Host deployeasy-vps
HostName 203.0.113.10
User thien
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Kết nối:
ssh deployeasy-vps
SCP:
scp file.txt deployeasy-vps:/home/thien/
Host và HostName
Host: alias tự đặt.HostName: IP hoặc domain thật.
Không viết placeholder:
HostName server-ip
nếu chưa thay bằng IP thật.
Permission chuẩn
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
Kiểm tra cả đường dẫn:
namei -l ~/.ssh/authorized_keys
OpenSSH có thể từ chối key nếu thư mục hoặc file cho phép user khác ghi.
Tắt đăng nhập mật khẩu
Chỉ thực hiện sau khi:
- User sudo hoạt động.
- SSH key đăng nhập thành công.
- Đã test từ terminal thứ hai.
- Có console khôi phục của nhà cung cấp.
Tạo file:
sudo nano /etc/ssh/sshd_config.d/99-deployeasy.conf
Ví dụ:
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin no
Kiểm tra:
sudo sshd -t
Reload:
sudo systemctl reload ssh
Giữ phiên hiện tại mở rồi thử đăng nhập lại.
Có nên đổi port SSH?
Đổi port giúp giảm bot quét port 22 nhưng không thay thế:
- SSH key.
- Firewall.
- Update.
- Least privilege.
- Monitoring.
Nếu đổi port, phải mở port mới trên firewall trước khi reload SSH.
Lỗi Permission denied (publickey)
Sai user
Key nằm ở:
/home/thien/.ssh/authorized_keys
nhưng bạn đăng nhập user khác.
Sai key
ssh -i ~/.ssh/id_ed25519 thien@server
Public key bị xuống dòng
Mỗi key phải nằm trọn trên một dòng.
Permission sai
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R "$USER":"$USER" ~/.ssh
Home directory sai
getent passwd thien
ls -ld /home/thien
Xem log
sudo journalctl -u ssh --since "10 minutes ago"
Cảnh báo host key changed
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
Đây là host key của server, không phải key đăng nhập user.
Nguyên nhân hợp lệ:
- VPS được cài lại.
- IP được cấp cho máy khác.
- Host key được tạo lại.
Cũng có thể là kết nối bị can thiệp. Hãy xác minh fingerprint qua console hoặc nhà cung cấp trước.
Sau khi xác minh:
ssh-keygen -R 203.0.113.10
Dùng nhiều key
id_ed25519_personal
id_ed25519_work
id_ed25519_deployeasy
Config:
Host deployeasy-vps
HostName 203.0.113.10
User thien
IdentityFile ~/.ssh/id_ed25519_deployeasy
IdentitiesOnly yes
Key riêng giúp thu hồi dễ hơn.
Khi private key bị lộ
- Tạo key mới.
- Thêm public key mới.
- Test đăng nhập.
- Xóa public key cũ khỏi tất cả server.
- Kiểm tra log.
- Thu hồi key khỏi CI/CD hoặc dịch vụ liên quan.
Checklist
[ ] Tạo Ed25519 key
[ ] Đặt passphrase
[ ] Chỉ copy public key
[ ] .ssh permission 700
[ ] authorized_keys permission 600
[ ] Test ở terminal thứ hai
[ ] Có console khôi phục
[ ] Chỉ tắt password sau khi test
[ ] Không commit private key
[ ] Dùng key riêng cho CI/CD
[ ] Thu hồi key không còn sử dụng
Câu hỏi thường gặp
Một key dùng cho nhiều VPS được không?
Có, nhưng key riêng theo mục đích giúp thu hồi và kiểm soát tốt hơn.
authorized_keys chứa nhiều key được không?
Có. Mỗi key thường nằm trên một dòng.
SSH key có hết hạn không?
Key OpenSSH thông thường không tự hết hạn. Bạn cần quy trình xoay vòng và thu hồi.
Quên passphrase có lấy lại được không?
Không. Hãy dùng phương thức truy cập khác để thêm key mới.
Kết luận
SSH key an toàn khi private key được bảo vệ, permission đúng, user được giới hạn quyền và key cũ được thu hồi kịp thời.
Nguồn tham khảo
Đọc tiếp
Bài viết liên quan
Linux File System khi deploy: /etc, /var, /home và /opt
Giải thích cấu trúc thư mục Linux quan trọng khi deploy production: /etc, /var, /home, /opt, /tmp, /usr, log, config và dữ liệu.
Đọc bài →Linux Permission, User, Group và sudo cho môi trường production
Hướng dẫn quyền Linux rwx, chmod, chown, user, group, sudo, umask, setgid và cách phân quyền thư mục deploy an toàn.
Đọc bài →Tạo systemd service cho Node.js: Tự chạy sau khi VPS reboot
Hướng dẫn tạo systemd service cho Node.js/NestJS, cấu hình User, WorkingDirectory, EnvironmentFile, restart, log và graceful shutdown.
Đọc bài →