我的網站被暴力破解後之ssh加固與Nginx流量控制

陳小c 2022-01-07 07:22:50 阅读数:202

暴力破解 暴力 破解 ssh 加固

一、發現

當我登錄我的服務器看到下面這行英文時,我就知道沒那麼簡單
There were 622 failed login attempts since the last successful login.
我們查看一下/var/log/secure這個文件,查看ssh登陸紀錄

我們
果然發現大量肉雞ssh我們的服務器,這些IP全部來源於海外,我們截取其中的一段進行分析

Nov 28 10:56:35 website sshd[13040]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=219.255.172.20 user=root
Nov 28 10:56:35 website sshd[13040]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Nov 28 10:56:37 website sshd[13040]: Failed password for root from 219.255.172.20 port 44562 ssh2
Nov 28 10:56:37 website sshd[13040]: Received disconnect from 219.255.172.20 port 44562:11: Bye Bye [preauth]
Nov 28 10:56:37 website sshd[13040]: Disconnected from 219.255.172.20 port 44562 [preauth]

這段話的意思是219.255.172.20 這個ip使用錯誤的密碼嘗試登陸我的服務器,也就是俗稱的ssh暴力破解!

二、處理

注意:公有雲環境可以通過安全組限制源IP,因為筆者有遠程運維的需求,所以這種方案被我PASS掉了,其他小夥伴可以采用這種方案,也是最安全有效的

2.1、更改ssh默認端口

我這裏是將22端口更改為2222端口,使用其他把下面命令中的2222更改即可

sed -i 's/#Port 22/Port 2222/g' /etc/ssh/sshd_config ##更改為2222端口
systemctl restart sshd ##重啟ssh服務,當前連接不會斷開,下次連接需要使用2222端口

注意:如果是公有雲環境,需要在安全組放通上面開放的端口

2.2、用/etc/hosts.allow 和/etc/hosts.deny來控制

思路:我們可以寫一個脚本,通過/var/log/secure中,通過統計訪問失敗的ip,超過四次就將他加入到/etc/hosts.deny中,加入之後就不能登錄到服務器了,即使密碼正確,必須要管理員來把他删掉才可以進入。把這個脚本加入crontab裏。

2.2.1、添加常用ip到/etc/hosts.allow中

先寫/etc/hosts.allow。這個很關鍵。可以把我們日常登錄的ip都寫上,以免登錄出錯多了,登錄不進去
比如我的ip是33.33.33.33,我們可以這樣寫

vim /etc/hosts.allow
#####################
sshd:33.33.33.33:allow

2.2.2、編寫脚本

脚本如下:

#!/bin/bash
cat /dev/null > /root/black.deny
awk '/Failed/{time[$(NF-3)]++}END{for(ip in time) if(time[ip]> 4)print ip}' /var/log/secure >> /root/black.deny
for i in `cat /root/black.deny`
do
grep $i /etc/hosts.deny > /dev/null
if [ $? -ne 0 ]
then
echo "sshd:$i:deny"
echo "sshd:$i:deny" >> /etc/hosts.deny
fi
done

脚本解讀
通過awk命令中的for循環於if語句,判斷登陸失敗的times是否超過4,如果超過4,那麼我們將他的ip進行組合存入hosts.deny文件中,實現拒絕該IP,上面還做了一個判斷,已經存在的就不再添加了。

2.2.3、寫入定時任務中

1分鐘執行一次,並把日志存到/var/log/ssh_deny.log中

crontab -e
0 */1 * * * sh /root/cron_sh/sshd_failed_4.sh >> /var/log/ssh_deny.log ##wq保存
systemctl restart sshd ##重啟ssh服務

三、Nginx 配置防禦DDos,cc等流量攻擊

3.1、限制同一時間段ip訪問次數

nginx可以通過ngx_http_limit_conn_module和ngx_http_limit_req_module配置來限制ip在同一時間段的訪問次數.

  • ngx_http_limit_conn_module:該模塊用於限制每個定義的密鑰的連接數,特別是單個IP​​地址的連接數.使用limit_conn_zone和limit_conn指令.

  • ngx_http_limit_req_module:用於限制每一個定義的密鑰的請求的處理速率,特別是從一個單一的IP地址的請求的處理速率。使用“泄漏桶”方法進行限制.指令:limit_req_zone和limit_req.

配置用法實例如下:

http {

limit_conn_zone $binary_remote_addr zone=addr:10m;
#定義一個名為addr的limit_req_zone用來存儲session,大小是10M內存,
#以$binary_remote_addr 為key,
#nginx 1.18以後用limit_conn_zone替換了limit_conn,
#且只能放在http{}代碼段.
...
server {

...
location /download/ {

limit_conn addr 1; #連接數限制
#設置給定鍵值的共享內存區域和允許的最大連接數。超出此限制時,服務器將返回503(服務臨時不可用)錯誤.
#如果區域存儲空間不足,服務器將返回503(服務臨時不可用)錯誤
}

在這裏插入圖片描述
超過限制返回503,如上圖
可能有幾個limit_conn指令,以下配置將限制每個客戶端IP與服務器的連接數,同時限制與虛擬服務器的總連接數:

http {

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m
...
server {

...
limit_conn perip 10; #單個客戶端ip與服務器的連接數.
limit_conn perserver 100; #限制與服務器的總連接數
}

參考文檔:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

3.2、限制某一時間內,單一IP的請求數.

ngx_http_limit_req_module:限制某一時間內,單一IP的請求數.
配置如下:

http {

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
#定義一個名為one的limit_req_zone用來存儲session,大小是10M內存, 
#以$binary_remote_addr 為key,限制平均每秒的請求為1個,
#1M能存儲16000個狀態,rete的值必須為整數,
server {

...
location /search/ {

limit_req zone=one burst=5;
#限制每ip每秒不超過1個請求,漏桶數burst為5,也就是隊列.
#nodelay,如果不設置該選項,嚴格使用平均速率限制請求數,超過的請求被延時處理.
#舉個栗子:
#設置rate=20r/s每秒請求數為20個,漏桶數burst為5個,
#brust的意思就是,如果第1秒、2,3,4秒請求為19個,第5秒的請求為25個是被允許的,可以理解為20+5
#但是如果你第1秒就25個請求,第2秒超過20的請求返回503錯誤.
#如果區域存儲空間不足,服務器將返回503(服務臨時不可用)錯誤
#速率在每秒請求中指定(r/s)。如果需要每秒少於一個請求的速率,則以每分鐘的請求(r/m)指定。
}

3.3、禁止ip或ip網段

統計每個ip的登陸次數

awk '{print $1}' access.log |sort |uniq -c|sort -n

在nginx的安裝目錄下面,新建屏蔽ip文件,命名為guolv_ip.conf,以後新增加屏蔽ip只需編輯這個文件即可。 加入如下內容並保存:

deny 66.249.79.84 ;
在nginx的配置文件nginx.conf中加入如下配置,可以放到http, server, location, limit_except語句塊,需要注意相對路徑,本例當中nginx.conf,guolv_ip.conf在同一個目錄中。

include guolv_ip.conf;
保存nginx.conf文件,然後測試現在的nginx配置文件是否是合法的:

nginx -t
如果配置沒有問題,就會輸出:

the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful

如果配置有問題就需要檢查下哪兒有語法問題,如果沒有問題,需要執行下面命令,重載 nginx 配置文件:

service nginx reload
屏蔽ip的配置文件既可以屏蔽單個ip,也可以屏蔽ip段,或者只允許某個ip或者某個ip段訪問。

//屏蔽單個ip訪問
deny IP;
//允許單個ip訪問
allow IP;
//屏蔽所有ip訪問
deny all;
//允許所有ip訪問
allow all;
//屏蔽整個段即從123.0.0.1到123.255.255.254訪問的命令
deny 123.0.0.0/8
//屏蔽IP段即從123.45.0.1到123.45.255.254訪問的命令
deny 124.45.0.0/16
//屏蔽IP段即從123.45.6.1到123.45.6.254訪問的命令
deny 123.45.6.0/24
//如果你想實現這樣的應用,除了幾個IP外,其他全部拒絕,
//那需要你在guolv_ip.conf中這樣寫
allow 1.1.1.1;
allow 1.1.1.2;
deny all;

單獨網站屏蔽IP的方法,把include guolv_ip.conf; 放到網址對應的在server{}語句塊,
所有網站屏蔽IP的方法,把include guolv_ip.conf; 放到http {}語句塊。

參考網站:
https://my.oschina.net/u/2607135/blog/1844590
https://blog.csdn.net/qq_41201816/article/details/88136947

版权声明:本文为[陳小c]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201070722503473.html