---
title: "Cách bảo vệ SSH bằng Fail2Ban trên Ubuntu 14.04"
description: "Cách bảo vệ SSH bằng Fail2Ban trên Ubuntu 14.04"
url: https://cloudfly.vn/techblog/cach-bao-ve-ssh-bang-fail2ban-tren-ubuntu-1404
image: https://media.cloudfly.vn/posts/techblog_tNEx4oH.jpg
---

# Cách bảo vệ SSH bằng Fail2Ban trên Ubuntu 14.04

## Giới thiệu

Mặc dù việc kết nối với máy chủ của bạn thông qua SSH có thể rất an toàn nhưng bản thân SSH daemon là một dịch vụ phải được kết nối 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à tạo ra một phương hướng tấn công cho những kẻ có ý định tấn công.

Bất kỳ dịch vụ nào 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 chú ý đến nhật ký ứng dụng của các dịch vụ này, bạn sẽ thường thấy các nỗ lực đăng nhập có hệ thống, lặp đi lặp lại thể hiện các cuộc tấn công bạo lực của người dùng cũng như bot.

Dịch vụ có tên **Fail2ban** có thể giảm thiểu vấn đề này bằng cách tạo các quy tắc có thể tự động thay đổi cấu hình tường lửa `iptables` của bạn dựa trên số lần đăng nhập không thành công được xác định trước. Điều này sẽ cho phép máy chủ của bạn phản hồi các nỗ lực truy cập bất hợp pháp mà không cần sự can thiệp của bạn.

Trong hướng dẫn này, chúng tôi sẽ đề cập đến cách cài đặt và sử dụng Fail2ban trên máy chủ Ubuntu 14.04.

## Cài đặt Fail2Ban trên Ubuntu 14.04

Quá trình cài đặt công cụ này rất đơn giản vì nhóm Ubuntu packaging team duy trì một package trong kho mặc định.

Trước tiên, chúng ta cần cập nhật chỉ mục gói cục bộ và sau đó chúng ta có thể sử dụng `apt` để tải xuống và cài đặt gói:
```command
sudo apt-get update
sudo apt-get install fail2ban
```

Như bạn có thể thấy, việc cài đặt rất đơn giản. Bây giờ chúng ta có thể bắt đầu cấu hình tiện ích để sử dụng.

## Định cấu hình Fail2Ban với Cài đặt dịch vụ của bạn

Dịch vụ Fail2ban giữ các tập tin cấu hình của nó trong thư mục `/etc/fail2ban`. Có một tệp có tên mặc định là `jail.conf`.

Vì tệp này có thể được sửa đổi bằng cách nâng cấp gói, chúng ta không nên chỉnh sửa tệp này tại chỗ mà nên sao chép nó để chúng ta có thể thực hiện các thay đổi của mình một cách an toàn. Để hai tệp này hoạt động cùng nhau thành công, tốt nhất chỉ nên đưa các cài đặt bạn muốn ghi đè vào tệp `jail.local`. Tất cả các tùy chọn mặc định sẽ được lấy từ file `jail.conf`.

Mặc dù chúng ta chỉ nên đưa những sai lệch so với mặc định vào tệp `jail.local`, nhưng việc tạo tệp `jail.local` dựa trên tệp `jail.conf` hiện có sẽ dễ dàng hơn. Vì vậy, chúng tôi sẽ sao chép tệp đó, với nội dung được nhận xét, làm cơ sở cho tệp `jail.local` Bạn có thể làm điều này bằng cách gõ:
```command
awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local
```

Sau khi sao chép tệp, chúng ta có thể mở tệp `jail.conf` gốc để xem mọi thứ được thiết lập theo mặc định như thế nào.
```command
sudo nano /etc/fail2ban/jail.conf
```

Trong tệp này, có một số cài đặt mà bạn có thể muốn điều chỉnh. Các cài đặt nằm trong phần `[DEFAULT]` sẽ được áp dụng cho tất cả các dịch vụ được bật cho Fail2ban không bị ghi đè trong phần riêng của dịch vụ.
```nginx
[label /etc/fail2ban/jail.conf]
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8
. . .
```

Cài đặt `ignoreip` sẽ định cấu hình các địa chỉ nguồn mà fail2ban bỏ qua. Theo mặc định, nó được cấu hình để không cấm bất kỳ lưu lượng truy cập nào đến từ máy cục bộ. Bạn có thể thêm các địa chỉ bổ sung để bỏ qua bằng cách thêm phần `[DEFAULT]` với cài đặt `ignoreip` bên dưới vào tệp `jail.local`. Bạn có thể thêm các địa chỉ bổ sung bằng cách thêm chúng vào cuối lệnh, cách nhau bằng dấu cách.
```nginx
[label /etc/fail2ban/jail.conf]
[DEFAULT]
. . .
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.
```nginx
[label /etc/fail2ban/jail.conf]
[DEFAULT]
. . .
findtime = 600
maxretry = 3
. . .
```

Hai thông số tiếp theo mà các bạn muốn chú ý là `findtime` và `maxretry`. Những điều này phối hợp với nhau để thiết lập các điều kiện mà theo đó khách hàng bị phát hiện là người dùng bất hợp pháp cần bị cấm.

Biến `maxretry` đặt số lần thử mà khách hàng phải xác thực trong một khoả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, dịch vụ Fail2ban sẽ cấm khách hàng cố gắng đăng nhập 3 lần không thành công trong khoảng thời gian 10 phút.
```nginx
[label /etc/fail2ban/jail.conf]
[DEFAULT]
. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .
```

Bạn sẽ muốn đánh giá cài đặt `destemail`, `sendername` và `mta` nếu bạn muốn định cấu hình thông báo qua email. Tham số `destemail` đặt địa chỉ email sẽ nhận thông báo cấm. `sendername` đặt giá trị của trường “From” trong email. Tham số `mta` định cấu hình dịch vụ thư nào sẽ được sử dụng để gửi thư. Một lần nữa, hãy thêm chúng vào tệp `jail.local`, dưới tiêu đề `[DEFAULT]` và đặt thành các giá trị thích hợp nếu bạn muốn điều chỉnh chúng.
```nginx
[label /etc/fail2ban/jail.conf]
[DEFAULT]
. . .
action = $(action_)s
. . .
```

Tham số này định cấu hình hành động mà fail2ban thực hiện khi nó muốn đưa ra lệnh cấm. Giá trị `action_` được xác định trong tệp ngay trước tham số này. Hành động mặc định chỉ đơn giản là định cấu hình tường lửa để từ chối lưu lượng truy cập từ máy chủ vi phạm cho đến khi hết thời gian cấm.

Nếu bạn muốn định cấu hình thông báo qua email, hãy thêm hoặc bỏ ghi chú mục `action` vào tệp `jail.local` và thay đổi giá trị của nó từ `action_` thành `action_mw`. Nếu bạn muốn email bao gồm các dòng nhật ký có liên quan, bạn có thể thay đổi nó thành `action_mwl`. Đảm bảo bạn đã định cấu hình cài đặt thư thích hợp nếu bạn chọn sử dụng thông báo qua thư.

### Cài đặt jail cá nhân

Cuối cùng, chúng ta đến phần tệp cấu hình liên quan đến các dịch vụ riêng lẻ. Chúng được chỉ định bởi các tiêu đề phần, như `[ssh]`.

Mỗi phần này có thể được kích hoạt bằng cách bỏ ghi chú tiêu đề trong `jail.local` và thay đổi dòng `enabled` thành “true”:
```nginx
[label /etc/fail2ban/jail.local]
[<^>jail_to_enable<^>]
. . .
enabled = <^>true<^>
. . .
```

Theo mặc định, dịch vụ SSH được bật và tất cả các dịch vụ khác đều bị tắt.

Các phần này hoạt động bằng cách sử dụng các giá trị được đặt trong phần `[DEFAULT]` làm cơ sở và sửa đổi chúng nếu cần. Nếu muốn ghi đè bất kỳ giá trị nào, bạn có thể làm như vậy bằng cách thêm phần dịch vụ thích hợp vào `jail.local` và sửa đổi giá trị của nó.

Một số cài đặt khác được đặt ở đây là `filter` sẽ được sử dụng để quyết định xem một dòng trong nhật ký có biểu thị xác thực không thành công hay không, và `logpath` thông báo cho fail2ban biết vị trí của nhật ký cho dịch vụ cụ thể đó.

Giá trị `filter` thực sự là một tham chiếu đến một tệp nằm trong thư mục `/etc/fail2ban/filter.d`, với phần mở rộng `.conf` của nó đã bị xóa. Các tệp này chứa các biểu thức chính quy xác định xem một dòng trong nhật ký có phải là lần xác thực không thành công hay không. Chúng tôi sẽ không trình bày sâu về các tệp này trong hướng dẫn này vì chúng khá phức tạp và các cài đặt được xác định trước rất phù hợp với các dòng thích hợp.

Tuy nhiên, bạn có thể xem loại filter nào có sẵn bằng cách xem thư mục đó:
```command
ls /etc/fail2ban/filter.d
```

Nếu bạn thấy một tệp có vẻ liên quan đến dịch vụ bạn đang sử dụng, bạn nên mở tệp đó bằng trình soạn thảo văn bản. Hầu hết các tệp đều được nhận xét khá tốt và ít nhất bạn có thể biết loại tình trạng nào mà tập lệnh được thiết kế để chống lại. Hầu hết các filter này đều có các phần đặc biệt (bị vô hiệu hóa) trong tệp `jail.conf` mà chúng ta có thể kích hoạt trong tệp `jail.local` nếu muốn.

Ví dụ: giả sử rằng chúng tôi đang phục vụ một trang web bằng Nginx và nhận ra rằng một phần được bảo vệ bằng mật khẩu trên trang web của chúng tôi đang gặp sự cố khi cố gắng đăng nhập. Chúng ta có thể yêu cầu Fail2ban sử dụng tệp `nginx-http-auth.conf` để kiểm tra tình trạng này trong tệp `/var/log/nginx/error.log`.

Điều này thực sự đã được thiết lập trong một phần có tên `[nginx-http-auth]` trong tệp `/etc/fail2ban/jail.conf` của chúng tôi. Chúng tôi chỉ cần bỏ ghi chú phần trong tệp `jail.local` và lật tham số đã bật để bảo vệ dịch vụ của chúng tôi:
```nginx
[label /etc/fail2ban/jail.local]
. . .
[nginx-http-auth]

enabled = <^>true<^>
. . .
```

Nếu bật tính năng này, bạn sẽ muốn khởi động lại dịch vụ Fail2ban của mình để đảm bảo các quy tắc của bạn được xây dựng chính xác.

## Để tất cả chúng cùng nhau

Bây giờ bạn đã hiểu ý tưởng cơ bản đằng sau Fail2ban, hãy cùng thực hiện cài đặt cơ bản.

Chúng tôi sẽ định cấu hình chính sách tự động cấm cho SSH và Nginx, giống như chúng tôi đã mô tả ở trên. Chúng tôi muốn Fail2ban gửi email cho chúng tôi khi IP bị cấm.

Đầu tiên, hãy cài đặt tất cả các phần mềm có liên quan.

Nếu bạn chưa có nó, bạn sẽ cần nginx, vì chúng tôi sẽ theo dõi nhật ký của nó và bạn sẽ cần sendmail để gửi thông báo cho chúng tôi. Chúng tôi cũng sẽ lấy `iptables-persistent` để cho phép máy chủ tự động thiết lập các quy tắc tường lửa của chúng tôi khi khởi động. Chúng có thể được lấy từ kho lưu trữ mặc định của Ubuntu:
```command
sudo apt-get update
sudo apt-get install nginx sendmail iptables-persistent
```

Dừng dịch vụ `fail2ban` trong giây lát để chúng tôi có thể thiết lập tường lửa cơ sở mà không cần các quy tắc mà nó thêm vào:
```command
sudo service fail2ban stop
```

### Thiết lập tường lửa cơ sở

Khi việc đó hoàn tất, chúng ta nên triển khai tường lửa mặc định. Bạn có thể tìm hiểu cách định cấu hình tường lửa iptables trên Ubuntu 14.04 tại đây. Chúng tôi sẽ chỉ tạo một tường lửa cơ bản cho hướng dẫn này.

Chúng tôi sẽ yêu cầu nó cho phép các kết nối được thiết lập, lưu lượng truy cập do chính máy chủ tạo ra, lưu lượng truy cập dành cho các cổng máy chủ web và SSH của chúng tôi. Chúng tôi sẽ loại bỏ tất cả lưu lượng truy cập khác. Chúng ta có thể thiết lập tường lửa cơ bản này bằng cách gõ:
```command
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -A INPUT -j DROP
```

Các lệnh này sẽ thực hiện chính sách trên. Chúng ta có thể xem các quy tắc tường lửa hiện tại của mình bằng cách gõ:
```command
sudo iptables -S
```

```
[secondary_label Output]
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
<^>-A INPUT -i lo -j ACCEPT<^>
<^>-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT<^>
<^>-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT<^>
<^>-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT<^>
<^>-A INPUT -j DROP<^>
```

Bạn có thể lưu tường lửa để chúng tồn tại khi khởi động lại bằng cách gõ:
```command
sudo dpkg-reconfigure iptables-persistent
```

Sau đó, bạn có thể khởi động lại `fail2ban` để triển khai các quy tắc gói:
```command
sudo service fail2ban start
```

Chúng ta có thể xem các quy tắc tường lửa hiện tại của mình bằng cách gõ:
```command
sudo iptables -S
```

```
[secondary_label Output]
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
<^>-N fail2ban-ssh<^>
<^>-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh<^>
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
<^>-A fail2ban-ssh -j RETURN<^>
```

Chúng tôi có chính sách mặc định cho từng chuỗi của mình và sau đó là năm quy tắc cơ bản mà chúng tôi đã thiết lập. Trong màu đỏ, chúng tôi cũng có cấu trúc mặc định được thiết lập bởi Fail2ban vì nó đã triển khai các chính sách cấm SSH theo mặc định. Lúc đầu, những thứ này có thể hiển thị hoặc không, vì đôi khi `fail2ban` không thêm cấu trúc cho đến khi lệnh cấm đầu tiên được thực hiện.

### Điều chỉnh cấu hình Fail2ban

Bây giờ, chúng ta cần định cấu hình Fail2ban bằng các cài đặt mà chúng ta muốn. Mở tệp `jail.local`:
```command
sudo nano /etc/fail2ban/jail.local
```

Chúng ta có thể đặt thời gian cấm nghiêm khắc hơn tại đây. Tìm và bỏ ghi chú tiêu đề `[DEFAULT]`. Trong tiêu đề mặc định, hãy thay đổi cài đặt `bantime` để dịch vụ của chúng tôi cấm khách hàng trong nửa giờ:
```nginx
[label /etc/fail2ban/jail.local]
[DEFAULT]
. . .
bantime = 1800
. . .
```

Chúng tôi cũng cần định cấu hình thông tin email cảnh báo của mình. Đầu tiên, hãy tìm tham số `destemail`, tham số này cũng nằm trong tiêu đề `[DEFAULT]`. Nhập địa chỉ email mà bạn muốn sử dụng để thu thập những tin nhắn này:
```nginx
[label /etc/fail2ban/jail.local]
[DEFAULT]
. . .
destemail = <^>admin@example.com<^>
. . .
```

Bạn có thể đặt `sendername` thành tên khác nếu muốn. Tuy nhiên, sẽ rất hữu ích khi có một giá trị có thể dễ dàng lọc bằng dịch vụ thư của bạn, nếu không hộp thư đến thông thường của bạn có thể tràn ngập cảnh báo nếu có nhiều lần thử bị gián đoạn từ nhiều nơi khác nhau.

Di chuyển xuống dưới, chúng ta cần điều chỉnh tham số `action` thành một trong những hành động gửi email cho chúng ta. Các lựa chọn là giữa `action_mw` để đưa ra lệnh cấm và sau đó gửi email cho chúng tôi báo cáo "whois" về máy chủ vi phạm, hoặc `action_mwl` để thực hiện hành động trên nhưng cũng gửi email cho các dòng nhật ký có liên quan.

Chúng tôi sẽ chọn `action_mwl` vì dòng nhật ký sẽ giúp chúng tôi khắc phục sự cố và thu thập thêm thông tin nếu có vấn đề:
```nginx
[label /etc/fail2ban/jail.local]
[DEFAULT]
. . .
<^>action = %(action_mwl)s<^>
. . .
```

Chuyển sang phần SSH của chúng tôi, nếu chúng tôi muốn điều chỉnh số lần thử không thành công được phép trước khi lệnh cấm được thiết lập, bạn có thể chỉnh sửa mục nhập `maxretry`. Nếu bạn đang sử dụng cổng khác “22”, bạn sẽ muốn điều chỉnh thông số `port` một cách thích hợp. Như chúng tôi đã nói trước đây, dịch vụ này đã được bật nên chúng tôi không cần sửa đổi dịch vụ đó.

Tiếp theo tìm kiếm phần `nginx-http-auth`. Bỏ ghi chú tiêu đề và thay đổi tham số `enabled` thành “true”.
```nginx
[label /etc/fail2ban/jail.local]
. . .
<^>[nginx-http-auth]<^>

<^>enabled = true<^>
. . .
```

Đây là tất cả những gì bạn phải làm trong phần này trừ khi máy chủ web của bạn đang hoạt động trên các cổng không chuẩn hoặc nếu bạn đã di chuyển đường dẫn nhật ký (log path) lỗi mặc định.

### Khởi động lại dịch vụ Fail2ban

Khi bạn hoàn tất, hãy lưu và đóng tệp.

Bây giờ, hãy bắt đầu hoặc khởi động lại dịch vụ Fail2ban của bạn. Đôi khi, tốt hơn hết là bạn nên tắt hoàn toàn dịch vụ rồi khởi động lại:
```command
sudo service fail2ban stop
```

Bây giờ chúng ta có thể khởi động lại nó bằng cách gõ:
```command
sudo service fail2ban start
```

Có thể mất vài phút để tất cả các quy tắc tường lửa của bạn được áp dụng. Đôi khi, các quy tắc không được thêm vào cho đến khi lệnh cấm đầu tiên thuộc loại đó được ban hành. Tuy nhiên, sau một thời gian, bạn có thể kiểm tra các quy tắc mới bằng cách gõ:
```command
sudo iptables -S
```

```
[secondary_label Output]
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
<^>-N fail2ban-nginx-http-auth<^>
<^>-N fail2ban-ssh<^>
<^>-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth<^>
<^>-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh<^>
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
<^>-A fail2ban-nginx-http-auth -j RETURN<^>
<^>-A fail2ban-ssh -j RETURN<^>
```

Các dòng màu đỏ là những dòng mà chính sách Fail2ban của chúng tôi đã tạo. Hiện tại, họ chỉ hướng lưu lượng truy cập đến các chuỗi mới, gần như trống và sau đó cho phép lưu lượng truy cập quay trở lại chuỗi INPUT.

Tuy nhiên, những chuỗi mới này sẽ là nơi bổ sung các quy định cấm.

### Kiểm tra chính sách cấm

Từ một máy chủ khác, một máy chủ không cần đăng nhập vào máy chủ Fail2ban của bạn, chúng tôi có thể kiểm tra các quy tắc bằng cách cấm máy chủ thứ hai của chúng tôi.

Sau khi đăng nhập vào máy chủ thứ hai của bạn, hãy thử SSH vào máy chủ Fail2ban. Ví dụ: bạn có thể thử kết nối bằng tên không tồn tại:
```command
ssh blah@<^>fail2ban_server_IP<^>
```

Nhập các ký tự ngẫu nhiên vào dấu nhắc mật khẩu. Lặp lại điều này một vài lần. Tại một thời điểm nào đó, máy chủ Fail2ban sẽ ngừng phản hồi với thông báo `Permission denied`. Điều này báo hiệu rằng máy chủ thứ hai của bạn đã bị cấm sử dụng máy chủ Fail2ban.

Trên máy chủ Fail2ban của bạn, bạn có thể xem quy tắc mới bằng cách kiểm tra lại iptables của chúng tôi:
```command
sudo iptables -S
```

```
[secondary_label Output]
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N fail2ban-nginx-http-auth
-N fail2ban-ssh
-A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
<^>-A fail2ban-ssh -s 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable<^>
-A fail2ban-ssh -j RETURN
```

Như bạn có thể thấy trong dòng được đánh dấu, chúng tôi có một quy tắc mới trong cấu hình từ chối lưu lượng truy cập đến cổng SSH đến từ địa chỉ IP của máy chủ thứ hai của chúng tôi. Bạn cũng sẽ nhận được email về lệnh cấm đối với tài khoản bạn đã định cấu hình.

## Kết luận

Bây giờ bạn có thể định cấu hình một số chính sách cấm cơ bản cho dịch vụ của mình. Fail2ban rất dễ cài đặt và là cách tuyệt vời để 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 chúng tôi về cách hoạt động của các quy tắc và tệp Fail2ban.

Để biết thông tin về cách sử dụng Fail2ban để bảo vệ các dịch vụ khác, hãy thử các liên kết sau:

* Cách bảo vệ máy chủ Nginx bằng Fail2Ban trên Ubuntu 14.04
* Cách bảo vệ máy chủ Apache bằng Fail2Ban trên Ubuntu 14.04
