Chuyển đến nội dung chính

Xác thực SSH Key từ cơ bản đến nâng cao: Ed25519, SSH Config và Bảo mật đa tầng

Cẩm nang toàn diện về xác thực SSH Key trên máy chủ Linux: So sánh Ed25519 vs RSA, cấu hình SSH Config quản lí hàng chục VPS, chuyển tiếp Agent Forwarding, và các qui tắc bảo mật chống lộ khóa.

Xác thực SSH Key Linux

Giới thiệu: Tại sao mật khẩu truyền thống không còn an toàn?

Giao thức SSH (Secure Shell) là cánh cổng chính để các kĩ sư hệ thống truy cập và quản lí các máy chủ Linux từ xa. Tuy nhiên, phương thức đăng nhập bằng mật khẩu (Password-based Authentication) tiềm ẩn nhiều rủi ro nghiêm trọng:

  • Dễ bị tấn công vét cạn (Brute-force) và tấn công từ điển (Dictionary Attack) bởi hàng triệu botnet tự động quét Internet mỗi ngày.
  • Người dùng có xu hướng đặt mật khẩu dễ nhớ hoặc tái sử dụng mật khẩu trên nhiều máy chủ.
  • Rủi ro bị nghe lén hoặc ghi lại bàn phím (Keylogger) trên máy khách.

Phương thức xác thực bằng Cặp khóa bất đối xứng (SSH Key Pair Authentication) giải quyết triệt để những điểm yếu này. Một cặp khóa gồm:

  1. Private Key (Khóa bí mật): Lưu giữ an toàn trên máy tính cá nhân của bạn, không bao giờ chia sẻ cho bất kì ai.
  2. Public Key (Khóa công khai): Đặt trên máy chủ đích tại file ~/.ssh/authorized_keys.

Khi kết nối, máy chủ gửi một thử thách mã hóa (Cryptographic Challenge) và chỉ có người sở hữu Private Key tương ứng mới có thể giải mã và phản hồi, cho phép đăng nhập tức thì mà không cần truyền mật khẩu qua mạng.


1. Lựa chọn thuật toán: Tại sao nên chọn Ed25519 thay vì RSA?

Trong nhiều năm, thuật toán RSA (2048-bit hoặc 4096-bit) là tiêu chuẩn phổ biến nhất. Tuy nhiên, hiện nay Ed25519 (Elliptic Curve Cryptography - Mã hóa đường cong Elliptic) đã trở thành lựa chọn vượt trội được khuyến nghị trên toàn cầu.

So sánh Ed25519 và RSA:

  • Độ dài khóa cực ngắn: Ed25519 chỉ có 68 ký tự (khóa công khai), giúp dễ dàng sao chép và quản lý, trong khi RSA-4096 dài hơn 700 ký tự.
  • Tốc độ tính toán: Tạo khóa và ký xác thực nhanh gấp nhiều lần so với RSA.
  • Độ an toàn mật mã: Cung cấp mức độ bảo mật tương đương khóa RSA 3072-bit nhưng có khả năng chống lại các cuộc tấn công kênh phụ (Side-channel Attacks).

2. Các bước tạo cặp khóa SSH Ed25519 chuẩn mực

Trên máy tính cá nhân của bạn (macOS, Linux hoặc Windows Terminal), mở Terminal và chạy lệnh:

bash
ssh-keygen -t ed25519 -C "[email protected]"

Quá trình tạo khóa sẽ yêu cầu bạn nhập:

  1. File lưu trữ: Nhấn Enter để lưu mặc định tại ~/.ssh/id_ed25519.
  2. Passphrase (Mật mã bảo vệ khóa): Nhập một cụm mật mã mạnh để mã hóa Private Key của bạn trên đĩa.

Kiểm tra cặp khóa đã được tạo thành công:

bash
ls -la ~/.ssh/id_ed25519*
  • id_ed25519: File Private Key (Quyền 600 - Bảo mật tuyệt đối).
  • id_ed25519.pub: File Public Key (Có thể chia sẻ công khai).

3. Sao chép Public Key lên máy chủ từ xa

Cách 1: Sử dụng tiện ích ssh-copy-id (Tự động & Khuyến nghị)

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub devadmin@<IP_MÁY_CH>

Cách 2: Thiết lập thủ công (Áp dụng cho Windows CMD hoặc môi trường hạn chế)

Đăng nhập vào VPS và chạy các lệnh:

bash
# Tạo thư mục .ssh trên máy chủ nếu chưa có
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# Mở file authorized_keys và dán nội dung id_ed25519.pub vào
nano ~/.ssh/authorized_keys

# Phân quyền bảo mật cho file authorized_keys
chmod 600 ~/.ssh/authorized_keys

4. Quản lí hàng chục VPS dễ dàng với file ~/.ssh/config

Nếu bạn phải quản lí nhiều máy chủ với IP, cổng và tài khoản khác nhau, việc gõ lệnh ssh -p 2222 [email protected] -i ~/.ssh/key_aws mỗi ngày là vô cùng phiền toái.

Hãy cấu hình file ~/.ssh/config trên máy tính cá nhân của bạn:

bash
nano ~/.ssh/config

Thêm các bí danh (Host Aliases) thân thiện:

ini
# Máy chủ Web Production
Host web-prod
    HostName 203.0.113.50
    User devadmin
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60

# Máy chủ Database nội bộ
Host db-internal
    HostName 10.0.0.15
    User dbadmin
    Port 22
    IdentityFile ~/.ssh/id_ed25519_db
    ProxyJump web-prod

# Máy chủ Staging
Host staging
    HostName 198.51.100.22
    User ubuntu
    IdentityFile ~/.ssh/id_ed25519

Bây giờ, để kết nối vào máy chủ Web Production, bạn chỉ cần gõ duy nhất:

bash
ssh web-prod

SSH Client sẽ tự động lấy đúng IP, Port, User và File khóa để kết nối tức thì!


5. Tự động lưu Passphrase với SSH Agent

Để không phải nhập lại Passphrase mỗi lần kết nối SSH trong phiên làm việc, bạn có thể nạp khóa vào ssh-agent:

bash
# Khởi động ssh-agent
eval "$(ssh-agent -s)"

# Nạp khóa vào bộ nhớ RAM của agent
ssh-add ~/.ssh/id_ed25519

Trên macOS, bạn có thể thêm cấu hình sau vào ~/.ssh/config để Keychain tự động nhớ Passphrase vĩnh viễn:

ini
Host *
    AddKeysToAgent yes
    UseKeychain yes
    IdentityFile ~/.ssh/id_ed25519

6. Vô hiệu hóa hoàn toàn xác thực Mật khẩu trên máy chủ

Sau khi đã kiểm tra đăng nhập bằng SSH Key thành công, hãy khóa hoàn toàn cửa sau (Password Authentication) trên máy chủ:

Mở file /etc/ssh/sshd_config trên VPS:

bash
sudo nano /etc/ssh/sshd_config

Đảm bảo các giá trị sau:

ini
PasswordAuthentication no
ChallengeResponseAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes

Kiểm tra cú pháp và khởi động lại SSH daemon:

bash
sudo sshd -t
sudo systemctl restart ssh

Bảng tổng kết phân quyền thư mục SSH

Phân quyền không đúng trên Linux sẽ khiến SSH từ chối nhận khóa vì lí do an toàn. Hãy luôn nhớ bảng quyền sau:

Thư mục / Tệp tinVị tríPhân quyền bắt buộcLệnh thiết lập
~/.ssh/Cả Client & Server700 (rwx------)chmod 700 ~/.ssh
id_ed25519 (Private)Máy Client cá nhân600 (rw-------)chmod 600 ~/.ssh/id_ed25519
id_ed25519.pub (Public)Máy Client cá nhân644 (rw-r--r--)chmod 644 ~/.ssh/id_ed25519.pub
authorized_keysMáy Server từ xa600 (rw-------)chmod 600 ~/.ssh/authorized_keys
~/.ssh/configMáy Client cá nhân600 (rw-------)chmod 600 ~/.ssh/config

Lời kết

Sử dụng SSH Key với thuật toán Ed25519 kết hợp file cấu hình ~/.ssh/config là tiêu chuẩn vàng của mọi kĩ sư DevOps chuyên nghiệp. Bạn vừa nâng tầm bảo mật cho máy chủ của mình lên mức tối đa, vừa tiết kiệm được rất nhiều thời gian đăng nhập mỗi ngày.

💬

Thảo luận & Bình luận

Đăng nhập bằng tài khoản GitHub để đặt câu hỏi hoặc đóng góp ý kiến cho bài viết.