Hướng dẫn thiết lập SSH Key-based Authentication – đăng nhập SSH không mật khẩu, an toàn hơn mật khẩu, cho phép tự động hóa (script, cron, CI/CD, Ansible).
Tại sao dùng SSH Key?
- An toàn hơn: Khóa riêng (private key) không bao giờ truyền qua mạng.
- Tự động hóa: Script backup, deploy, sync không cần nhập passphrase.
- Kháng brute-force: Vô hiệu hóa password auth → bot không tấn công được.
Bước 1: Tạo cặp khóa (Local machine)
# ssh-keygen -t ed25519 -C "user@hostname-$(date +%F)"
# Hoặc RSA 4096-bit (tương thích rộng):
# ssh-keygen -t rsa -b 4096 -C "user@hostname-$(date +%F)"
- -t ed25519: Thuật toán hiện đại, khóa nhỏ, nhanh, an toàn (khuyến khích).
- -C: Comment nhận diện khóa.
- Enter để chấp nhận đường dẫn mặc định
~/.ssh/id_ed25519. - Passphrase: Nên đặt (bảo vệ khóa riêng nếu máy bị mất). Dùng
ssh-agentđể không nhập lại.
Bước 2: Copy khóa công khai lên Server
Cách 1: ssh-copy-id (Dễ nhất)
# ssh-copy-id user@remoteserver.com
Cách 2: Thủ công (nếu không có ssh-copy-id)
# cat ~/.ssh/id_ed25519.pub | ssh user@remoteserver.com "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Bước 3: Cấp quyền đúng trên Server (Quan trọng!)
# chmod 700 ~/.ssh
# chmod 600 ~/.ssh/authorized_keys
# chmod 600 ~/.ssh/id_ed25519 # Private key
# chmod 644 ~/.ssh/id_ed25519.pub # Public key
Sai quyền → SSH từ chối key.
Bước 4: Test đăng nhập
# ssh user@remoteserver.com
# Nếu có passphrase: nhập 1 lần, ssh-agent ghi nhớ trong session.
Vô hiệu hóa đăng nhập mật khẩu (Hardening) – Trên SERVER
Sửa /etc/ssh/sshd_config:
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
Khởi động lại: systemctl restart sshd.
⚠️ Test key login THÀNH CÔNG trước khi tắt password!
Quản lý Passphrase với ssh-agent
# eval "$(ssh-agent -s)"
# ssh-add ~/.ssh/id_ed25519
# Nhập passphrase 1 lần → cache trong session.
Thêm vào ~/.bashrc để auto-start agent.
Chạy lệnh từ xa không tương tác
# ssh user@server "uptime; df -h"
# scp file.txt user@server:/path/
# rsync -avz /local/path/ user@server:/remote/path/
Cấu hình tiện lợi (~/.ssh/config)
Host myserver
HostName 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ForwardAgent yes # Cho phép dùng key local trên server (jump host)
Sau đó chỉ cần: ssh myserver.
Xoay vòng khóa (Key Rotation)
- Tạo khóa mới định kỳ (6-12 tháng).
- Thêm public key mới vào
authorized_keysserver. - Xóa key cũ khỏi
authorized_keys. - Cập nhật
~/.ssh/confignếu đổi tên file.