Cấu Hình SSH Key Authentication
Giới Thiệu
Xác thực SSH bằng cặp khóa (SSH Key Authentication) là một phương pháp an toàn và hiệu quả để đăng nhập vào máy chủ từ xa. Thay vì sử dụng mật khẩu dễ bị tấn công brute-force hoặc đoán, bạn sẽ sử dụng một cặp khóa mã hóa: một khóa riêng (private key) được giữ bí mật trên máy tính cục bộ của bạn và một khóa công khai (public key) được đặt trần máy chủ từ xa. Khi bạn cố gắng kết nối, máy chủ sẽ thách thức máy khách xác minh rằng nó sở hữu khóa riêng tương ứng. Phương pháp này không chỉ bảo mật hơn mà còn tiện lợi hơn, cho phép bạn kết nối mà không cần nhập mật khẩu mỗi lần.
📋 Thời gian: 15-20 phút | Độ khó: Cơ bản
Yêu Cầu
Để thực hiện theo hướng dẫn này, bạn cần có:
- Máy khách SSH (SSH Client): Hầu hết các hệ điều hành Linux và macOS đều có SSH client được cài đặt sẵn. Đối với Windows, bạn có thể sử dụng PowerShell, Command Prompt (từ Windows 10 trở lên), Windows Subsystem for Linux (WSL), hoặc các công cụ như PuTTY/Git Bash.
- Máy chủ SSH (SSH Server): Một máy chủ từ xa đã được cấu hình và đang chạy dịch vụ SSH (thường là
sshd). Bạn cần có quyền truy cập vào máy chủ này, ít nhất là bằng mật khẩu ban đầu hoặc qua một user có quyềnsudo. - Quyền truy cập Terminal/Command Prompt: Để chạy các lệnh.
Các Bước Thực Hiện
Bước 1: Tạo cặp khóa SSH (Generate SSH Key Pair)
Đầu tiên, bạn cần tạo cặp khóa SSH trên máy tính cục bộ của mình.
ssh-keygen -t rsa -b 4096 -C "[email protected]"
ssh-keygen: Lệnh để tạo cặp khóa SSH.-t rsa: Chỉ định loại thuật toán là RSA. Mặc dùed25519là thuật toán hiện đại và được khuyến nghị hơn, RSA vẫn rất phổ biến. Nếu muốn dùnged25519, bạn có thể dùngssh-keygen -t ed25519 -C "[email protected]".-b 4096: Đặt độ dài khóa là 4096 bit cho RSA (mạnh hơn 2048 bit mặc định). Không cần thiết choed25519vì nó có độ dài cố định.-C "[email protected]": Thêm một comment vào khóa công khai để dễ dàng nhận diện.
Khi chạy lệnh, bạn sẽ được hỏi:
- Enter file in which to save the key: Nhấn Enter để chấp nhận vị trí mặc định (
~/.ssh/id_rsa). - Enter passphrase (empty for no passphrase): Bạn nên nhập một mật khẩu bảo vệ (passphrase) cho khóa riêng của mình. Mật khẩu này sẽ được yêu cầu mỗi khi bạn sử dụng khóa riêng, tăng cường bảo mật. Nếu bạn để trống, bạn sẽ không cần nhập gì khi kết nối, nhưng khóa riêng của bạn sẽ không được bảo vệ.
- Enter same passphrase again: Nhập lại passphrase.
✅ Sau khi hoàn tất, bạn sẽ thấy hai tệp trong thư mục ~/.ssh/:
id_rsa(hoặcid_ed25519): Khóa riêng tư của bạn. Tuyệt đối không chia sẻ tệp này với bất kỳ ai!id_rsa.pub(hoặcid_ed25519.pub): Khóa công khai của bạn. Bạn có thể chia sẻ tệp này với các máy chủ mà bạn muốn kết nối.
Bước 2: Sao chép khóa công khai lên máy chủ (Copy Public Key to Server)
Bây giờ, bạn cần sao chép khóa công khai (id_rsa.pub) từ máy cục bộ của mình lên máy chủ từ xa.
Có hai phương pháp chính:
Phương pháp 1: Sử dụng ssh-copy-id (khuyến nghị)
Đây là cách dễ nhất và an toàn nhất. ssh-copy-id sẽ tự động tạo thư mục .ssh và tệp authorized_keys với quyền hạn chính xác nếu chúng chưa tồn tại.
ssh-copy-id username@remote_host
username: Tên người dùng trên máy chủ từ xa.remote_host: Địa chỉ IP hoặc tên miền của máy chủ từ xa.
Lần đầu chạy lệnh này, bạn sẽ được yêu cầu nhập mật khẩu của username trên remote_host. Sau khi nhập đúng, khóa công khai của bạn sẽ được sao chép và cấu hình trên máy chủ.
Phương pháp 2: Sao chép thủ công
Nếu ssh-copy-id không có sẵn hoặc bạn muốn làm thủ công, bạn có thể thực hiện như sau:
-
Hiển thị nội dung khóa công khai trên máy cục bộ:
cat ~/.ssh/id_rsa.pubSao chép toàn bộ nội dung hiển thị (bắt đầu bằng
ssh-rsahoặcssh-ed25519và kết thúc bằng comment bạn đã cung cấp). -
Đăng nhập vào máy chủ từ xa bằng mật khẩu:
ssh username@remote_host -
Trên máy chủ từ xa, tạo thư mục
.ssh(nếu chưa có) và đặt quyền hạn thích hợp:mkdir -p ~/.ssh
chmod 700 ~/.ssh -
Thêm khóa công khai vào tệp
~/.ssh/authorized_keys. Sử dụngnanohoặcvimđể mở tệp, hoặc dùng lệnhechođể nối vào:nano ~/.ssh/authorized_keys
# Dán nội dung khóa công khai đã sao chép ở bước 1 vào cuối tệp.
# Lưu và thoát (Ctrl+X, Y, Enter với nano).Hoặc dùng lệnh
echo(thayYOUR_PUBLIC_KEY_CONTENTbằng khóa của bạn):echo "YOUR_PUBLIC_KEY_CONTENT" >> ~/.ssh/authorized_keys⚠️ Lưu ý: Đảm bảo bạn dùng
>>để nối vào, không phải>để ghi đè, nếu không bạn có thể xóa các khóa hiện có. -
Đặt quyền hạn chính xác cho tệp
authorized_keys:chmod 600 ~/.ssh/authorized_keys💡 Quyền hạn không chính xác là nguyên nhân phổ biến gây lỗi xác thực khóa SSH.
Bước 3: Kiểm tra kết nối SSH (Test SSH Connection)
Thoát khỏi phiên SSH trên máy chủ và thử kết nối lại từ máy cục bộ của bạn:
ssh username@remote_host
Nếu bạn đã đặt passphrase cho khóa riêng của mình, bạn sẽ được yêu cầu nhập passphrase. Sau khi nhập đúng, bạn sẽ đăng nhập vào máy chủ mà không cần nhập mật khẩu tài khoản máy chủ.
✅ Nếu bạn đăng nhập thành công, xác thực SSH Key đã được cấu hình đúng cách!
Bước 4: Tắt xác thực bằng mật khẩu trên máy chủ (Optional: Disable Password Authentication on Server)
Để tăng cường bảo mật, bạn có thể tắt xác thực bằng mật khẩu trên máy chủ SSH, chỉ cho phép đăng nhập bằng khóa SSH.
⚠️ Cảnh báo: Chỉ thực hiện bước này sau khi bạn đã chắc chắn rằng xác thực bằng khóa SSH hoạt động ổn định và bạn có thể đăng nhập thành công. Nếu không, bạn có thể bị khóa khỏi máy chủ của mình.
-
Đăng nhập vào máy chủ từ xa bằng SSH Key.
-
Mư tệp cấu hình SSH daemon (
sshd_config):sudo nano /etc/ssh/sshd_config -
Tìm và thay đổi các dòng sau (bỏ comment
#nếu có):#PasswordAuthentication yes
#PermitRootLogin yesThành:
PasswordAuthentication no
PermitRootLogin prohibit-password # Hoặc PermitRootLogin no để cấm hoàn toàn root loginPasswordAuthentication no: Tắt hoàn toàn việc đăng nhập bằng mật khẩu cho tất cả người dùng.PermitRootLogin prohibit-password: Cấm root đăng nhập bằng mật khẩu, nhưng cho phép bằng khóa SSH. Nếu bạn muốn cấm root đăng nhập hoàn toàn, hãy đặt làPermitRootLogin no.
-
Lưu tệp và thoát.
-
Khởi động lại dịch vụ SSH để áp dụng các thay đổi:
sudo systemctl restart sshd # Đối với hệ thống dùng systemd (Ubuntu, CentOS 7+, Debian 8+)
# Hoặc sudo service sshd restart # Đối với hệ thống cũ hơn
Bây giờ, nếu ai đó cố gắng đăng nhập vào máy chủ của bạn bằng mật khẩu, họ sẽ bị từ chối.
Bước 5: Quản lý khóa SSH với ssh-agent (Optional: Manage SSH Keys with ssh-agent)
Nếu bạn đã đặt passphrase cho khóa riêng của mình, b�ần sẽ phải nhập nó mỗi khi kết nối. ssh-agent là một chương trình chạy nền giúp quản lý khóa SSH, cho phép bạn nhập passphrase một lần cho mỗi phiên đăng nhập và sử dụng khóa đó nhiều lần mà không cần nhập lại.
-
Khởi động
ssh-agent:eval "$(ssh-agent -s)"Bạn sẽ thấy output tương tự như
Agent pid 12345. -
Thêm khóa riêng của bạn vào
ssh-agent:ssh-add ~/.ssh/id_rsaBạn sẽ được yêu cầu nhập passphrase của khóa. Sau khi nhập đúng, khóa của bạn sẽ được thêm vào agent.
Bây giờ, bạn có thể kết nối SSH đến các máy chủ mà không cần nhập passphrase cho đến khi bạn đóng phiên terminal hoặc khởi động lại máy tính.
Troubleshooting
- Permissions quá rộng cho khóa riêng hoặc thư mục
.ssh: ⚠️ Nếu khóa riêng tư của bạn (id_rsa) có quyền hạn quá rộng (ví dụ:chmod 777), SSH sẽ từ chối sử dụng nó.Trên máy chủ, hãy kiểm tra quyền hạn cư�achmod 600 ~/.ssh/id_rsa # Khóa riêng tư chỉ đọc bởi chủ sở hữu
chmod 700 ~/.ssh # Thư mục .ssh chỉ có chủ sở hữu mới có quyền truy cậpauthorized_keys:ls -l ~/.ssh/authorized_keys
# Nên là -rw------- 1 username username ...
chmod 600 ~/.ssh/authorized_keys - Khóa công khai không đúng định dạng hoặc thiếu: Đảm bảo bạn đã sao chép toàn bộ nội dung của
id_rsa.pubvào~/.ssh/authorized_keystrên máy chủ và không có ký tự thừa. - Firewall chặn cổng SSH: Đảm bảo cổng 22 (hoặc cổng SSH tùy chỉnh của bạn) được mở trên tường lửa của máy chủ.
- Sử dụng
ssh -vđể gỡ lỗi: Lệnhssh -v username@remote_hostsẽ hiển thị thông tin chi tiết về quá trình kết nối SSH, giúp bạn xác định nguyên nhân lỗi. ssh-agentkhông hoạt động hoặc khóa không được thêm: Đảm bảo bạn đã chạyeval "$(ssh-agent -s)"vàssh-addthành công.
Kết Luận
Cấu hình xác thực SSH bằng cặp khóa là một bước quan trọng để tăng cường bảo mật cho các kết nối từ xa của bạn. Nó cung cấp một phương pháp đăng nhập mạnh mẽ hơn nhiều so với mật khẩu truyền thống, đồng thời mang lại sự tiện lợi khi không cần nhập mật khẩu mỗi lần.
💡 Best practices:
- Luôn sử dụng passphrase cho khóa riêng của bạn.
- Bảo vệ khóa riêng tư của bạn. Đừng chia sẻ nó với bất kỳ ai và giữ nó ở nơi an toàn.
- Sao lưu khóa SSH của bạn ở một nơi an toàn (ví dụ: ổ cứng mã hóa, trình quản lý mật khẩu).
- Định kỳ xoay vòng khóa SSH (tạo khóa mới và xóa khóa cũ) để duy trì bảo mật tốt nhất.
- Tắt xác thực bằng mật khẩu trên máy chủ sau khi xác thực bằng khóa SSH hoạt động ổn định.
- Cân nhắc sử dụng tệp
~/.ssh/configđể định cấu hình các máy chủ SSH cụ thể, giúp quản lý kết nối dễ dàng hơn.