Cổng SSH trên server của bạn đang bị dò mật khẩu không ngừng nghỉ? Checklist Bảo mật SSH với 10 bước chi tiết này sẽ hướng dẫn bạn từ cơ bản đến nâng cao, biến server thành một pháo đài gần như bất khả xâm phạm. Hãy bắt đầu gia cố ‘cửa chính’ cho server của bạn ngay bây giờ.
Tại sao bảo mật SSH là việc bắt buộc phải làm?
Secure Shell (SSH) là giao thức cho phép bạn truy cập và quản lý server từ xa một cách an toàn. Về cơ bản, cổng SSH chính là “cửa chính” dẫn vào ngôi nhà số của bạn. Nếu cánh cửa này không được khóa cẩn thận, kẻ xấu có thể dễ dàng đột nhập.
Các rủi ro khi không chú trọng bảo mật SSH là rất thực tế:
Bị tấn công Brute Force: Hàng ngàn bot tự động trên internet liên tục quét các server đang mở port 22 (port SSH mặc định) và thử hàng triệu mật khẩu phổ biến để cố gắng đăng nhập.
Bị chiếm quyền điều khiển: Một khi kẻ tấn công có được quyền truy cập, chúng có thể đánh cắp toàn bộ dữ liệu, cài mã độc đào tiền ảo (làm server của bạn chậm đi và tốn chi phí), hoặc dùng server của bạn làm bàn đạp để tấn công các mục tiêu khác.
Mất uy tín và dữ liệu: Đối với các doanh nghiệp, việc server bị xâm nhập có thể dẫn đến rò rỉ thông tin khách hàng, gây thiệt hại nghiêm trọng về tài chính và uy tín.
Vì vậy, việc dành thời gian để gia cố an ninh cho SSH không phải là một lựa chọn, mà là một yêu cầu bắt buộc đối với bất kỳ ai đang quản trị server.
Bước 1 & 2: Nền tảng cơ bản - Thay đổi Port và Vô hiệu hóa Root Login
Đây là hai hành động đơn giản nhất nhưng lại mang đến hiệu quả bảo vệ tức thì, giúp bạn loại bỏ hơn 99% các cuộc tấn công tự động.
Thay đổi Port 22 mặc định
Hầu hết các bot tấn công đều được lập trình để quét Port 22. Bằng cách chuyển SSH sang một port khác, bạn sẽ khiến server của mình “tàng hình” trước các cuộc tấn công này.
Chọn một port mới: Hãy chọn một số port bất kỳ trong khoảng 1024 đến 65535. Ví dụ: 2222, 3456,…
Mở file cấu hình SSH:
sudo nano /etc/ssh/sshd_config
Tìm và sửa dòng Port 22:
Tìm dòng
#Port 22 hoặc Port 22. Bỏ dấu # nếu có và thay số 22 bằng port mới bạn đã chọn.
Port 2222
QUAN TRỌNG: Mở port mới trên Firewall
Đây là bước nhiều người quên nhất và tự khóa mình khỏi server. Bạn phải cho phép kết nối đến port mới trên tường lửa TRƯỚC KHI khởi động lại SSH.
Nếu dùng UFW (Ubuntu/Debian):
sudo ufw allow 2222/tcp
Nếu dùng Firewalld (CentOS/RHEL):
sudo firewall-cmd –permanent –add-port=2222/tcp
sudo firewall-cmd –reload
Khởi động lại dịch vụ SSH:
sudo systemctl restart sshd
Từ bây giờ, để đăng nhập, bạn cần chỉ định port mới bằng cờ -p:
ssh username@your_server_ip -p 2222
Vô hiệu hóa quyền đăng nhập của tài khoản root
Tài khoản root là người dùng có quyền lực cao nhất trên hệ thống. Kẻ tấn công luôn biết tên tài khoản này tồn tại, việc của chúng chỉ là dò mật khẩu. Việc vô hiệu hóa đăng nhập root qua SSH buộc kẻ tấn công phải dò cả username và password, tăng độ khó lên gấp nhiều lần.
Tạo người dùng mới (nếu chưa có): Đảm bảo bạn có một tài khoản người dùng thường với quyền sudo.
Tạo user mới, ví dụ ‘adminuser’
sudo adduser adminuser
Thêm user vào nhóm sudo
sudo usermod -aG sudo adminuser
Mở file cấu hình SSH:
sudo nano /etc/ssh/sshd_config
Tìm và sửa dòng PermitRootLogin:
Thay đổi giá trị của PermitRootLogin từ yes thành no.
PermitRootLogin no
Khởi động lại dịch vụ SSH:
sudo systemctl restart sshd
Bước 3, 4 & 5: Nâng cấp “ổ khóa” với SSH Key
Sử dụng mật khẩu giống như dùng một ổ khóa thường, có thể bị bẻ khóa. Sử dụng SSH Key giống như nâng cấp lên một ổ khóa sinh trắc học, gần như không thể bị làm giả.
SSH Key là gì và tại sao an toàn hơn mật khẩu?
Xác thực bằng SSH Key sử dụng một cặp khóa mã hóa:
Private Key (Khóa riêng tư): Giống như chìa khóa vật lý của bạn. File này được lưu an toàn trên máy tính cá nhân và không bao giờ được chia sẻ.
Public Key (Khóa công khai): Giống như ổ khóa. File này được bạn đặt trên server. Ổ khóa này chỉ có thể được mở bởi duy nhất chiếc chìa khóa riêng tư tương ứng.
Kể cả khi ai đó đánh cắp được Public Key, họ cũng không thể làm gì vì không có Private Key. Độ dài của một SSH key thường là 2048 hoặc 4096 bit, khiến việc bẻ khóa bằng phương pháp brute-force là bất khả thi về mặt tính toán.
Hướng dẫn tạo cặp SSH Key trên máy tính của bạn
Mở terminal trên máy tính macOS/Linux hoặc PowerShell/Git Bash trên Windows và chạy lệnh:
ssh-keygen -t rsa -b 4096
-t rsa: Chỉ định thuật toán mã hóa RSA.
-b 4096: Chỉ định độ dài khóa là 4096 bit cho an toàn tối đa.
Hệ thống sẽ hỏi bạn một vài câu:
Enter file in which to save the key…: Cứ nhấn Enter để lưu ở vị trí mặc định.
Enter passphrase…: Đây là một lớp mật khẩu bổ sung để bảo vệ private key của bạn. Bạn nên đặt mật khẩu này. Mỗi lần sử dụng key, bạn sẽ cần nhập passphrase này.
Sau khi hoàn tất, bạn sẽ có 2 file trong thư mục ~/.ssh/: id_rsa (Private Key) và id_rsa.pub (Public Key).
Cách đưa Public Key lên Server
Cách 1: Dùng lệnh ssh-copy-id (khuyên dùng)
Đây là cách đơn giản và an toàn nhất. Lệnh này sẽ tự động sao chép public key và thiết lập quyền truy cập chính xác trên server.
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2222 adminuser@your_server_ip
Thay 2222 và adminuser bằng port và username của bạn.
Cách 2: Sao chép thủ công
Nếu không có lệnh ssh-copy-id, bạn có thể làm thủ công.
Xem nội dung public key trên máy tính của bạn:
cat ~/.ssh/id_rsa.pub
Sao chép toàn bộ nội dung hiển thị.
Đăng nhập vào server bằng mật khẩu.
Dán nội dung public key vào cuối file ~/.ssh/authorized_keys:
echo “nội_dung_public_keyđãcopy” >> ~/.ssh/authorized_keys
Thiết lập quyền chính xác cho thư mục và file:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Bây giờ, hãy thử đăng xuất và đăng nhập lại. Bạn sẽ được yêu cầu nhập passphrase (nếu có đặt) thay vì mật khẩu của server.
Vô hiệu hóa hoàn toàn việc đăng nhập bằng mật khẩu
Sau khi đã xác nhận có thể đăng nhập bằng SSH key thành công, đây là bước cuối cùng để đạt được mức độ bảo mật SSH cao nhất.
Mở file sshd_config trên server:
sudo nano /etc/ssh/sshd_config
Tìm và sửa các dòng sau:
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
Khởi động lại dịch vụ SSH:
sudo systemctl restart sshd
Từ giờ, không ai có thể đăng nhập vào server của bạn bằng mật khẩu nữa.
Bước 6 & 7: Xây dựng các lớp phòng thủ bổ sung
Cài đặt Fail2ban để tự động chặn tấn công Brute Force
Kể cả khi bạn đã vô hiệu hóa mật khẩu, các bot vẫn có thể tấn công server và làm đầy file log. Fail2ban sẽ tự động chặn các IP có hành vi đáng ngờ này.
Cài đặt Fail2ban:
Ubuntu/Debian: sudo apt install fail2ban
CentOS/RHEL: sudo yum install fail2ban
Tạo file cấu hình riêng cho SSH:
sudo nano /etc/fail2ban/jail.local
Dán cấu hình sau vào file. Cấu hình này sẽ ghi đè lên thiết lập mặc định.
[sshd]
enabled = true
port = 2222 # Thay bằng port SSH của bạn
maxretry = 3 # Chặn sau 3 lần thử sai
bantime = 1d # Chặn trong 1 ngày
Khởi động lại Fail2ban:
sudo systemctl restart fail2ban
Cấu hình Tường lửa (Firewall) chỉ cho phép IP tin cậy
Nếu bạn có địa chỉ IP tĩnh (ở nhà hoặc công ty), bạn có thể cấu hình tường lửa chỉ cho phép kết nối SSH từ địa chỉ IP đó. Đây là một biện pháp cực kỳ hiệu quả.
Dùng UFW (Ubuntu/Debian):
Xóa quy tắc cho phép cũ (nếu có)
sudo ufw delete allow 2222/tcp
Thêm quy tắc mới chỉ cho phép từ IP của bạn
sudo ufw allow from YOUR_STATIC_IP to any port 2222 proto tcp
Dùng Firewalld (CentOS/RHEL):
sudo firewall-cmd –permanent –zone=public –add-rich-rule='
rule family=“ipv4”
source address=“YOUR_STATIC_IP”
port protocol=“tcp” port=“2222” accept’
sudo firewall-cmd –reload
Hãy thay YOUR_STATIC_IP bằng địa chỉ IP tĩnh của bạn.
Bước 8, 9 & 10: Tinh chỉnh nâng cao
Giới hạn người dùng được phép đăng nhập SSH
Nếu server có nhiều người dùng nhưng chỉ một vài người có quyền đăng nhập SSH, bạn có thể chỉ định rõ ràng trong file sshd_config.
Chỉ cho phép user ‘adminuser’ và ‘devuser’
AllowUsers adminuser devuser
Thiết lập Timeout cho các phiên SSH không hoạt động
Để tránh các phiên đăng nhập bị “treo” vô thời hạn, bạn có thể thiết lập tự động ngắt kết nối. Thêm các dòng sau vào sshd_config:
Gửi tín hiệu kiểm tra sau mỗi 240 giây
ClientAliveInterval 240
Ngắt kết nối nếu không nhận được phản hồi sau 3 lần
ClientAliveCountMax 3
Điều này có nghĩa là phiên SSH sẽ bị ngắt sau 240 * 3 = 720 giây (12 phút) không hoạt động.
Kích hoạt Xác thực 2 yếu tố (2FA) cho SSH
Đây là lớp bảo mật cao cấp nhất, yêu cầu bạn phải nhập một mã code dùng một lần từ ứng dụng trên điện thoại (như Google Authenticator) sau khi đăng nhập. Quá trình này khá phức tạp, bao gồm việc cài đặt libpam-google-authenticator và chỉnh sửa các file PAM. Đây là một chủ đề nâng cao và cần một bài viết riêng để hướng dẫn chi tiết.
Checklist Bảo mật SSH cuối cùng
Hành động Trạng thái
1 Thay đổi port SSH mặc định (22) ☐
2 Mở port mới trên Firewall ☐
3 Vô hiệu hóa đăng nhập của tài khoản root ☐
4 Tạo cặp SSH Key (Public/Private) ☐
5 Sao chép Public Key lên server ☐
6 Vô hiệu hóa hoàn toàn xác thực bằng mật khẩu ☐
7 Cài đặt và cấu hình Fail2ban cho SSH ☐
8 (Tùy chọn) Giới hạn SSH từ IP tĩnh qua Firewall ☐
9 (Tùy chọn) Giới hạn người dùng được phép SSH ☐
10 (Tùy chọn) Thiết lập Timeout cho phiên không hoạt động ☐
FAQs - Giải đáp các thắc mắc thường gặp
Tôi lỡ làm sai và bị khóa khỏi server, phải làm sao?
Đây là nỗi sợ lớn nhất. Hầu hết các nhà cung cấp VPS/Cloud (DigitalOcean, Vultr, Linode, AWS,…) đều cung cấp một “Recovery Console” hoặc “Web Console”. Đây là một giao diện dòng lệnh truy cập trực tiếp vào server của bạn thông qua trình duyệt, không qua SSH. Bạn có thể dùng console này để đăng nhập (thường bằng mật khẩu root của server) và sửa lại các file cấu hình bị sai.
Tôi có nên dùng các công cụ tự động bảo mật SSH không?
Có một số script tự động hóa việc này. Tuy nhiên, việc tự tay thực hiện từng bước sẽ giúp bạn hiểu rõ hệ thống của mình đang được bảo vệ như thế nào. Việc này cũng giúp bạn dễ dàng chẩn đoán lỗi hơn khi có sự cố xảy ra.
Làm thế nào để kiểm tra log đăng nhập SSH?
Bạn có thể xem file log xác thực của hệ thống.
Trên Ubuntu/Debian: sudo less /var/log/auth.log
Trên CentOS/RHEL: sudo less /var/log/secure
Bạn sẽ thấy tất cả các lần đăng nhập thành công và thất bại vào server.
Lời kết
Bảo mật server là một quá trình liên tục, không phải là một hành động làm một lần rồi thôi. Bằng việc thực hiện theo checklist 10 bước trên, bạn đã xây dựng được một hàng rào phòng thủ cực kỳ vững chắc cho cổng SSH. Việc này giúp bạn yên tâm hơn trong việc quản trị hệ thống và bảo vệ tài sản số của mình trước những mối đe dọa luôn hiện hữu trên không gian mạng.