被黑客用nginx攻擊了網(wǎng)站,該怎么辦?

最好的防御方式就是攻擊 知己知彼,百戰(zhàn)不殆。掌握攻擊者的套路才好頂?shù)米」簟?br>
可能我的讀者多少了解過Nginx,我先給不了解的同學(xué)簡單說一下原理。已經(jīng)了解的跳到第二節(jié)。

3分鐘了解Nginx
Nginx是一款高性能的Web服務(wù)器和反向代理服務(wù)器。

它可以用來搭建網(wǎng)站、做應(yīng)用服務(wù)器,能夠處理大量的并發(fā)連接和請求。

靜態(tài)內(nèi)容托管(主要):可以用來做網(wǎng)頁、圖片、文件的 “靜態(tài)”內(nèi)容托管。
動態(tài)內(nèi)容托管(主要):將經(jīng)常訪問的動態(tài)內(nèi)容緩存到內(nèi)存中,提高訪問速度和性能。
反向代理(主要):將客戶端的請求發(fā)送到后端真實服務(wù)器,并將后端服務(wù)器的響應(yīng)返回給客戶端。
類似于一個快遞收發(fā)室,指揮快遞(流量)應(yīng)該投遞到哪個買家。

它還能提供一些高級功能:

負載均衡:將客戶端的請求分發(fā)到多個后端服務(wù)器上,從而提高服務(wù)的可用性和性能。
SSL/TLS加密傳輸:通過加密和認證保護數(shù)據(jù)傳輸安全。
HTTP/2支持:通過多路復(fù)用技術(shù)提高并發(fā)連接處理能力和頁面加載速度。
安全防護:提供多種防護機制,如限制IP訪問、請求頻率限制、反爬蟲等。
動態(tài)內(nèi)容處理:支持FastCGI、uWSGI等協(xié)議,與后端應(yīng)用服務(wù)器進行動態(tài)內(nèi)容交互。
日志記錄:記錄訪問日志和錯誤日志,方便監(jiān)控和排查問題。
自定義模塊開發(fā):支持自定義模塊開發(fā),可以根據(jù)需求進行二次開發(fā)和擴展。
讀到這里,我知道很多人腦子都要爆了?,F(xiàn)在讓我們直入主題。結(jié)合以上功能的能做哪些攻擊方式。

反向代理攻擊
使用Nginx作為反向代理服務(wù)器,將攻擊流量轉(zhuǎn)發(fā)到目標服務(wù)器。這樣就能隱藏攻擊流量的真實地址。

server {
    listen 80;
    server_name www.example.com;
    location / {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
所有訪問www.example.com:80的流量全部都會轉(zhuǎn)發(fā)到http://backend_server服務(wù)器上。
proxy_set_header X-Real-IP $remote_addr; 設(shè)置請求頭提供真實來源ip。
proxy_set_header Host $host;設(shè)置訪問的Host。
只要把X-Real-IP改成其他不存在的IP,就可以隱藏自己的真實IP地址,讓攻擊更難以被追蹤和防御。當(dāng)然相對于客戶端來說,只能知道nginx的地址就不知道真實服務(wù)器的地址了。

DDoS攻擊
DDoS攻擊就是借助某些工具瞬間發(fā)動大量的請求,讓服務(wù)器資源耗盡,無法正常響應(yīng)其他用戶的請求,一般也常用于壓力測試。介紹一些常用的工具:

ApacheBench (ab):常用的命令行工具,用于模擬多個并發(fā)請求。可以控制請求總數(shù)、并發(fā)數(shù)等參數(shù)。
Siege:命令行工具,和上面一樣,并且還支持 HTTP 和 HTTPS 協(xié)議。
JMeter:一個功能強大的 Java 應(yīng)用程序,可以用于模擬各種負載情況。JMeter 可以通過圖形界面進行配置,支持更多協(xié)議和數(shù)據(jù)格式,包括 HTTP、HTTPS、SOAP、REST 等。
但事實往往比這個殘酷,攻擊者會做一些病毒,在網(wǎng)絡(luò)上傳播開來,病毒運行時可以直接瘋狂訪問服務(wù)器,或者利用Nginx提供的反向代理和其支持的比如socket、SSL,不斷的建立握手請求。

限流、黑名單防御
小熊主要給大家介紹怎么防御。這種病毒感染方式就不說了,我害怕戴銀手銬。

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;

    geo $block {
        default 0;
        include /path/to/block_ip.txt;
    }

    server {
        listen 80;

        location / {
            limit_req zone=one burst=10 nodelay;
            if ($block) {
                return 403;
            }
            proxy_pass http://backend;
        }
    }
}
limit_req_zone 定義了一個名為“one”的限制請求速率的區(qū)域,該區(qū)域的大小為10MB,請求速率限制為每秒5個請求。
limit_req 指定使用名為“one”的限制規(guī)則。
geo $block是黑名單,這個文件可以寫需要屏蔽的ip。
server塊中的location指令使用了limit_req和if表示黑名單的返回403狀態(tài)碼。
負載均衡防御
假設(shè)我有兩個后端服務(wù)器。

http {
  upstream backend {
    # 輪詢方式的負載均衡
    server backend1.example.com;
    server backend2.example.com;
  }
...
  server{...}
}
有多種負載均衡方式。

 server {
   ...
    location /api/ {
      # 輪訓(xùn)
      proxy_pass http://backend;
    }

    location /lb/ {
      # IP哈希方式的負載均衡
      ip_hash;
      proxy_pass http://backend;
    }

    location /upstream/ {
      # 根據(jù)服務(wù)器性能或響應(yīng)時間進行加權(quán)輪詢
      upstream backend {
        server backend1.example.com weight=2;
        server backend2.example.com;
      }
      # 對 backend 進行訪問
      proxy_pass http://backend;
    }

    location /least_conn/ {
      # 最少連接數(shù)的負載均衡
      least_conn;
      proxy_pass http://backend;
    }

    location /random/ {
      # 隨機方式的負載均衡
      random;
      proxy_pass http://backend;
    }

    location /sticky/ {
      # 基于客戶端IP的哈希方式的負載均衡
      hash $remote_addr consistent;
      server backend1.example.com;
      server backend2.example.com;
    }
  }
很多人學(xué)nginx都會對ip_hash和基于客戶端IP的哈希方式的負載均衡有疑惑。分不清,我一句話給大家講清楚。

ip_hash能保證相同來源一定能訪問相同的服務(wù)器,適用于登錄等有狀態(tài)的場景。在請求量少的時候,容易出現(xiàn)很多ip落在同一服務(wù)器上,分布不均衡。
基于客戶端ip的hash,是根據(jù)客戶端 IP 地址計算哈希值,然后將哈希值與后端服務(wù)器數(shù)量取模。使請求平均分配到不同的服務(wù)器上,也能保證同一ip請求落到同一服務(wù)器上。但是可以保證各個服務(wù)器比較均衡。
我認為使用方式二更好,可能理解有限,歡迎各位讀者分享自己的看法!

網(wǎng)絡(luò)釣魚攻擊
黑客可以使用Nginx偽裝成一個合法的網(wǎng)站,誘騙用戶輸入敏感信息。例如,他們可以使用Nginx構(gòu)造一個偽造的登錄頁面,讓用戶輸入用戶名和密碼,然后將這些信息發(fā)送給黑客服務(wù)器。

其實就是靜態(tài)托管+反向代理功能的組合。

server {
    listen       80;
    server_name  example.com;

    # 靜態(tài)網(wǎng)站托管
    location / {
        root   /var/www/mywebsite/dist;
        index  index.html index.htm;
    }

    # API代理轉(zhuǎn)發(fā)
    location /api {
        proxy_pass  http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
訪問根目錄就訪問到靜態(tài)的網(wǎng)站資源。
訪問/api路由轉(zhuǎn)發(fā)到api服務(wù)上。
我的博客就用了這種方式,同樣的我寫了很多了不同的server{}塊,來監(jiān)聽不同的域名,這樣我可以把多個網(wǎng)站全部部署在同一臺機器上,極限利用服務(wù)器資源。

最后
這兩天在寫一個小程序,計劃做成程序員資源、求助、內(nèi)推、課程、學(xué)習(xí)路線圖之類的綜合類小程序,所以更新有點慢了,見諒見諒。

對于今天所述的文章,真正有不良居心的人,總是會有更sao的攻擊方法。我也不敢說得太多,而且這些攻擊的行為都是違法的,建議大家學(xué)會以后手下留情。

今天的目的實際上是教大家學(xué)會nginx的常用配置方法,用心良苦,莫辜負點個贊再走。



作者:熊哥


歡迎關(guān)注微信公眾號 :釋然IT雜談