Chuyển tới nội dung chính

Bảo Mật SSH Chống Tấn Công Brute Force Hiệu Quả

Giới Thiệu

Giao thức Secure Shell (SSH) là xương sống cho việc quản lý máy chủ từ xa, cho phép bạn truy cập và điều khiển máy chủ một cách an toàn qua mạng. Tuy nhiên, vì tính phổ biến và tầm quan trọng của nó, SSH thường xuyên trở thành mục tiêu của các cuộc tấn công brute force. Kẻ tấn công sẽ liên tục thử hàng ngàn, thậm chí hàng triệu, tổ hợp tên người dùng và mật khẩu khác nhau với hy vọng đoán đúng và chiếm quyền truy cập vào máy chủ của bạn.

Một cuộc tấn công brute force thành công có thể dẫn đến việc kiểm soát hoàn toàn máy chủ, đánh cắp dữ liệu nhạy cảm, hoặc sử dụng máy chủ của bạn cho các hoạt động độc hại khác. Do đó, việc bảo mật SSH chống lại các cuộc tấn công này là một trong những ưu tiên hàng đầu của mọi quản trị viên hệ thống. Hướng dẫn này sẽ cung cấp cho bạn các bước thực tế và hiệu quả để tăng cường khả năng phòng thủ SSH của mình.

📋 Thời gian: Khoảng 20-30 phút | Độ khó: Trung bình

Yêu Cầu

Để thực hiện theo hướng dẫn này, bạn cần có:

  • Một máy chủ Linux (Ubuntu, CentOS, Debian, v.v.) có cài đặt dịch vụ SSH đang hoạt động.
  • Quyền truy cập root hoặc tài khoản sudo trên máy chủ.
  • Kiến thức cơ bản về dòng lệnh Linux và chỉnh sửa tệp cấu hình.
  • Kết nối Internet trên máy chủ để cài đặt các gói phần mềm.

Các Bước Thực Hiện

Bước 1: Thay đổi cổng SSH mặc định

Cổng SSH mặc định là 22, điều này khiến nó trở thành mục tiêu dễ dàng cho các công cụ quét tự động của kẻ tấn công. Thay đổi cổng mặc định sẽ không ngăn chặn hoàn toàn các cuộc tấn công, nhưng nó sẽ giảm đáng kể lượng "tiếng ồn" và các nỗ lực dò quét tự động.

  1. Mở tệp cấu hình SSH:

    sudo nano /etc/ssh/sshd_config
  2. Tìm dòng Port 22 và thay đổi nó: Tìm dòng bắt đầu bằng Port 22 (có thể bị comment bằng #). Bỏ comment (nếu có) và thay đổi 22 thành một số cổng khác trong khoảng từ 1024 đến 65535, ví dụ 2222.

    # Port 22
    Port 2222 # Thay 2222 bằng cổng bạn chọn

    ⚠️ Lưu ý: Chọn một cổng chưa được sử dụng bởi dịch vụ nào khác.

  3. Lưu tệp và thoát (Ctrl+O, Enter, Ctrl+X).

  4. Cập nhật tường lửa (Firewall): Bạn cần cho phép kết nối đến cổng SSH mới qua tường lửa. Ví dụ với ufw (trên Ubuntu/Debian):

    sudo ufw allow 2222/tcp # Thay 2222 bằng cổng bạn đã chọn
    sudo ufw delete allow 22/tcp # Xóa quy tắc cho cổng 22 cũ (nếu có)
    sudo ufw enable # Đảm bảo tường lửa đư�ực bật
    sudo ufw status # Kiểm tra trạng thái tường lửa

    Đối với firewalld (trên CentOS/RHEL):

    sudo firewall-cmd --permanent --add-port=2222/tcp # Thay 2222 bằng cổng bạn đã chọn
    sudo firewall-cmd --permanent --remove-port=22/tcp # Xóa quy tắc cho cổng 22 cũ (nếu có)
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-all
  5. Khởi động lại dịch vụ SSH:

    sudo systemctl restart sshd

    💡 Mẹo: Trước khi đóng phiên SSH hiện tại, hãy mở một phiên SSH mới trên cổng mới để đảm bảo bạn có thể kết nối thành công. Nếu không, bạn có thể bị khóa khỏi máy chủ.

Bước 2: Vô hiệu hóa đăng nhập bằng tài khoản root trực tiếp

Đăng nhập trực tiếp bằng tài khoản root là một rủi ro bảo mật lớn. Tài khoản root có toàn quyền trên hệ thống, và nó là mục tiêu hàng đầu của các cuộc tấn công brute force vì tên người dùng root là phổ biến và dễ đoán. Thay vào đó, bạn nên đăng nhập bằng một tài khoản người dùng thông thường và sử dụng sudo khi cần quyền quản trị.

  1. Mở tệp cấu hình SSH:

    sudo nano /etc/ssh/sshd_config
  2. Tìm dòng PermitRootLogin và thay đổi nó: Tìm dòng PermitRootLogin (có thể bị comment). Bỏ comment và thay đổi giá trị thành no.

    #PermitRootLogin prohibit-password
    PermitRootLogin no

    ⚠️ Quan trọng: Đảm bảo bạn đã có ít nhất một tài khoản người dùng thông thường với quyền sudo trước khi vô hiệu hóa đăng nhập root. Nếu không, bạn sẽ không thể truy cập quyền quản trị sau khi đăng nhập.

  3. Lưu tệp và thoát.

  4. Khởi động lại dịch vụ SSH:

    sudo systemctl restart sshd

Bước 3: Sử dụng xác thực khóa SSH và vô hiệu hóa mật khẩu

Xác thực bằng khóa SSH an toàn hơn rất nhiều so với xác thực bằng mật khẩu. Thay vì dựa vào mật khẩu có thể bị đoán hoặc bẻ khóa, bạn sử dụng một cặp khóa mã hóa: một khóa riêng tư (private key) trên máy cục bộ của bạn và một khóa công khai (public key) trên máy chủ.

  1. Tạo cặp khóa SSH (nếu chưa có) trên máy cục bộ của bạn:

    ssh-keygen -t rsa -b 4096

    Làm theo hướng dẫn để lưu khóa và đặt mật khẩu bảo vệ khóa riêng tư (passphrase).

  2. Sao chép khóa công khai lên máy chủ: Sử dụng ssh-copy-id (cách dễ nhất):

    ssh-copy-id -i ~/.ssh/id_rsa.pub user@your_server_ip -p 2222 # Thay user, your_server_ip, 2222

    Nếu ssh-copy-id không có sẵn hoặc bạn muốn làm thủ công:

    cat ~/.ssh/id_rsa.pub | ssh user@your_server_ip -p 2222 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

    Bạn sẽ cần nhập mật khẩu của người dùng trên máy chủ một lần.

  3. Kiểm tra đăng nhập bằng khóa SSH: Thử đăng nhập bằng khóa SSH của bạn:

    ssh user@your_server_ip -p 2222

    Nếu thành công, bạn sẽ được yêu cầu nhập passphrase của khóa riêng tư (nếu có) thay vì mật khẩu người dùng.

  4. Vô hiệu hóa xác thực mật khẩu trên máy chủ: Khi bạn đã chắc chắn rằng mình có thể đăng nhập bằng khóa SSH, hãy vô hiệu hóa xác thực mật khẩu để tăng cường bảo mật. Mở tệp cấu hình SSH:

    sudo nano /etc/ssh/sshd_config

    Tìm dòng PasswordAuthentication và thay đổi giá trị thành no.

    #PasswordAuthentication yes
    PasswordAuthentication no

    Bạn cũng có thể xem xét đặt ChallengeResponseAuthentication noUsePAM no (tùy thuộc vào cấu hình hệ thống của bạn).

  5. Lưu tệp và thoát.

  6. Khởi động lại dịch vụ SSH:

    sudo systemctl restart sshd

    ✅ Giờ đây, chỉ những người có khóa riêng tư phù hợp mới có thể đăng nhập vào máy chủ của bạn qua SSH.

Bước 4: Cài đặt và cấu hình Fail2Ban

Fail2Ban là một công cụ mạnh mẽ giúp tự động chặn các địa chỉ IP có hành vi đáng ngờ, chẳng hạn như thử đăng nhập SSH thất bại nhiều lần. Nó hoạt động bằng cách quét các tệp nhật ký (log files) và cập nhật quy tắc tường lửa để cấm IP độc hại.

  1. Cài đặt Fail2Ban: Trên Debian/Ubuntu:

    sudo apt update
    sudo apt install fail2ban

    Trên CentOS/RHEL:

    sudo yum install epel-release
    sudo yum install fail2ban
    sudo systemctl enable fail2ban
  2. Tạo tệp cấu hình cục bộ: Fail2Ban sử dụng tệp jail.conf làm cấu hình mặc định. Bạn không nên chỉnh sửa trực tiếp tệp này mà hãy tạo một bản sao cục bộ jail.local để ghi đè các cài đặt.

    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  3. Cấu hình Fail2Ban cho SSH: Mở tệp jail.local:

    sudo nano /etc/fail2ban/jail.local

    Tìm phần [sshd] hoặc tạo mới nếu không có. Đảm bảo nó được bật và cấu hình các thông số sau:

    [sshd]
    enabled = true
    port = 2222 # Thay 2222 bằng cổng SSH bạn đã chọn ở Bước 1
    filter = sshd
    logpath = /var/log/auth.log # Hoặc /var/log/secure trên CentOS/RHEL
    maxretry = 3 # Số lần thử tối đa trước khi bị cấm
    bantime = 1h # Thời gian cấm (ví dụ: 1 giờ = 3600 giây hoặc 1h)
    findtime = 10m # Thời gian để tìm các lần thử thất bại (ví dụ: 10 phút = 600 giây hoặc 10m)
    ignoreip = 127.0.0.1/8 ::1 # Thêm IP của bạn vào đây nếu bạn muốn tránh bị cấm nhầm (ví dụ: 192.168.1.0/24)

    💡 Mẹo: Cẩn thận khi thêm ignoreip. Chỉ thêm các IP đáng tin cậy mà bạn chắc chắn không muốn bị Fail2Ban chặn.

  4. Lưu tệp và thoát.

  5. Khởi động lại Fail2Ban:

    sudo systemctl restart fail2ban
  6. Kiểm tra trạng thái Fail2Ban:

    sudo fail2ban-client status sshd

    Bạn sẽ thấy thông tin về các IP bị cấm (nếu có).

Troubleshooting

  • ⚠️ Lỗi: Không thể kết nối SSH sau khi thay đổi cấu hình.

    • Nguyên nhân: Có thể do lỗi cú pháp trong sshd_config, tường lửa chưa được cập nhật, hoặc dịch vụ SSH chưa khởi động lại thành công.
    • Cách xử lý:
      1. Nếu bạn vẫn còn phiên SSH cũ đang mở, hãy kiểm tra lại tệp sshd_config để tìm lỗi.
      2. Kiểm tra trạng thái dịch vụ SSH: sudo systemctl status sshd.
      3. Kiểm tra quy tắc tường lửa của bạn: sudo ufw status hoặc sudo firewall-cmd --list-all. Đảm bảo cổng SSH mới đã được phép.
      4. Trong trường hợp xấu nhất, bạn có thể cần truy cập máy chủ thông qua giao diện console (ví dụ: từ nhà cung cấp dịch vụ đám mây) để khôi phục cấu hình.
  • ⚠️ Lỗi: Fail2Ban không hoạt động hoặc không chặn IP.

    • Nguyên nhân: Cấu hình sai trong jail.local, đường dẫn log không đúng, hoặc dịch vụ Fail2Ban không chạy.
    • Cách xử lý:
      1. Kiểm tra lại tệp jail.local để đảm bảo enabled = trueport đúng vưi cổng SSH của bạn.
      2. Đảm bảo logpath trỏ đến đúng tệp nhật ký xác thực của hệ thống bạn (/var/log/auth.log cho Debian/Ubuntu, /var/log/secure cho CentOS/RHEL).
      3. Kiểm tra log của Fail2Ban: sudo cat /var/log/fail2ban.log. Tìm kiếm các lỗi hoặc cảnh báo.
      4. Đảm bảo dịch vụ Fail2Ban đang chạy: sudo systemctl status fail2ban.
  • ⚠️ Lỗi: Tôi bị khóa bởi Fail2Ban.

    • Nguyên nhân: Bạn đã nhập sai mật khẩu hoặc passphrase quá số lần cho phép.
    • Cách xử lý:
      1. Chờ hết thời gian bantime để IP của bạn được gỡ chặn tự động.
      2. Nếu bạn cần truy cập ngay, và có một IP khác để đăng nhập, bạn có thể đăng nhập từ IP đó và gỡ chặn IP của mình: sudo fail2ban-client set sshd unbanip your_ip_address.
      3. Thêm địa chỉ IP của bạn vào danh sách ignoreip trong jail.local để tránh bị chặn trong tương lai.

Kết Luận

Bảo mật SSH chống lại các cuộc tấn công brute force là một phần thiết yếu của việc duy trì một máy chủ an toàn. Bằng cách thực hiện các bước trong hướng dẫn này, bạn đã tăng cường đáng kể khả năng phòng thủ của máy chủ mình.

Tóm tắt các biện pháp chính:

  • Thay đổi cổng SSH mặc định: Giảm "tiếng ồn" từ các công cụ quét tự động.
  • Vô hiệu hóa đăng nhập root: Buộc kẻ tấn công phải đoán tên người dùng ngoài mật khẩu, đồng thời hạn chế quyền truy cập trực tiếp của tài khoản có toàn quyền.
  • Sử dụng xác thực khóa SSH và vô hiệu hóa mật khẩu: Phương pháp xác thực mạnh mẽ và an toàn hơn nhiều so với mật khẩu.
  • Cài đặt và cấu hình Fail2Ban: Tự động chặn các IP độc hại có hành vi đáng ngờ.

Best practices bổ sung:

  • Cập nhật hệ thống thường xuyên: Luôn đảm bảo hệ điều hành và tất cả các gói phần mềm, bao gồm SSH, được cập nhật lên phiên bản mới nhất để vá các lỗ hổng bảo mật.
  • Giới hạn số lần thử mật khẩu: Trong sshd_config, bạn có thể thêm MaxAuthTries 3 để giới hạn số lần thử mật khẩu tối đa.
  • Kiểm tra nhật ký định kỳ: Thường xuyên kiểm tra các tệp nhật ký SSH (/var/log/auth.log hoặc /var/log/secure) để phát hiện các hoạt động đáng ngờ.
  • Sử dụng mật khẩu mạnh (nếu v�ần cho phép xác thực mật khẩu cho một số user): Đảm bảo tất cả người dùng có mật khẩu mạnh và duy nhất.

Việc bảo mật là một quá trình liên tục. Hãy luôn cảnh giác và cập nhật các biện pháp phòng thủ để bảo vệ máy chủ của bạn khỏi các mối đe dọa ngày càng tinh vi.