DeployEasy
Menu
LinuxCơ bản

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.

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

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:

  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.

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