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