Danh mục: linux
Bảo Mật SSH Với Key Authentication
Giới Thiệu
Giao thức Secure Shell (SSH) là xương sống của việc quản lý máy chủ từ xa, cho phép người quản trị thực hiện các tác vụ và truyền dữ liệu một cách an toàn qua mạng không đáng tin cậy. Theo mặc định, SSH thường sử dụng xác thực bằng mật khẩu, nhưng phương pháp này tiềm ẩn nhiều rủi ro bảo mật, đặc biệt là các cuộc tấn công brute-force.
Key Authentication (Xác thực bằng khóa) là một phương pháp thay thế và mạnh mẽ hơn nhiều. Thay vì sử dụng mật khẩu, nó dựa trên một cặp khóa mã hóa: một khóa công khai (public key) và một khóa riêng tư (private key). Khóa công khai được đặt trên máy chủ SSH, trong khi khóa riêng tư được giữ an toàn trên máy khách (client). Khi bạn cố gắng kết nối, máy chủ sẽ thách thức máy khách bằng cách mã hóa một tin nhắn mà chỉ khóa riêng tư tương ứng mới có thể giải mã, từ đó xác minh danh tính của máy khách mà không cần trao đổi mật khẩu qua mạng.
Tầm quan trọng & Use Cases:
- Tăng cường bảo mật: Miễn nhiễm với các cuộc tấn công dò mật khẩu (brute-force) và từ điển (dictionary attacks).
- Tiện lợi: Không cần nhập mật khẩu mỗi lần kết nối (nếu không dùng passphrase hoặc sử dụng
ssh-agent). - Tự động hóa: Lý tưởng cho các script tự động, hệ thống CI/CD, hoặc các ứng dụng cần truy cập máy chủ mà không có sự can thiệp của người dùng.
- Quản lý nhiều máy chủ: Dễ dàng quản lý truy cập tới nhiều máy chủ bằng cùng một cặp khóa.
Metadata:
- Thời gian thực hiện: Khoảng 30-60 phút
- Độ khó: Trung bình
- Yêu cầu: Kiến thức cơ bản về dòng lệnh Linux
Yêu Cầu Hệ Thống
Để thực hiện hướng dẫn này, bạn cần có:
Cấu hình tối thiểu:
- Máy chủ (Server): Một máy chủ Linux (Ubuntu, CentOS, Debian, Fedora, v.v.) đã cài đặt và chạy dịch vụ OpenSSH Server. Bạn cần có quyền
sudohoặc quyền root để cấu hình máy chủ. - Máy khách (Client): Một máy tính cá nhân chạy Linux, macOS, hoặc Windows (với WSL/Git Bash/PuTTY/OpenSSH client) để tạo và quản lý khóa SSH.
Cấu hình khuyến nghị:
- Đảm bảo máy chủ SSH của bạn được cập nhật lên phiên bản mới nhất.
- Cấu hình firewall trên máy chủ chỉ cho phép truy cập cổng SSH (mặc định là 22) từ các địa chỉ IP đáng tin cậy.
Các Bước Thực Hiện Chi Tiết
Chúng ta sẽ đi qua từng bước một, từ việc tạo khóa đến cấu hình máy chủ và kiểm tra kết nối.
1. Tạo Cặp Khóa SSH Trên Máy Client ⚙️
Bước đầu tiên là tạo một cặp khóa SSH trên máy tính cá nhân của bạn. Đây là nơi khóa riêng tư sẽ được lưu trữ.
Sử dụng lệnh ssh-keygen:
# Mở terminal trên máy client của bạn
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 mã hóa là RSA. Đây là thuật toán phổ biến và an toàn.-b 4096: Chỉ định độ dài của khóa là 4096 bit. Độ dài khóa càng lớn thì càng an toàn (mặc định thường là 2048 bit, nhưng 4096 được khuyến nghị cho bảo mật cao hơn).-C "[email protected]": Thêm một bình luận vào khóa công khai để dễ dàng nhận dạng. Bạn có thể thay thế bằng email hoặc bất kỳ chuỗi nào khác.
Sau khi chạy lệnh, bạn sẽ được hỏi:
Enter file in which to save the key (/home/youruser/.ssh/id_rsa):
💡 Mẹo: Bạn có thể nhấn Enter để chấp nhận vị trí mặc định (~/.ssh/id_rsa). Nếu bạn có nhiều cặp khóa, bạn có thể chỉ định một tên khác, ví dụ: ~/.ssh/my_server_key.
Tiếp theo, bạn sẽ được hỏi về passphrase:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
⚠️ Cảnh báo quan trọng: Luôn đặt một passphrase mạnh cho khóa riêng tư của bạn. Passphrase này giống như một mật khẩu bảo vệ khóa riêng tư. Nếu ai đó đánh cắp khóa riêng tư của bạn, họ sẽ không thể sử dụng nó nếu không có passphrase. Mặc dù nó yêu cầu bạn nhập thêm một lần khi sử dụng khóa lần đầu trong một phiên, nhưng đây là một lớp bảo mật cực kỳ quan trọng.
Sau khi hoàn tất, bạn sẽ thấy hai tệp được tạo trong thư mục ~/.ssh/:
id_rsa: Đây là khóa riêng tư của bạn. GIỮ NÓ BÍ MẬT!id_rsa.pub: Đây là khóa công khai của bạn. Bạn sẽ sao chép tệp này lên máy chủ.
2. Sao Chép Khóa Công Khai Lên Máy Chủ SSH 🌐
Bây giờ bạn cần sao chép khóa công khai (id_rsa.pub) từ máy client của bạn lên máy chủ SSH.
Phương pháp 1: Sử dụng ssh-copy-id (Khuyến nghị)
Đây là cách đơn giản và an toàn nhất. Lệnh ssh-copy-id sẽ tự động tạo thư mục .ssh và tệp authorized_keys (nếu chưa có), đặt đúng quyền và thêm khóa công khai của bạn vào đó.
# Trên máy client
ssh-copy-id -i ~/.ssh/id_rsa.pub your_username@your_server_ip
-i ~/.ssh/id_rsa.pub: Chỉ định đường dẫn đến khóa công khai bạn muốn sao chép.your_username: Tên người dùng của bạn trên máy chủ SSH.your_server_ip: Địa chỉ IP hoặc hostname của máy chủ SSH.
Bạn sẽ được yêu cầu nhập mật khẩu của your_username trên máy chủ một lần để hoàn tất việc sao chép.
Phương pháp 2: Sao chép thủ công bằng scp (Nếu ssh-copy-id không có sẵn)
Nếu ssh-copy-id không có sẵn trên hệ thống của bạn (ví dụ: một số hệ thống Windows cũ không có WSL), bạn có thể sao chép khóa công khai thủ công bằng scp và thêm nó vào tệp ~/.ssh/authorized_keys trên máy chủ.
# Bước 1: Trên máy client, sao chép khóa công khai lên máy chủ
scp ~/.ssh/id_rsa.pub your_username@your_server_ip:/tmp/id_rsa.pub
# Bước 2: Đăng nhập vào máy chủ bằng mật khẩu
ssh your_username@your_server_ip
# Bước 3: Trên máy chủ, thêm khóa công khai vào authorized_keys
# Tạo thư mục .ssh nếu nó chưa tồn tại và đặt quyền chính xác
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# Thêm khóa công khai vào tệp authorized_keys
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
# Đặt quyền chính xác cho tệp authorized_keys
chmod 600 ~/.ssh/authorized_keys
# Xóa tệp tạm thời
rm /tmp/id_rsa.pub
# Thoát khỏi máy chủ
exit
Sau khi hoàn thành một trong hai phương pháp trên, khóa công khai của bạn đã được thêm vào tệp ~/.ssh/authorized_keys trên máy chủ.
3. Cấu Hình SSH Server Để Chỉ Chấp Nhận Xác Thực Bằng Khóa 🔒
Để tăng cường bảo mật, bạn nên cấu hình máy chủ SSH để chỉ chấp nhận xác thực bằng khóa và vô hiệu hóa xác thực bằng mật khẩu.
# Trên máy chủ SSH, chỉnh sửa file cấu hình SSH
sudo nano /etc/ssh/sshd_config
Tìm và điều chỉnh các dòng sau (hoặc thêm vào nếu chúng không tồn tại):
# Vô hiệu hóa xác thực bằng mật khẩu
PasswordAuthentication no
# Vô hiệu hóa xác thực dựa trên challenge-response (cũng liên quan đến mật khẩu)
ChallengeResponseAuthentication no
# Đảm bảo xác thực bằng khóa công khai được bật (thường là mặc định)
PubkeyAuthentication yes
# (Tùy chọn) Vô hiệu hóa đăng nhập root bằng mật khẩu, chỉ cho phép khóa hoặc không cho phép
# PermitRootLogin prohibit-password
# Hoặc an toàn hơn nữa:
# PermitRootLogin no
# (Tùy chọn) Chỉ cho phép các người dùng cụ thể đăng nhập qua SSH
# Thay thế user1 và user2 bằng tên người dùng thực của bạn
# AllowUsers user1 user2
⚠️ Cảnh báo quan trọng: Trước khi vô hiệu hóa PasswordAuthentication, hãy đảm bảo bạn đã sao chép khóa công khai của mình thành công và có thể đăng nhập bằng khóa. Nếu không, bạn có thể bị khóa khỏi máy chủ của mình! Luôn giữ một phiên SSH đang hoạt động trong khi bạn thực hiện các thay đổi này, để có thể quay lại nếu có lỗi.
Sau khi lưu các thay đổi vào tệp sshd_config, bạn cần khởi động lại dịch vụ SSH để áp dụng cấu hình mới:
# Trên máy chủ SSH
sudo systemctl restart sshd
# Hoặc đối với các hệ thống cũ hơn:
# sudo service sshd restart
4. Kiểm Tra Kết Nối SSH ✅
Bây giờ là lúc kiểm tra xem bạn có thể đăng nhập bằng khóa SSH hay không và xác nhận rằng xác thực bằng mật khẩu đã bị vô hiệu hóa.
Kiểm tra đăng nhập bằng khóa:
# Trên máy client
ssh -i ~/.ssh/id_rsa your_username@your_server_ip
-i ~/.ssh/id_rsa: Chỉ định khóa riêng tư bạn muốn sử dụng để xác thực.
Nếu bạn đã đặt passphrase cho khóa riêng tư, bạn sẽ được yêu cầu nhập nó. Sau đó, bạn sẽ đăng nhập thành công vào máy chủ.
💡 Mẹo: Nếu bạn muốn tự động sử dụng khóa mặc định (~/.ssh/id_rsa), bạn có thể bỏ qua tùy chọn -i.
ssh your_username@your_server_ip
Kiểm tra đăng nhập bằng mật khẩu (phải thất bại):
Thử đăng nhập bằng mật khẩu sau khi đã vô hiệu hóa nó trên máy chủ.
# Trên máy client
ssh your_username@your_server_ip
Bạn sẽ nhận được thông báo lỗi như: Permission denied (publickey). hoặc Permission denied (publickey,password). (nếu PasswordAuthentication chưa bị vô hiệu hóa hoàn toàn) hoặc ssh: connect to host your_server_ip port 22: Connection refused (nếu có vấn đề khác). Điều này xác nhận rằng máy chủ không còn chấp nhận xác thực bằng mật khẩu nữa.
5. Bảo Vệ Khóa Riêng Tư Trên Client ⚠️
Khóa riêng tư của bạn là chìa khóa để truy cập máy chủ. Việc bảo vệ nó là cực kỳ quan trọng.
Quyền tệp tin:
Đảm bảo rằng chỉ bạn mới có quyền đọc/ghi vào khóa riêng tư.
# Trên máy client
chmod 600 ~/.ssh/id_rsa
chmod 600: Đặt quyền sao cho chỉ chủ sở hữu tệp mới có quyền đọc và ghi.
Sử dụng ssh-agent và ssh-add:
Nếu bạn đã đặt passphrase cho khóa riêng tư của mình, bạn sẽ phải nhập nó mỗi khi sử dụng khóa. ssh-agent là một chương trình chạy nền giúp quản lý các khóa riêng tư và passphrase của bạn. Nó cho phép bạn nhập passphrase một lần cho mỗi phiên đăng nhập, sau đó các ứng dụng khác có thể sử dụng khóa mà không cần yêu cầu passphrase lại.
# Trên máy client
# Khởi động ssh-agent (nếu chưa chạy)
eval "$(ssh-agent -s)"
# Thêm khóa riêng tư của bạn vào ssh-agent
ssh-add ~/.ssh/id_rsa
Bạn sẽ được yêu cầu nhập passphrase của khóa. Sau khi thêm, khóa sẽ được giữ trong bộ nhớ của ssh-agent cho đến khi bạn đóng phiên terminal hoặc tắt máy tính.
Troubleshooting hoặc Các Vấn Đề Thường Gặp
Permissions denied (publickey).- Nguyên nhân: Thường do quyền tệp tin không đúng trên máy chủ cho thư mục
~/.sshhoặc tệp~/.ssh/authorized_keys. - Giải pháp: Đăng nhập bằng mật khẩu (nếu chưa vô hiệu hóa) hoặc qua console/VNC, sau đó chạy các lệnh sau trên máy chủ:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys - Cũng có thể do khóa riêng tư trên client có quyền không đúng:
chmod 600 ~/.ssh/id_rsa.
- Nguyên nhân: Thường do quyền tệp tin không đúng trên máy chủ cho thư mục
Agent admitted failure to sign using the key.- Nguyên nhân: Bạn đã thêm khóa vào
ssh-agentnhưng nhập sai passphrase, hoặc khóa không được thêm vào agent. - Giải pháp: Thử lại
ssh-add ~/.ssh/id_rsavà nhập đúng passphrase.
- Nguyên nhân: Bạn đã thêm khóa vào
ssh-copy-idkhông hoạt động.- Nguyên nhân: Có thể do firewall chặn hoặc dịch vụ SSH trên máy chủ không chạy.
- Giải pháp: Đảm bảo cổng 22 (hoặc cổng SSH tùy chỉnh) được mở trên firewall của máy chủ. Kiểm tra trạng thái dịch vụ SSH:
sudo systemctl status sshd.
- Quên Passphrase của khóa riêng tư.
- Nguyên nhân: Passphrase bị quên.
- Giải pháp: Không có cách nào để khôi phục passphrase đã quên. Bạn sẽ phải tạo một cặp khóa mới và lặp lại quá trình.
sshd_configbị lỗi sau khi chỉnh sửa.- Nguyên nhân: Sai cú pháp trong tệp cấu hình.
- Giải pháp: Nếu bạn vẫn còn một phiên SSH đang hoạt động, hãy sửa lỗi trong
sshd_configvà thử khởi động lại dịch vụ. Nếu không, bạn sẽ cần truy cập máy chủ qua console/VNC để sửa tệp. Luôn sao lưu tệp cấu hình trước khi chỉnh sửa:sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.
- Firewall chặn kết nối SSH.
- Nguyên nhân: Firewall trên máy chủ (ví dụ:
ufw,firewalld) chặn cổng SSH. - Giải pháp: Mở cổng SSH (mặc định 22) trên firewall. Ví dụ với
ufw:sudo ufw allow sshhoặcsudo ufw allow 22/tcp.
- Nguyên nhân: Firewall trên máy chủ (ví dụ:
Kết Luận
Việc triển khai xác thực SSH bằng khóa là một bước tiến quan trọng trong việc bảo mật máy chủ Linux của bạn. Bằng cách loại bỏ sự phụ thuộc vào mật khẩu, bạn giảm thiểu đáng kể rủi ro từ các cuộc tấn công brute-force và nâng cao an toàn cho hạ tầng của mình.
Best Practices:
- Luôn sử dụng passphrase mạnh: Bảo vệ khóa riêng tư của bạn bằng một passphrase dài và phức tạp.
- Vô hiệu hóa xác thực mật khẩu: Sau khi xác nhận xác thực bằng khóa hoạt động, hãy tắt hoàn toàn xác thực bằng mật khẩu trên máy chủ.
- Không đăng nhập bằng tài khoản root: Tạo một người dùng thông thường và sử dụng
sudokhi cần quyền quản trị. Cấu hìnhPermitRootLogin notrongsshd_config. - Sử dụng
ssh-agent: Để quản lý các khóa và passphrase một cách tiện lợi và an toàn. - Giới hạn quyền truy cập: Sử dụng
AllowUsershoặcAllowGroupstrongsshd_configđể chỉ cho phép các người dùng/nhóm cụ thể truy cập SSH. - Backup khóa riêng tư an toàn: Sao lưu khóa riêng tư của bạn ở một nơi an toàn (ví dụ: USB mã hóa, dịch vụ lưu trữ đám mây mã hóa) để tránh mất quyền truy cập vào máy chủ.
- Kiểm tra logs SSH: Thường xuyên kiểm tra logs SSH (
/var/log/auth.logtrên Debian/Ubuntu hoặc/var/log/securetrên CentOS/RHEL) để phát hiện các hoạt động đáng ngờ.
Bằng cách tuân thủ các hướng dẫn này, bạn có thể yên tâm rằng các kết nối SSH của mình được bảo vệ một cách mạnh mẽ nhất.
Tài liệu tham khảo:
- OpenSSH Official Website
man ssh-keygenman sshd_config- DigitalOcean Tutorial on SSH Keys (Tham khảo thêm nếu cần)