DeployEasy
LinuxCơ bản

SSH Key là gì? Đăng nhập VPS không cần mật khẩu an toàn

Hướng dẫn tạo SSH key trên Windows, Linux và macOS, thêm public key vào VPS, cấu hình alias, permission và sửa lỗi publickey an toàn.

· 7 phút đọc· 1.476 từ
Mục lục bài viết

Cách SSH key xác thực đăng nhập VPS không cần mật khẩu

SSH Key là gì? SSH key là cặp khóa public–private dùng để xác thực khi đăng nhập VPS mà không gửi mật khẩu qua mỗi phiên kết nối. Public key được đặt trong authorized_keys trên server; private key phải ở lại máy cá nhân và nên được bảo vệ bằng passphrase.

Hướng dẫn này áp dụng cho PowerShell, Linux và macOS: tạo khóa ED25519, copy public key lên VPS, sửa permission, tạo SSH alias, kiểm tra bằng chế độ verbose và chỉ tắt đăng nhập mật khẩu sau khi đã thử key trong một terminal mới.

Tóm tắt nhanh: Giữ private key bí mật; chỉ copy file .pub; đặt ~/.ssh là 700 và authorized_keys là 600; kiểm tra user/owner; giữ phiên cũ khi thay đổi cấu hình SSH.

Sơ đồ luồng cho SSH Key là gì

Demo terminal: xác nhận đúng key trước khi tắt mật khẩu

Mở một terminal thứ hai và chỉ định rõ private key. Khi đăng nhập thành công, kiểm tra sudo, sau đó mới cân nhắc tắt PasswordAuthentication. Không đóng phiên quản trị cũ trong lúc thử.

Terminal demo cho SSH Key là gì

ssh -i ~/.ssh/id_ed25519 -v deploy@203.0.113.10
id
sudo whoami
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
sudo sshd -t

Lưu ý: Output trong ảnh và ví dụ là demo lab đã ẩn thông tin nhạy cảm. Khi chụp terminal thật, hãy che IP quản trị, username nội bộ, token, private key, mật khẩu và chuỗi kết nối database.

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:

  1. Client đưa ra public key muốn dùng.
  2. Server kiểm tra key có được cho phép không.
  3. Client chứng minh mình sở hữu private key tương ứng.
  4. 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/

HostHostName

  • 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:

  1. User sudo hoạt động.
  2. SSH key đăng nhập thành công.
  3. Đã test từ terminal thứ hai.
  4. 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ộ

  1. Tạo key mới.
  2. Thêm public key mới.
  3. Test đăng nhập.
  4. Xóa public key cũ khỏi tất cả server.
  5. Kiểm tra log.
  6. 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.

Bài viết liên quan

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