SSH key là gì? Cách đăng nhập máy chủ không cần mật khẩu

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.

Cửa sổ terminal GNOME hiển thị lệnh ssh-keygen và danh sách file khóa trong thư mục .ssh

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:

  1. Máy chủ gửi tín hiệu thử thách (challenge) — một chuỗi số ngẫu nhiên.
  2. 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ố.
  3. Máy chủ xác minh chữ ký bằng public key đã lưu trong ~/.ssh/authorized_keys.
  4. 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.
Sơ đồ luồng xác thực SSH key: client ký thử thách bằng private key, server xác minh bằng public key

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 tra authorized_keys có đú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-init hoặc console provider.
  • Private key lọt lên Git — thêm .ssh/ vào .gitignore ngay 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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

nftables là gì? Tường lửa Linux thế hệ mới thay thế iptables

nftables là gì? Tường lửa Linux thế hệ mới thay thế iptables nftables là hệ thống lọc và phân loại gói tin trong nhân Linux, có mặt từ nhân 3.13…

Xem thêm

systemd là gì? Quản lý dịch vụ và tiến trình khởi động trên Linux

systemd là gì? Trình quản lý dịch vụ và tiến trình khởi động trên Linux systemd là gì? systemd là trình quản lý tiến trình và dịch vụ tiêu chuẩn…

Xem thêm

Mã tận là gì? Kỹ thuật sửa lỗi truyền thông số hiệu quả

Mã tận (Convolutional code) là một lớp mã sửa lỗi tạo ra các ký hiệu kiểm tra bằng cách trượt một hàm đa thức Boolean trên dòng dữ liệu. Nhờ…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất