在購買了VPS之後你應該做足的安全措施中我們提到過用 的fail2ban 來保護 ssh ,這樣即使不改變SSH端口(默認為22),也可以做到避免被暴力破解密碼,當然,我們已經開啟了證書登錄並關閉了 ssh 的密碼登錄選項,但用 的fail2ban 幹掉那些不停嘗試的 bot 也是一件令人心情愉悅的事情。
其實,除了 使用 fail2ban 防止 Bind9 被用於 DNS 放大攻擊外,我們也可以用 的fail2ban 來保護 nginx ,畢竟它的原理就是用正則匹配日誌文件,然後操作 iptables,所以理論上一切能寫日誌的應用都可以用 fail2ban 來生成規則並加以保護。
這次我們就一起來看看,除了默認配置外,我們還能怎樣用 的fail2ban 來保護 nginx
首先是
配置監獄
也就是 fail2ban 的監控模塊,其實默認配置中就已經寫好了很多配置,當然我們需要手動來啟動它們。
1 |
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local |
fail2ban 會自動讀取 .本地 文件的配置,然後再增量地讀取 CONF 配置,這樣就避免了更新它時你辛辛苦苦寫好的配置被覆蓋掉了。
然後我們就來編輯 fail2ban 的配置 我們 /等等/的fail2ban/監獄.本地
首先是在 [默認] 字段下,我們可以改變一些行為參數,比如這樣修改(多餘的沒有提到的配置就保留默認,不要理會即可):
1 2 3 4 5 6 |
bantime = 3600 #默认是10分钟,这个是说要ban多久,我们改长一点 #下面这两个是说在多长时间内失败多少次就被屏蔽, #比如这个是在3600秒内失败6次就被屏蔽 findtime = 3600 maxretry = 6 |
接下來就是添加我們的監獄配置了,默認配置信息中並沒有內置 nginx ,只有 apache:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[nginx-http-auth] # HTTP 验证防暴力破解 enabled = true filter = nginx-http-auth port = http,https logpath = /var/log/nginx/error.log [nginx-badbots] #屏蔽恶意爬虫 enabled = true port = http,https filter = nginx-badbots logpath = /var/log/nginx/access.log maxretry = 2 [nginx-nohome] #避免恶意请求网站目录结构 enabled = true port = http,https filter = nginx-nohome logpath = /var/log/nginx/access.log maxretry = 2 [nginx-noproxy] #避免nginx被他人用于反向代理 enabled = true port = http,https filter = nginx-noproxy logpath = /var/log/nginx/access.log maxretry = 2 |
注意這裡的配置都是基於 nginx 的日誌的,所以你必須要允許 nginx 記錄日誌,有些管理員為了性能考量會關閉日誌,這樣我們這篇文章也就失去了意義。
另,在配置 fail2ban 之前,你就應該先安裝好 nginx,否則 fail2ban 讀不到 nginx 的日誌,會報錯。
為監獄配置規則
設置好了要啟用的監獄,接下來就是給監獄創建規則了:
1 |
cd /etc/fail2ban/filter.d |
在這個目錄下,存放這所有規則文件,一個配置名一個文件,有多少個文件就有多少個規則,這些規則被上文中監獄配置裡 過濾 字段調用。
1 |
vi nginx-http-auth.conf |
這個規則是存在的,我們在規則中加一行配置,來過濾除了賬號密碼錯誤外,空白賬號或者密碼的錯誤:
1 2 3 4 5 6 7 |
[Definition] failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ignoreregex = |
添加的是高亮的那一行。
1 |
cp apache-badbots.conf nginx-badbots.conf |
過濾爬蟲的規則是有現成的,所以我們只需要改個名就可以了;
1 |
vi nginx-nohome.conf |
這是過濾獲取目錄的:
1 2 3 4 5 |
[Definition] failregex = ^<HOST> -.*GET .*/~.* ignoreregex = |
1 |
vi nginx-noproxy.conf |
這是過濾反代的:
1 2 3 4 5 |
[Definition] failregex = ^<HOST> -.*GET http.* ignoreregex = |
確認生效
做完上述配置之後,就可以重啟 fail2ban 了 服務 的fail2ban 重新開始
這時你可以通過命令 的fail2ban-客戶 狀態 來查看,不出意外,應該類似這樣:
1 2 3 4 |
➜ ~ fail2ban-client status Status |- Number of jail: 5 `- Jail list: nginx-badbots, nginx-http-auth, nginx-nohome, nginx-noproxy, sshd |
本文由 落格博客 原創撰寫:落格博客 » Fail2Ban 高級配置 保護 Nginx 服務
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/2998.html
您好!我按照老鐵的配置設置後,[nginx的-HTTP-AUTH]配置錯誤提示:
錯誤沒有文件(小號) 發現水珠/var/log/nginx/*error.log
錯誤配置時失敗: 還沒有找到nginx的-HTTP-auth的監獄任意日誌文件。
在網上找了一大圈,但是還是找不出解決辦法,所以來請教老鐵。
首先,你要確定你nginx正確配置且啟動了,即開啟了日誌功能,有些默認配置是不開日誌的,那麼fail2ban自然就找不到日誌文件了。
其次,你的日誌目錄是在nginx裡配置的,我示例中給出的路徑是一個比較通用的路徑,但具體要看你的配置,有的人甚至喜歡把日誌寫到對應的wwwroot裡……總之要看你具體配置,兩邊路徑一致即可。
最後,治標不治本:日誌路徑= /var/log/nginx/error.log,按照路徑創建這個“error.log”文件即可。至少立即就不報錯了。
https://service.imydl.com/yunwei/594.html
被抄襲了~