nginx 安全配置文檔

1.配置文檔中有多處明確寫出了nginx的配置文件路徑,該路徑是測試環境中的路徑,線上系統的nginx配置文件與文檔中所寫的路徑可能不同,在進行相關配置時,應以線上配置文件的實際路徑爲準。html

線上系統nginx的安裝目錄在:/usr/local/nginx,默認配置文件在/usr/local/nginx/conf/nginx.conf,此外也引用了/usr/local/nginx/conf/conf.d目錄下的配置文件。nginx

2.本文檔僅包括了用於提高安全的配置方法。web

3.在聽從本文檔的方法進行配置前,請作好相關配置文件的備份,以便在配置失敗時能夠回退到變動前狀態。算法

1.新安裝,選用安全穩定版本

編號:shell

Nginx_Sec_001vim

適用:瀏覽器

LINUX下新安裝或者升級nginx服務器緩存

配置要求:安全

1.安裝包要求從nginx官方網站獲取,官方網站地址:http://nginx.org/ruby

2.安裝包優先選用穩定版(stable)最新版,若是要跨大版本升級nginx,則要求在測試環境測試不存在兼容性問題後纔在生產環境進行部署。

3.要求對下載的源碼安裝包文件進行完整性驗證。

 

具體方法參考「備註」處的方法。

安全加強說明:

1.從官方網站下載安裝包及對安裝包進行指紋驗證能夠最大程度確保安裝文件未被篡改;

2.使用最新版本,最大避免舊版版中已發現安全漏洞的威脅,使用穩定版能夠確保功能穩定。

備註:

完整性驗證方法:

(1)每一個nginx源碼包都有一個簽名文件,從官網訪問下載nginx源碼包的同時也下載該源碼包的簽名文件到同一目錄,該簽名文件是nginx官方使用pgp私鑰對源碼包進行簽名獲得,該文件後綴.爲.asc,獲取pgp簽名文件方法:

 

(2)nginx源碼包使用的是pgp簽名,進行簽名驗證時須要到GnuPG程序,若是沒有安裝該工具,可使用yum install gnupg進行安裝。

  (3)獲取pgp簽名文件的公鑰ID,執行:# sudo gpg --verify nginx-1.11.3.tar.gz.asc

gpg: Signature made Tue 26 Jul 2016 09:59:49 PM CST using RSA key ID A1C052F8

gpg: Can't check signature: No public key

  (4)根據ID號從公鑰服務器中下載公鑰,以下:

 #sudo  gpg --keyserver hkp://keys.gnupg.net --recv-keys A1C052F8

gpg: requesting key A1C052F8 from hkp server keys.gnupg.net

gpg: /root/.gnupg/trustdb.gpg: trustdb created

gpg: key A1C052F8: public key "Maxim Dounin <mdounin@mdounin.ru>" imported

gpg: key A1C052F8: public key "Maxim Dounin <mdounin@mdounin.ru>" imported

gpg: no ultimately trusted keys found

gpg: Total number processed: 2

gpg:               imported: 2  (RSA: 2)

(5)利用公鑰驗證nginx源碼包和簽名文件,以下,說明文件沒有被篡改:

# sudo  gpg --verify nginx-1.11.3.tar.gz.asc

gpg: Signature made Tue 26 Jul 2016 09:59:49 PM CST using RSA key ID A1C052F8

gpg: Good signature from "Maxim Dounin <mdounin@mdounin.ru>"

gpg: WARNING: This key is not certified with a trusted signature!

gpg:          There is no indication that the signature belongs to the owner.

Primary key fingerprint: B0F4 2533 73F8 F6F5 10D4  2178 520A 9993 A1C0 52F8

2.使用普通帳號運行nginx服務 

編號:

Nginx_Sec_002

適用:

LINUX下新安裝部署或已上線nginx服務器

配置要求:

nginx服務器的work進程不能使用root帳號運行,要求以普通帳號運行,具體方法參考「備註」處的方法。

安全加強說明:

防範或下降攻擊者經過上傳webshell來獲取到的執行權限

備註:

配置普通帳號運行nginx服務方法:

1.nginx(worker進程)默認以nobody運行,建立普通帳號nginx,使用nginx帳號來運行

 # sudo  groupadd -g 1001 nginx #建立nginx組

# sudo  useradd  -s /sbin/nologin -M -g nginx -u 1001 nginx #建立nginx用戶並加入到nginx組,不建立家目錄,不容許nginx帳號登陸。

說明:GID和UID定義爲1000,避免與nis系統上的帳號的ID衝突。

2.以普通帳號nginx來運行Nginx,兩個方法:

 方法1:若是是新安裝nginx,編譯時添加--user=nginx  --group=nginx參數;

 方法2:已完成nginx的安裝,經過修該配置文件來指定,以下:

  1)# sudo vim /usr/local/nginx/conf/nginx.conf

  2)將#user  nobody;改爲user nginx nginx;

 3)測試配置文件是否正確,執行命令# sudo /usr/local/nginx/sbin/nginx –t 

 4)在3)步驟測試配置無錯誤後重啓Nginx服務器,執行命令# sudo  /usr/local/nginx/sbin/nginx -s reload

 5)查看work進程帳號,確認該進程帳號爲nginx,執行命令# sudo  ps -aux |grep nginx

 Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ

root     30153  0.0  0.1  17976  1604 ?        Ss   22:53   0:00 nginx: master process /usr/local/nginx/sbin/nginx

nginx    30245  0.0  0.1  18404  1528 ?        S    23:05   0:00 nginx: worker process

3.修改nginx根目錄的用戶與用戶組:

1)chown –R ngin.nginx  nginx根目錄

 

注意:設置nginx根目錄的用戶和用戶組爲nginx後,且安全加固中將umask設置成027後,nginx安裝目錄的權限爲750,普通用戶沒法訪問該目錄,此時須要nginx的安裝目錄的權限應該是755。 

3.隱藏nginx的版本信息

編號:

Nginx_Sec_003

適用:

LINUX下新安裝部署或已上線nginx服務器

配置要求:

要求隱藏nginx的版本信息, 具體方法參考「備註」處的方法。

安全加強說明:

絕大多數漏洞掃描工具經過獲取目標web服務器的版本號來判斷該web服務器是否存在安全漏洞,隱藏版本號後能夠最大減小惡意攻擊者經過漏掃工具來收集漏洞信息。

備註:

隱藏nginx版本信息方法:

1.編輯nginx配置文件,在http塊中添加

server_tokens  off;

2.重啓nginx服務便可。

 

 

 

4.禁止目錄列表

編號:

Nginx_Sec_004

適用:

LINUX下新安裝部署或已上線nginx服務器

配置要求:

要求禁止nginx服務器目錄列表功能,默認已禁止目錄列表功能。具體方法參考「備註」處的方法。

安全加強說明:

1.當目標web服務器容許目錄時,只要訪問目標web服務器的目錄,若是該目錄下沒有設置默認訪問的文件,則會同時將該目錄的全部文件列出來,以下:

 

2.禁止目錄列表功能能夠避免因暴露目標網站的目錄結構和敏感文件,最終形成敏感信息丟失。

備註:

在nginx配置文件的location,server 或 http塊中都容許設置autoindex on;確認nginx沒有啓用目錄列表功能,即同時檢查這幾個地方沒有配置參數autoindex on; 

說明:

禁止目錄列表後,url訪問目錄應該是403錯誤,以下:

 

 

5.日誌規範

編號:

Nginx_Sec_005

適用:

LINUX下新安裝部署或已上線nginx服務器

配置要求:

要求nginx服務器同時啓用訪問日誌和錯誤日誌的記錄,具體方法參考「備註」處的方法。

安全加強說明:

nginx訪問日誌記錄了客戶端的請求行爲,經過對訪問日誌的分析可以發現潛在的攻擊行爲;nginx的錯誤日誌反映了nginx 服務器的健康情況,經過分析或者監控nginx的報錯信息可以及時發現nginx存在故障問題。

備註:

1.設置訪問日誌(access_log),日誌的格式定義以下:

log_format  access  '$remote_addr - $remote_user [$time_local] '

                        '"$request" $status $body_bytes_sent "$http_referer" '

                        '"$http_user_agent" $http_x_forwarded_for';

各個變量的說明:

$remote_user    :用來記錄客戶端用戶名稱;

$time_local     :用來記錄訪問時間與時區;

$request        :用來記錄請求的url與http協議;

$status         :用來記錄請求狀態;成功是200,

$body_bytes_sent:記錄發送給客戶端文件主體內容大小;

$http_referer   :用來記錄從那個頁面連接訪問過來的;

$http_user_agent:記錄客戶端瀏覽器的相關信息;

$http_x_forwarded_for:用以記錄原始客戶端IP地址,若是原始客戶端原始請求發送到nginx前沒有通過任何代理,則該變量的值爲-。

2.生成的訪問日誌格式以下:

效果:

192.168.12.92 - - [12/Aug/2016:20:14:41 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0" –

3.錯誤日誌的級別要求定義爲warn,以下

error_log  logs/error.log  warn;

注意:若是更改日誌文件的默認路徑,則nginx運行帳號須要具備新路勁下日誌文件的讀寫權限。

 

說明:錯誤日誌級別包括: debug, info, notice, warn, error, crit, alert, or emerg.默認是error級別.

當前3.0系統線上環境nginx編譯時將access日誌和error日誌存在/var/log/nginx目錄下。

 

6.限制不安全請求方法

編號:

Nginx_Sec_006

適用:

LINUX下新安裝部署或已上線nginx服務器

配置建議:

建議拒絕接受除POST和GET,HEAD之外的請求方法,具體方法參考「備註」處的方法。

安全加強說明:

http定義了8種請求方法,其中PUT、DELETE等請求方法是不安全的,限制不安全的請求方法下降目標網站文件被惡意篡改的風險。

備註:

配置拒絕除get,head和post方法之外的請求方法:

編輯Nginx配置文件以下:

server{

       ... ...

      if ($request_method !~ ^(GET|HEAD|POST)$) {        

                     return 444;

              }

       ... ...

注:非標準的444錯誤代碼能夠強制關閉服務器與客戶端的鏈接而不返回任何響應信息給客戶端。

 

http的8種請求方式:

GET:當瀏覽器要從服務器讀取指定文檔。Get方法要求服務器將URL定位的資源放在響應報文的正文中,回傳給瀏覽器。

HEAD:使用post方法,瀏覽器只讀取請求文件的頭部信息,而不是文件的正文;

POST:向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。

PUT:從客戶端傳送的數據取代(替換)指定文件的內容;

DELETE:請求服務器刪除指定文件;

TRACE:回顯服務器收到的請求,主要用於測試或診斷;

OPTIONS:1)獲取服務器支持的HTTP請求方法;2)用來檢查服務器的性能;

CONNECT: HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。

 

7.禁用SSL/TSL不安全協議和弱加密算法

編號:

Tomcat_Sec_007

適用:

使用提供HTTPS方式訪問的Tomcat服務器

配置要求:

當nginx使用到https訪問時,要求禁止使用SSLV1.0、SSLV2.0,SSLV3.0不安全協議,建議也不要使用TLSv1.0協議,要求禁止使用如下不安全加密算法:

 

具體配置方法參考「備註」處的方法。

安全加強說明:

下降因爲使用不安全協議和弱加密緻使被中間人攻擊,最終形成敏感信息泄露的風險。

備註:

在nginx配置文件中的ssl_protocols和ssl_ciphers作以下配置:

ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH:!kEDH:!kECDH;

ssl_prefer_server_ciphers   on;

保存配置文件並重啓nginx服務便可。

 

最終支持的加密協議和加密套件以下:

 

 

優先使用說明:

加密協議

優先使用順序TLSv1.2,TLSv1.1,TLS1.0。其中TLS1.0也被認爲是不安全協議,建議不使用。

加密套件:

密鑰交換算法,優先使用順序:ECDHE(支持正向安全,2048位,防止中間人攻擊),DHE,RSA(沒法防止中間人攻擊),不要使用1024位的DH。

認證算法,優先使用RSA, ECDSA

對稱加密算法,優先使用AES_256_GCM,AES_128_GCM,AES_256_CBC,AES_128_CBC,3DES_EDE_CBC

散列算法,優先使用順序SHA_256,SHA1

 

8.自定義緩衝區

編號:

Nginx_Sec_008

適用:

LINUX下新安裝部署或已上線nginx服務器

配置建議:

此方法可用於在遭受攻擊時用於減輕攻擊的防範手段,平時不強制要求配置,如要配置,相關參數則須要根據實際狀況來定,具體配置方法以下:

http{

    ... ...

    server{

        ... ...

        client_body_buffer_size  16K;

        client_header_buffer_size  1k;

        large_client_header_buffers  4  8k;

        client_max_body_size  1m;

安全加強說明:

主要用於防範或者減輕緩衝區溢出攻擊。

備註:

語法:    client_body_buffer_size size;

默認: client_body_buffer_size 8k|16k;

上下文: http, server, location

參數使用說明:

設置緩衝區(buffer)大小,用於存放所讀取客戶端的請求體,在請求體(request body)大於buffer,那麼整個請求體或者請求體的一部分會寫到臨時文件(a temporary file)。默認狀況下:buffer大小等於兩個內存頁,在 x86, other 32-bit platforms, and x86-64這些平臺它的大小是8K,64-bit平臺一般是16k.

--------------------------------------------------------------------------------------------------

語法: client_header_buffer_size size;

默認: client_header_buffer_size 1k;

上下文: http, server

參數使用說明:

設置緩衝區(buffer)大小,用於存放所讀取客戶端的請求頭,在大多數的請求中1k大小的buffer已經足夠。可是,若是一個請求頭包括很長的cookies或者來自WAP客戶端,配置1k多是不適合的,若是分配的buffer沒法容納 request_line/request_header

,那麼則根據large_client_header_buffers配置的參數來分配large_buffer。

------------------------------------------------------------------------------------------------------------------

語法: large_client_header_buffers number size;

默認: large_client_header_buffers 4 8k;

上下文: http, server

參數使用說明:

設置單個buffers的大小以及buffers最大個數用於存放所讀取客戶端的大請求頭(reading large client request header),先根據client_header_buffer_size配置的值分配一個buffer,若是分配的buffer沒法容納 request_line/request_header,那麼就會再次根據large_client_header_buffers配置的參數分配large_buffer,若是large_buffer仍是沒法容納,那麼就會返回414(處理request_line)/400(處理request_header)錯誤。

------------------------------------------------------------------------------------------------------------------

語法: client_max_body_size size;

默認: client_max_body_size 1m;

上下文: http, server, location

參數使用說明:

Sets the maximum allowed size of the client request body(請求體), specified in the 「Content-Length」 request header field(請求體的大小在請求頭Content-Length字體寫明,單位字節). If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client(若是請求體大小大於該設定值,則給客戶端返回413錯誤). Please be aware that browsers cannot correctly display this error(但瀏覽器不能正確顯示該錯誤). Setting size to 0 disables checking of client request body size.(設置值爲0時,不限制請求體大小)

該參數用於設置nginx容許客戶端請求體的最大值,請求體的大小在請求頭Content-Length字體寫明,單位字節。若是親請求體的大小超過了配置的值,則向客戶端返回413錯誤,但須要注意的是瀏覽器不能正確顯示該錯誤,若是該參數值設置0,則不限制請求體大小。

 

9.設置鏈接超時時間

編號:

Nginx_Sec_009

適用:

LINUX下新安裝部署或已上線nginx服務器

配置建議:

此方法可用於在遭受攻擊時用於減輕攻擊的防範手段,平時不強制要求配置,如要配置,相關參數則須要根據實際狀況來定,具體配置方法以下:

 

http {

    ... ...

       client_body_timeout   10;

       client_header_timeout  30;

       keepalive_timeout     30  30;

       send_timeout          10;

安全加強說明:

主要用於防範或者減輕慢鏈接攻擊。

備註:

語法: client_body_timeout time;

默認: client_body_timeout 60s;

上下文: http, server, location

參數使用說明:

設置讀取客戶端的請求體(request body.)超時時間,該超時時間爲在兩個連續的讀取操做間的超時時間,而不是整個請求體的傳輸超時時間。若是在這個時間內客戶端沒有響應(transmit anything),nginx將向客戶端返回408請求超時錯誤。

 

注意:只有請求體須要被1次以上讀取時,該超時時間纔會被設置。

---------------------------------------------------------------------------------------------------

語法: client_header_timeout time;

默認: client_header_timeout 60s;

上下文: http, server

參數使用說明:

設置讀取客戶端請求頭的超時時間,若是在該時間內客戶端沒有傳輸完整個請求頭(the entire header),nginx將返回408(請求超時)錯誤。

-------------------------------------------------------------------------------------------------------------------

語法:  keepalive_timeout timeout [header_timeout];
默認:  keepalive_timeout 75s;

上下文:http, server, location

參數使用說明:

第一個參數的值指定了客戶端與服務器長鏈接的超時時間,超過這個時間,服務器將關閉鏈接。值爲0時,關閉客戶端的會話保持鏈接,(即關閉長鏈接).

第二個參數的值(可選)指定了應答頭中Keep-Alive: timeout=time的time值,這個值可使一些瀏覽器知道何時關閉鏈接,以便服務器不用重複關閉,若是不指定這個參數,nginx不會在應答頭中發送Keep-Alive信息。

----------------------------------------------------------------------------------------------------------------

語法: send_timeout time;

默認: send_timeout 60s;

上下文: http, server, location

參數使用說明:

該指令指定了發送給客戶端應答後的超時時間,Timeout是指沒有進入完整established狀態,只完成了兩次握手,若是超過這個時間客戶端沒有任何響應,nginx將關閉鏈接。

10.限制併發鏈接

 

編號:

Nginx_Sec_010

適用:

LINUX下新安裝部署或已上線nginx服務器

配置建議:

此方法可用於在遭受攻擊時用於減輕攻擊的防範手段,平時不強制要求配置,如要配置,相關參數則須要根據實際狀況來定,具體配置方法以下:

1.在nginx.conf裏的http{}里加上以下代碼:

limit_conn_zone $binary_remote_addr zone=perip:10m; 

limit_conn_zone $server_name zone=perserver:10m;

2.在須要限制併發數和下載帶寬的網站配置server{}里加上以下代碼:

#每IP最大併發爲2。

limit_conn perip 2;  

限制單一虛擬服務器,最大隻接受20個併發

limit_conn perserver 20; 

limit_rate 100k;

安全加強說明:

主要用以防範或者減輕DDOS攻擊。

備註:

語法:   limit_conn_zone key zone=name:size;

默認: —

上下文: http

參數使用說明:

定義一個用於存放key變量,大小爲szie名稱爲name的zone,key的值能夠是特定變量的任何非空值(空值將不會被考慮)。

例如:

limit_conn_zone $binary_remote_addr zone=perip:10m;

定義一個大小爲10m字節,名稱爲perip的zone,該zone用於二進制來儲存客戶端的IP地址; Ipv4地址對應的 $binary_remote_addr 變量的大小爲 4 bytes ,IPv6 地址對應的是16字節。.

--------------------------------------------------------------------------------------------------

語法: limit_conn zone number;

默認: —

上下文: http, server, location

使用參數說明:

Zone變量是一個須要引發的zone,zone在前面的limit_conn_zone命令中已經定義好,使用limit_conn_zone名義中定義的zone名稱便可引用,number參數用於定義一個數字,並應用到該zone,說明對該zone作併發鏈接數限制,最大併發鏈接數爲number定義的值,若是客戶端併發鏈接請求大於該值,則向客戶端返回503錯誤(服務暫時不可用)。

例如:

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {

    location /download/ {

        limit_conn addr 1;

}

 

在同一時間(at a time),一個IP僅容許一個鏈接。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

語法:    limit_rate rate;

默認: limit_rate 0;

上下文: http, server, location, if in location

參數使用說明

限制響應傳輸給客戶端的速率(下載速度),rate指定多少字節每秒,值爲0時不限速。注意,這裏是對鏈接限速,而不是對IP限速。若是一個IP容許兩個併發鏈接,那麼這個IP就是限速limit_rate×2。

轉載於:https://www.cnblogs.com/heaven-xi/p/9961357.html

 

 

=====================================================================================================================

隱藏版本號

http {
    server_tokens off;
}

常常會有針對某個版本的nginx安全漏洞出現,隱藏nginx版本號就成了主要的安全優化手段之一,固然最重要的是及時升級修復漏洞

開啓HTTPS

server {
    listen 443;
    server_name ops-coffee.cn;

    ssl on;
    ssl_certificate /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
}

ssl on: 開啓https

ssl_certificate: 配置nginx ssl證書的路徑

ssl_certificate_key: 配置nginx ssl證書key的路徑

ssl_protocols: 指定客戶端創建鏈接時使用的ssl協議版本,若是不須要兼容TSLv1,直接去掉便可

ssl_ciphers: 指定客戶端鏈接時所使用的加密算法,你能夠再這裏配置更高安全的算法

添加黑白名單

白名單配置

location /admin/ {
    allow   192.168.1.0/24;
    deny    all;
}

上邊表示只容許192.168.1.0/24網段的主機訪問,拒絕其餘全部

也能夠寫成黑名單的方式禁止某些地址訪問,容許其餘全部,例如

location /ops-coffee/ {
    deny   192.168.1.0/24;
    allow    all;
}

更多的時候客戶端請求會通過層層代理,咱們須要經過$http_x_forwarded_for來進行限制,能夠這樣寫

set $allow false;
if ($http_x_forwarded_for = "211.144.204.2") { set $allow true; }
if ($http_x_forwarded_for "108.2.66.[89]") { set $allow true; }
if ($allow = false) { return 404; }

添加帳號認證

server {
    location / {
        auth_basic "please input user&passwd";
        auth_basic_user_file key/auth.key;
    }
}

關於帳號認證《Nginx的幾個經常使用配置和技巧》文章中已有詳細介紹,這裏不贅述

限制請求方法

if ($request_method !~ ^(GET|POST)$ ) {
    return 405;
}

$request_method可以獲取到請求nginx的method

配置只容許GET\POST方法訪問,其餘的method返回405

拒絕User-Agent

if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl) {
    return 444;
}

可能有一些不法者會利用wget/curl等工具掃描咱們的網站,咱們能夠經過禁止相應的user-agent來簡單的防範

Nginx的444狀態比較特殊,若是返回444那麼客戶端將不會收到服務端返回的信息,就像是網站沒法鏈接同樣

圖片防盜鏈

location /images/ {
    valid_referers none blocked www.ops-coffee.cn ops-coffee.cn;
    if ($invalid_referer) {
        return  403;
    }
}

valid_referers: 驗證referer,其中none容許referer爲空,blocked容許不帶協議的請求,除了以上兩類外僅容許referer爲www.ops-coffee.cn或ops-coffee.cn時訪問images下的圖片資源,不然返回403

固然你也能夠給不符合referer規則的請求重定向到一個默認的圖片,好比下邊這樣

location /images/ {
    valid_referers blocked www.ops-coffee.cn ops-coffee.cn
    if ($invalid_referer) {
        rewrite ^/images/.*\.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last;
    }
}

控制併發鏈接數

能夠經過ngx_http_limit_conn_module模塊限制一個IP的併發鏈接數

http {
    limit_conn_zone $binary_remote_addr zone=ops:10m;

    server {
        listen       80;
        server_name  ops-coffee.cn;

        root /home/project/webapp;
        index index.html;

        location / {
            limit_conn ops 10;
        }

        access_log  /tmp/nginx_access.log  main;
    }
}

limit_conn_zone: 設定保存各個鍵(例如$binary_remote_addr)狀態的共享內存空間的參數,zone=空間名字:大小

大小的計算與變量有關,例如$binary_remote_addr變量的大小對於記錄IPV4地址是固定的4 bytes,而記錄IPV6地址時固定的16 bytes,存儲狀態在32位平臺中佔用32或者64 bytes,在64位平臺中佔用64 bytes。1m的共享內存空間能夠保存大約3.2萬個32位的狀態,1.6萬個64位的狀態

limit_conn: 指定一塊已經設定的共享內存空間(例如name爲ops的空間),以及每一個給定鍵值的最大鏈接數

上邊的例子表示同一IP同一時間只容許10個鏈接

當有多個limit_conn指令被配置時,全部的鏈接數限制都會生效

http {
    limit_conn_zone $binary_remote_addr zone=ops:10m;
    limit_conn_zone $server_name zone=coffee:10m;

    server {
        listen       80;
        server_name  ops-coffee.cn;

        root /home/project/webapp;
        index index.html;

        location / {
            limit_conn ops 10;
            limit_conn coffee 2000;
        }
    }
}

上邊的配置不只會限制單一IP來源的鏈接數爲10,同時也會限制單一虛擬服務器的總鏈接數爲2000

緩衝區溢出攻擊

緩衝區溢出攻擊 是經過將數據寫入緩衝區並超出緩衝區邊界和重寫內存片斷來實現的,限制緩衝區大小可有效防止

client_body_buffer_size  1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 1k;

client_body_buffer_size: 默認8k或16k,表示客戶端請求body佔用緩衝區大小。若是鏈接請求超過緩存區指定的值,那麼這些請求實體的總體或部分將嘗試寫入一個臨時文件。

client_header_buffer_size: 表示客戶端請求頭部的緩衝區大小。絕大多數狀況下一個請求頭不會大於1k,不過若是有來自於wap客戶端的較大的cookie它可能會大於 1k,Nginx將分配給它一個更大的緩衝區,這個值能夠在large_client_header_buffers裏面設置

client_max_body_size: 表示客戶端請求的最大可接受body大小,它出如今請求頭部的Content-Length字段, 若是請求大於指定的值,客戶端將收到一個"Request Entity Too Large" (413)錯誤,一般在上傳文件到服務器時會受到限制

large_client_header_buffers 表示一些比較大的請求頭使用的緩衝區數量和大小,默認一個緩衝區大小爲操做系統中分頁文件大小,一般是4k或8k,請求字段不能大於一個緩衝區大小,若是客戶端發送一個比較大的頭,nginx將返回"Request URI too large" (414),請求的頭部最長字段不能大於一個緩衝區,不然服務器將返回"Bad request" (400)

同時須要修改幾個超時時間的配置

client_body_timeout   10;
client_header_timeout 10;
keepalive_timeout     5;
send_timeout          10;

client_body_timeout: 表示讀取請求body的超時時間,若是鏈接超過這個時間而客戶端沒有任何響應,Nginx將返回"Request time out" (408)錯誤

client_header_timeout: 表示讀取客戶端請求頭的超時時間,若是鏈接超過這個時間而客戶端沒有任何響應,Nginx將返回"Request time out" (408)錯誤

keepalive_timeout: 參數的第一個值表示客戶端與服務器長鏈接的超時時間,超過這個時間,服務器將關閉鏈接,可選的第二個參數參數表示Response頭中Keep-Alive: timeout=time的time值,這個值可使一些瀏覽器知道何時關閉鏈接,以便服務器不用重複關閉,若是不指定這個參數,nginx不會在應Response頭中發送Keep-Alive信息

send_timeout: 表示發送給客戶端應答後的超時時間,Timeout是指沒有進入完整established狀態,只完成了兩次握手,若是超過這個時間客戶端沒有任何響應,nginx將關閉鏈接

Header頭設置

經過如下設置可有效防止XSS攻擊

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

X-Frame-Options: 響應頭表示是否容許瀏覽器加載frame等屬性,有三個配置DENY禁止任何網頁被嵌入,SAMEORIGIN只容許本網站的嵌套,ALLOW-FROM容許指定地址的嵌套

X-XSS-Protection: 表示啓用XSS過濾(禁用過濾爲X-XSS-Protection: 0),mode=block表示若檢查到XSS攻擊則中止渲染頁面

X-Content-Type-Options: 響應頭用來指定瀏覽器對未指定或錯誤指定Content-Type資源真正類型的猜想行爲,nosniff 表示不容許任何猜想

在一般的請求響應中,瀏覽器會根據Content-Type來分辨響應的類型,但當響應類型未指定或錯誤指定時,瀏覽會嘗試啓用MIME-sniffing來猜想資源的響應類型,這是很是危險的

例如一個.jpg的圖片文件被惡意嵌入了可執行的js代碼,在開啓資源類型猜想的狀況下,瀏覽器將執行嵌入的js代碼,可能會有意想不到的後果

另外還有幾個關於請求頭的安全配置須要注意

Content-Security-Policy: 定義頁面能夠加載哪些資源,

add_header Content-Security-Policy "default-src 'self'";

上邊的配置會限制全部的外部資源,都只能從當前域名加載,其中default-src定義針對全部類型資源的默認加載策略,self容許來自相同來源的內容

Strict-Transport-Security: 會告訴瀏覽器用HTTPS協議代替HTTP來訪問目標站點

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

上邊的配置表示當用戶第一次訪問後,會返回一個包含了Strict-Transport-Security響應頭的字段,這個字段會告訴瀏覽器,在接下來的31536000秒內,當前網站的全部請求都使用https協議訪問,參數includeSubDomains是可選的,表示全部子域名也將採用一樣的規則

 

=============================================================================================================================================

本期帶來一篇最近在阿里雲服務器上折騰nginx配置網站的教程。

1 nginx簡介

nginx是一個輕量級的web服務器,個人認知,這東西跟負載平衡不分家。這裏抄下度娘簡介。

Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特色是佔有內存少,併發能力強,事實上nginx的併發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。——百度百科

接下來給出官網

2 阿里雲安裝nginx

這裏就很少說阿里雲服務器的相關內容了,筆者長期有租用一臺用於數據處理等工做。系統是Ubuntu 14.02,這裏選用Xshell鏈接服務器進行一系列操做,並用Xftp來上傳下載文件。這裏安裝nginx有兩種方式,一種是apt-get的安裝,可是這種安裝通常不是最新版本。若是想要最新版本,就推薦下載源碼,自行編譯安裝。這裏咱們就不使用最新版本了。至於編譯安裝的能夠在網上搜索教程,關鍵就是先安裝幾個關鍵依賴庫openssl,zlib,pcre,同時編譯安裝也比較自由,能夠在本身定義的路徑裏安裝。

apt-get update
apt-get install nginx

若是apt-get報錯如圖的話。而且沒法安裝任何軟件包的話,就必須執行第一行update的命令行。

執行完update命令行,如圖。

接着執行安裝語句。鍵盤敲入y便可安裝。

安裝成功後,能夠鍵入以下命令檢測。

nginx -v

提及來這版本確實舊。目前官網最新版本爲1.17。

3 配置nginx

咱們首先了解下nginx的目錄,默認安裝的目錄主要在/etc文件夾下。

這個時候,只須要在命令行裏敲入nginx,即運行了nginx。

nginx

因爲個人阿里雲以前只打開了22端口用於Xshell鏈接,這裏就多打開默認的80端口訪問網站。打開阿里雲官網,登陸帳戶,點擊雲服務器ECS,如圖點擊安全組。

接着在主面板點擊配置規則。

而後點擊添加安全組規則,按如圖所示填寫頁面的80端口。0.0.0.0/0表示任意ip能夠訪問。

接下來把服務器ip地址放到瀏覽器中,便可發現跳轉到nginx的歡迎頁面。

接下來只須要把網頁放到服務器中的指定位置便可,再針對配置文件作修改。有域名的條件下,能夠把域名和本身服務器關聯起來作解析。

這個版本的nginx的文件配置不是nginx目錄下的nginx.conf,而是site-available文件夾下的default。這裏給出一個測試的配置。

root是網站的路徑。這裏採用二級域名來控制,因此還得去配置域名。具體的教程能夠看後面的參考連接。這裏就不贅述了。

4 基本命令以及錯誤

這裏的一些命令主要是開啓nginx,關閉,重啓,關閉全部nginx。

# 關閉 nginx -s stop # 查詢80端口占用 netstat -ntpl | grep 80 # 殺死全部nginx進程 killall nginx

詳細的命令能夠參考後面的連接。

另外我在啓動nginx時報了兩次80端口占用的信息。

這個應該是多啓動了一次nginx(猜測)。此外網上也有很多人遇到第二個端口ipv6佔用問題,真正的措施並非kill掉全部nginx,而是配置文件中的修改。這些參考連接我一併列出,有須要者自行取用。

參考連接:

1.Nginx安裝以及解決運行時端口被佔用問題

2.nginx的啓動和關閉

3.[nginx - nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)](https://stackoverflow.com/questions/14972792/nginx-nginx-emerg-bind-to-80-failed-98-address-already-in-use)

4.Hugo 與 nginx 結合使用

5.[解決nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)](https://blog.csdn.net/yusiguyuan/article/details/20565337)

6.把域名和IP地址綁定後,利用域名+端口號訪問本身搭建的網站

7.Nginx中止服務和各類命令

相關文章
相關標籤/搜索