Cách bảo vệ SSH bằng Fail2Ban trên CentOS 7
Mặc dù kết nối với server của bạn thông qua SSH có thể rất an toàn, nhưng bản thân daemon SSH là một dịch vụ phải được tiếp xúc với Internet để hoạt động bình thường. Điều này đi kèm với một số rủi ro cố hữu và cung cấp một vectơ tấn công cho những kẻ tấn công có thể sẽ là kẻ tấn công.Bất kỳ dịch vụ nào được tiếp xúc với mạng đều là mục tiêu tiềm năng theo cách này. Nếu bạn chú ý đến log ứng dụng cho các dịch vụ này, bạn sẽ thường thấy các nỗ lực đăng nhập lặp đi lặp lại, có hệ thống đại diện cho các cuộc tấn công bạo lực của user cũng như bot.
Một dịch vụ được gọi là Fail2ban có thể giảm thiểu sự cố này bằng cách tạo các luật tự động thay đổi cấu hình firewall iptables của bạn dựa trên số lần đăng nhập không thành công được định nghĩa . Điều này sẽ cho phép server của bạn phản hồi các nỗ lực truy cập bất hợp lệ mà không có sự can thiệp của bạn.
Trong hướng dẫn này, ta sẽ trình bày cách cài đặt và sử dụng Fail2ban trên server CentOS 7.
Cài đặt Fail2ban trên CentOS 7
Mặc dù Fail2ban không có sẵn trong repository CentOS chính thức, nhưng nó được đóng gói cho dự án EPEL . EPEL, đứng cho Gói tắm cho Enterprise Linux, có thể được cài đặt với một gói phần mềm phát hành có sẵn từ CentOS:
- sudo yum install epel-release 
Bạn sẽ được yêu cầu tiếp tục — nhấn y , sau đó nhấn Enter :
yum promptTransaction Summary ============================================================================ Install  1 Package  Total download size: 14 k Installed size: 24 k Is this ok [y/d/N]: y Bây giờ  ta  có thể cài đặt gói fail2ban :
- sudo yum install fail2ban 
, nhấn y và Enter khi được yêu cầu tiếp tục.
 Sau khi cài đặt xong, hãy sử dụng systemctl để kích hoạt dịch vụ fail2ban :
- sudo systemctl enable fail2ban 
Cấu hình cài đặt local
 Dịch vụ Fail2ban giữ các file  cấu hình của nó trong folder  /etc/fail2ban . Ở đó, bạn có thể tìm thấy một file  có giá trị mặc định được gọi là jail.conf . Vì file  này có thể bị overrides  bởi các nâng cấp gói,  ta  không nên chỉnh sửa tại chỗ. Thay vào đó,  ta  sẽ viết một file  mới có tên là jail.local . Bất kỳ giá trị nào được xác định trong jail.local sẽ overrides  các giá trị đó trong jail.conf .
 jail.conf chứa phần [DEFAULT] , tiếp theo là các phần dành cho các dịch vụ riêng lẻ. jail.local có thể overrides  bất kỳ giá trị nào trong số này. Ngoài ra, các file  trong /etc/fail2ban/jail.d/  được dùng  để overrides  cài đặt trong cả hai file  này. Các file  được áp dụng theo thứ tự sau:
-  /etc/fail2ban/jail.conf
-  /etc/fail2ban/jail.d/*.conf, theo thứ tự bảng chữ cái
-  /etc/fail2ban/jail.local
-  /etc/fail2ban/jail.d/*.local, theo thứ tự bảng chữ cái
  Các file   nào cũng có thể chứa phần [DEFAULT] , được thực thi trước và cũng có thể chứa các phần dành cho các nhà tù riêng lẻ. Bộ vavalue cuối cùng cho một tham số nhất định được ưu tiên.
 Hãy bắt đầu bằng cách viết một version  rất đơn giản của jail.local . Mở một file  mới bằng nano (hoặc  editor  mà bạn chọn):
- sudo nano /etc/fail2ban/jail.local 
Dán những thứ sau:
[DEFAULT] # Ban hosts for one hour: bantime = 3600  # Override /etc/fail2ban/jail.d/00-firewalld.conf: banaction = iptables-multiport  [sshd] enabled = true Điều này overrides  ba cài đặt: Nó đặt bantime mặc định mới cho tất cả các dịch vụ,  đảm bảo   ta  đang sử dụng iptables cho cấu hình firewall  và bật sshd jail.
 Thoát và lưu file  mới (trong nano , nhấn Ctrl-X để thoát, y để lưu và Enter để xác nhận tên file ). Bây giờ  ta  có thể khởi động lại dịch vụ fail2ban bằng systemctl :
- sudo systemctl restart fail2ban 
Lệnh systemctl sẽ kết thúc mà không có bất kỳ  kết quả  nào. Để kiểm tra xem dịch vụ có đang chạy hay không,  ta  có thể sử dụng fail2ban-client :
- sudo fail2ban-client status 
OutputStatus |- Number of jail:      1 `- Jail list:   sshd Bạn cũng có thể biết thêm thông tin chi tiết về một nhà tù cụ thể:
- sudo fail2ban-client status sshd 
Khám phá các cài đặt có sẵn
 Phiên bản jail.local mà  ta  đã xác định ở trên là một khởi đầu tốt, nhưng bạn  có thể cần  điều chỉnh một số cài đặt khác. Mở jail.conf và  ta  sẽ kiểm tra một số giá trị mặc định. Nếu bạn quyết định thay đổi bất kỳ giá trị nào trong số này, hãy nhớ rằng chúng phải được sao chép vào phần thích hợp của jail.local và được điều chỉnh ở đó, thay vì sửa đổi tại chỗ.
- sudo nano /etc/fail2ban/jail.conf 
Cài đặt mặc định cho tất cả các nhà tù
 Đầu tiên, cuộn qua phần [DEFAULT] .
ignoreip = 127.0.0.1/8 Bạn có thể điều chỉnh các địa chỉ nguồn mà Fail2ban bỏ qua bằng cách thêm một giá trị vào tham số ignoreip . Hiện tại, nó được cấu hình để không cấm bất kỳ lưu lượng nào đến từ máy local . Bạn có thể bao gồm các địa chỉ bổ sung cần bỏ qua bằng cách nối chúng vào cuối thông số, được phân tách bằng dấu cách.
bantime = 600 Tham số bantime đặt khoảng thời gian mà khách hàng sẽ bị cấm khi họ không xác thực chính xác. Điều này được đo bằng giây. Theo mặc định, giá trị này được đặt thành 600 giây hoặc 10 phút.
findtime = 600 maxretry = 3 Hai tham số tiếp theo mà bạn muốn chú ý là thời findtime và thời maxretry . Những điều này làm việc cùng nhau để  cài đặt  các điều kiện mà khách hàng nên bị cấm.
 Biến maxretry đặt số lần thử mà khách hàng phải xác thực trong repository ảng thời gian được xác định bởi findtime , trước khi bị cấm. Với cài đặt mặc định, Fail2ban sẽ cấm một client  cố gắng đăng nhập không thành công 3 lần trong vòng 10 phút.
destemail = root@localhost sendername = Fail2Ban mta = sendmail Nếu bạn muốn báo cấu hình email, bạn có thể cần phải overrides  lên destemail , sendername , và mta cài đặt. Tham số destemail đặt địa chỉ email sẽ nhận thư cấm. Tên người sendername đặt giá trị của trường "Từ" trong email. Tham số mta cấu hình dịch vụ thư nào sẽ được sử dụng để gửi thư.
action = $(action_)s Tham số này cấu hình hành động mà Fail2ban thực hiện khi nó muốn thực hiện lệnh cấm. Giá trị action_ được xác định trong file  ngay trước tham số này. Hành động mặc định là chỉ cần  cấu hình  firewall  để từ chối lưu lượng truy cập từ  server  vi phạm cho đến khi hết thời gian cấm.
 Nếu bạn muốn  cấu hình  cảnh báo qua email, bạn có thể overrides  giá trị này từ action_ thành action_mw . Nếu bạn muốn email bao gồm các dòng log  liên quan, bạn có thể thay đổi nó thành action_mwl .  Bạn cần   đảm bảo  bạn đã  cấu hình  cài đặt thư thích hợp nếu bạn chọn sử dụng cảnh báo thư.
Cài đặt cho Nhà tù Cá nhân
 Sau [DEFAULT] ,  ta  sẽ gặp các phần  cấu hình  các nhà tù riêng lẻ cho các dịch vụ khác nhau. Những điển hình sẽ bao gồm một port bị cấm và một logpath với màn hình cho những nỗ lực truy cập độc hại. Ví dụ, SSH jail mà  ta  đã kích hoạt trong jail.local có các cài đặt sau:
[sshd]  port    = ssh logpath = %(sshd_log)s Trong trường hợp này, ssh là một biến  được định nghĩa  cho cổng SSH tiêu chuẩn và %(sshd_log)s sử dụng một giá trị được xác định ở nơi khác trong cấu hình tiêu chuẩn của Fail2ban (điều này giúp giữ jail.conf di động giữa các hệ điều hành khác nhau).
 Một cài đặt khác mà bạn có thể gặp phải là filter sẽ được sử dụng để quyết định xem một dòng trong log  có chỉ ra xác thực không thành công hay không.
 Giá trị filter thực sự là một tham chiếu đến một file  nằm trong folder  /etc/fail2ban/filter.d , với phần mở rộng .conf của nó đã bị xóa. Tệp này chứa các biểu thức chính quy xác định xem một dòng trong log  có xấu hay không.  Ta  sẽ không trình bày sâu về file  này trong hướng dẫn này, bởi vì file  này khá phức tạp và các cài đặt  được định nghĩa  sẽ  trùng với  các dòng thích hợp.
Tuy nhiên, bạn có thể biết loại bộ lọc nào có sẵn bằng cách xem xét folder đó:
- ls /etc/fail2ban/filter.d 
Nếu bạn thấy file  có vẻ liên quan đến dịch vụ bạn đang sử dụng, bạn nên mở file  đó bằng editor . Hầu hết các file  đều được  comment  khá tốt và bạn có thể biết được loại tình trạng mà tập lệnh được thiết kế để bảo vệ. Hầu hết các bộ lọc này đều có các phần thích hợp (bị vô hiệu hóa) trong jail.conf mà  ta  có thể bật trong jail.local nếu muốn.
 Ví dụ: giả sử rằng  ta  đang cung cấp một trang web bằng Nginx và nhận ra rằng một phần được bảo vệ bằng password  của trang web của  ta  đang bị tấn công khi đăng nhập.  Ta  có thể yêu cầu Fail2ban sử dụng file  nginx-http-auth.conf để kiểm tra điều kiện này trong file  /var/log/nginx/error.log .
 Điều này thực sự đã được  cài đặt  trong một phần có tên [nginx-http-auth] trong file  /etc/fail2ban/jail.conf của  ta .  Ta  chỉ cần thêm một tham số enabled cho nginx-http-auth jail vào jail.local :
[DEFAULT] # Ban hosts for one hour: bantime = 3600  # Override /etc/fail2ban/jail.d/00-firewalld.conf: banaction = iptables-multiport  [sshd] enabled = true  [nginx-http-auth] enabled = true Và khởi động lại dịch vụ fail2ban :
- sudo systemctl restart fail2ban 
Giám sát Nhật ký Fail2ban và Cấu hình Tường lửa
 Điều quan trọng là phải biết rằng một dịch vụ như Fail2ban đang hoạt động như dự kiến. Bắt đầu bằng cách sử dụng systemctl để kiểm tra trạng thái của dịch vụ:
- sudo systemctl status fail2ban 
Nếu có điều gì đó không ổn ở đây, bạn có thể khắc phục sự cố bằng cách kiểm tra log  cho đơn vị fail2ban kể từ lần khởi động cuối cùng:
- sudo journalctl -b -u fail2ban 
Tiếp theo, sử dụng fail2ban-client để truy vấn trạng thái tổng thể của fail2ban-server hoặc bất kỳ nhà tù riêng lẻ nào:
- sudo fail2ban-client status 
- sudo fail2ban-client status jail_name 
Theo dõi log của Fail2ban để biết bản ghi các hành động gần đây (nhấn Ctrl-C để thoát):
- sudo tail -F /var/log/fail2ban.log 
Liệt kê các luật hiện tại được cấu hình cho iptables:
- sudo iptables -L 
Hiển thị các luật iptables ở định dạng phản ánh các lệnh cần thiết để bật từng luật :
- sudo iptables -S 
Kết luận
Đến đây bạn có thể cấu hình một số policy cấm cơ bản cho các dịch vụ của bạn . Fail2ban rất dễ cài đặt và là một cách tốt để bảo vệ bất kỳ loại dịch vụ nào sử dụng xác thực.
Nếu bạn muốn tìm hiểu thêm về cách hoạt động của Fail2ban, bạn có thể xem hướng dẫn của ta về cách hoạt động của các luật và file fail2ban .
Các tin liên quan
Cách bảo mật HAProxy bằng Let's Encrypt trên CentOS 72016-01-26
Cách tạo thiết lập tính khả dụng cao với Pacemaker, Corosync và IP nổi trên CentOS 7
2015-12-22
Cách sử dụng Prometheus để giám sát server CentOS 7 của bạn
2015-11-06
Cách cài đặt Elasticsearch 1.7, Logstash 1.5 và Kibana 4.1 (ELK Stack) trên CentOS 7
2015-11-04
Cách cài đặt và cấu hình scponly trên CentOS 7
2015-07-22
Cách viết quy tắc kiểm tra hệ thống tùy chỉnh trên CentOS 7
2015-07-16
Cách viết quy tắc kiểm tra hệ thống tùy chỉnh trên CentOS 7
2015-07-16
Cách thiết lập firewall bằng FirewallD trên CentOS 7
2015-06-18
Cách thiết lập firewall bằng FirewallD trên CentOS 7
2015-06-18
Cách phát hiện bất thường với Skyline trên CentOS 7
2015-06-16
 

