修改centos7遠程端口和nginx安全設置


公司給了個阿里雲服務器,自己搭了測試環境。沒過幾天,發現被掃描了,內容大概這樣

2019/10/29 20:53:59 [error] 1269#0: *5878 open() "xxxxx/whoami.php" failed (2: No such file or directory), client: 172.105.23.36, server: localhost, request: "GET /whoami.php HTTP/1.1", host: "xxx.xxx.xxx.xxx"
2019/10/29 20:57:39 [error] 1269#0: *5879 open() "xxxxx/cache/global/img/gs.gif" failed (2: No such file or directory), client: 80.82.70.187, server: localhost, request: "GET http://www.baidu.com/cache/global/img/gs.gif HTTP/1.1", host: "www.baidu.com"
2019/10/29 21:01:01 [error] 1269#0: *5882 open() "xxxxx/cache/global/img/gs.gif" failed (2: No such file or directory), client: 80.82.70.187, server: localhost, request: "GET http://www.baidu.com/cache/global/img/gs.gif HTTP/1.1", host: "www.baidu.com"
2019/10/29 22:45:18 [error] 1269#0: *5923 open() "xxxxx/editBlackAndWhiteList" failed (2: No such file or directory), client: 159.203.196.79, server: localhost, request: "GET /editBlackAndWhiteList HTTP/1.1", host: "xxx.xxx.xxx.xxx", referrer: "188.65.219.106"
2019/10/29 23:48:55 [error] 1269#0: *5936 open() "xxxxx/index.php" failed (2: No such file or directory), client: 45.67.14.148, server: localhost, request: "POST /index.php HTTP/1.1", host: "xxx.xxx.xxx.xxx"
2019/10/30 03:23:02 [error] 1269#0: *5963 open() "xxxxx/azenv.php" failed (2: No such file or directory), client: 95.213.177.124, server: localhost, request: "POST http://check.proxyradar.com/azenv.php?auth=157237698109&a=PSCN&i=2018398604&p=80 HTTP/1.1", host: "check.proxyradar.com", referrer: "http://best-proxies.r(這里博客園提示敏感詞,汗。。)u/"

嗯。。我一個java后台你掃我php。。

還有為什么會有來自百度的請求,麻煩知道的大佬指教一二,先謝過了!

好可怕,嚇得我趕緊改了遠程端口,記錄一下。

修改遠程端口

1 先決定一個新的遠程端口(這里用12345舉例),去服務器的安全組開放此端口。

2 遠程連接進服務器

vim /etc/ssh/sshd_config

先將Port 22前面的注釋放開,然后再其下面再添加一條(這樣22和12345都可遠程連接。這么做是為了一會先試新端口,成功了再回來關閉22端口,不然直接改了回頭發現新端口連不上就坑大了)

Port 22
Port 12345

3 重啟sshd

service sshd restart

4 用新端口遠程連接,成功后關閉安全組的22端口(到這里發現sshd_config的22端口開着好像也沒事,因為最外面的安全組已經屏蔽了)。

關閉8080端口

改好遠程端口后,突然又想到,項目是前后台分離,前端80,后端8080。但其實對外只用暴露80端口,8080不需要暴露,這不是又多了一個別人掃你api的風險么。

於是,利用nginx的轉發功能實現之。

1 將后台的api訪問url由xxx.xxx.xxx.xxx:8080改為xxx.xxx.xxx.xxx/api

2 nginx的配置添加

location /api/ {
    proxy_pass   http://localhost:8080/;
}

這里說下proxy_pass 后面的url帶斜線(/)和不帶的區別

假設后台訪問路徑為test.do

1) 加斜線就是直接將配置的路徑轉發到url下,例如
```
location /api/ {
	proxy_pass   http://localhost:8080/;
}
```
最后訪問路徑為 http://localhost:8080/test.do

2) 不加斜線是將配置的路徑加入到url后面,例如
```
location /api/ {
	proxy_pass   http://localhost:8080;
}
```
最后訪問路徑為 http://localhost:8080/api/test.do

那么我這里當然是使用加斜線的配置

再順帶一提,如果后台做了負載均衡,只用把proxy_pass后面換成對應的upstream即可,如

location /api/ {
    proxy_pass   http://backend/;
}

upstream backend {
	server localhost:8081 weight=1;
	server localhost:8082 weight=1;
}

嗯,好像徹底沒8080端口什么事了。

3 重啟nginx

./nginx -s reload

Nginx反爬蟲(禁止User Agent)

網絡上不光有無聊(並不,是想抓肉雞)的掃描,還有灰常多的爬蟲,有的有益(如百度蜘蛛),有的是惡意訪問,浪費流量,所以我們需要設置一下

1 進入nginx配置目錄,創建一個新的配置文件agent_deny.conf

cd /usr/local/nginx/conf
vim agent_deny.conf

寫入如下內容

#禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|bot|Python|sql|php|HttpClient)) {
     return 403;
}
 
#禁止指定UA及UA為空的訪問
if ($http_user_agent ~ "WinHttp|WebZIP|FetchURL|node-superagent|java/|FeedDemon|Jullo|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|Java|Feedly|Apache-HttpAsyncClient|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|BOT/0.1|YandexBot|FlightDeckReports|Linguee Bot|^$" ) {
     return 403;             
}
 
#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403;
}

2 在網站配置中的server段引入上面的配置文件

server {
	...

	include agent_deny.conf;
	
	...
}

3 重啟nginx

./nginx -s reload

4 測試

curl -I -A "BaiduSpider" www.yourdomainname.com

結果正常

HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Tue, 26 Nov 2019 09:33:50 GMT
Content-Type: text/html
Content-Length: 51
Last-Modified: Fri, 22 Nov 2019 08:52:51 GMT
Connection: keep-alive
ETag: "5dd7a1e3-33"
Accept-Ranges: bytes
curl -I -A "JikeSpider" www.yourdomainname.com

訪問拒絕

HTTP/1.1 403 Forbidden
Server: nginx/1.16.1
Date: Tue, 26 Nov 2019 09:35:07 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive

說明我們配置有效了。后續agent_deny.conf根據實際情況調整。

附:垃圾UA

FeedDemon             內容采集
BOT/0.1 (BOT for JCE) sql注入
CrawlDaddy            sql注入
Java                  內容采集
Jullo                 內容采集
Feedly                內容采集
UniversalFeedParser   內容采集
ApacheBench           cc攻擊器
Swiftbot              無用爬蟲
YandexBot             無用爬蟲
AhrefsBot             無用爬蟲
YisouSpider           無用爬蟲(已被UC神馬搜索收購,此蜘蛛可以放開!)
jikeSpider            無用爬蟲
MJ12bot               無用爬蟲
ZmEu phpmyadmin       漏洞掃描
WinHttp               采集cc攻擊
EasouSpider           無用爬蟲
HttpClient            tcp攻擊
Microsoft URL Control 掃描
YYSpider              無用爬蟲
jaunty                wordpress爆破掃描器
oBot                  無用爬蟲
Python-urllib         內容采集
Indy Library          掃描
FlightDeckReports Bot 無用爬蟲
Linguee Bot           無用爬蟲

Nginx防DDoS

分布式拒絕服務攻擊(DDoS),是通過多台機器,向特定目標網站發送大量並發連接,從而使其癱瘓的攻擊方式。

nginx在此方面也可進行一定防御配置。

1 限制請求率

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; // 所有訪問ip,限制每秒10個請求

server {
    # ...
    location / {
        limit_req zone=one burst=5 nodelay; //緩沖區大小為5,如果短期內超過10個請求,會由緩存區暫存。nodelay代表暫存區直接處理
    # ...
    }
}

參數說明

$binary_remote_addr  二進制遠程地址
zone=one:10m    定義zone名字叫one,並為這個zone分配10M內存,用來存儲會話(二進制遠程地址),1m內存可以保存16000會話
rate=10r/s;     限制頻率為每秒10個請求
burst=5         允許超過頻率限制的請求數不多於5個,假設1、2、3、4秒請求為每秒9個,那么第5秒內請求15個是允許的,反之,如果第一秒內請求15個,會將5個請求放到第二秒,第二秒內超過10的請求直接503,類似多秒內平均速率限制。
nodelay         超過的請求不被延遲處理,設置后15個請求在1秒內處理。

2 限制連接數

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
    # ...
    location /download/ {
        limit_conn addr 1;       //限制同一個時間內1個連接,多余的直接返回503
        # ...
    }
}

3 關閉慢速連接

http {
    client_body_timeout 5s;
    client_header_timeout 5s;
    # ...
}

關閉不太頻繁寫入數據的連接,它們僅僅是為了保持連接盡可能長的時間,以此降低服務器接收新連接的能力。Slowloris就是這種攻擊的一個典型例子。

client_body_timeoutclient_header_timeout 定義讀取客戶端請求體和請求頭的超時時間。這兩個參數的默認值都是 60s,上面的例子將它們設為了5s。

友好提示

上面做了限流處理,那么不排除有些用戶就是手快(賤),點着玩,那么我們如何給與友好提示呢。

我們可以自定義503錯誤返回信息

error_page 503 /503;
location = /503 {
	default_type application/json;
		add_header Content-Type 'text/html; charset=utf-8';
		return 200 '{"code":"503","msg":"您的操作太頻繁,請稍后再試..."}';
}

然后前端js處理一下,比如我是ajax,那么就在error回調方法里特殊處理一下

$.ajax({
	type: "POST",
	dataType: "json",
	url: "xxx",
	data: data,
	success: function (result) {
		// balabala..
	},
	error : function(result) {
	  if(result.responseJSON["code"] == 503){
		alert(result.responseJSON["msg"]);
		return;
	  }
	  alert('未知異常');
	}
});

Nginx防盜鏈

假如我們的網站里有優質圖片,可能會被別人直接拿去使用,這樣白白就消耗了我們的服務器帶寬或流量資源。

故我們對特定資源做以下設置

location ~* \.(gif|jpg|png|swf|flv)$ {
	root /xxx/yyy
	valid_referers none blocked server_names;
	if ($invalid_referer) {
		return 403;
		# 也可返回一個圖片,圖片內容一般是三個字:防盜鏈
		#  rewirte ^/ http://xxx.com/yyy/zzz.png;
	}
}

還可以對特定目錄設置

location /img/ {
	root /xxx/yyy/;
	valid_referers none blocked server_names;
	if ($invalid_referer) {
		return 403;
	}
}

如此一來,其他網站就不能引用我們圖片了。

當然,對方依舊可以使用工具偽造referer,這種情況就只能動用其他防護措施了,但一般情況的話,上述配置足夠了。

總結

這樣服務器對外只暴露80端口(遠程端口外界是未知的),屏蔽了一些惡意掃描或訪問,終於感覺安全了一丟丟~

至於數據庫,redis(記得設置密碼)等遠程端口,在測試階段可以開放,最后生產環境還是關閉比較安全。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM