一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何通過優(yōu)化Nginx配置來提高網(wǎng)絡(luò)環(huán)境的安全性

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2025-02-14 17:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

簡介:在當(dāng)今數(shù)字化時代,網(wǎng)絡(luò)安全至關(guān)重要。Nginx作為流行的Web服務(wù)器,不僅提供高性能,還具備強大的安全保障功能。然而,默認(rèn)配置可能無法抵御所有安全威脅,因此對Nginx進行安全加固尤為重要。本文為系統(tǒng)管理員、開發(fā)者等提供詳盡的安全加固指南,涵蓋基礎(chǔ)到高級策略,包括隱藏版本號信息、限制敏感目錄訪問、啟用HTTPS、配置錯誤頁面、應(yīng)用內(nèi)容安全策略(CSP)、設(shè)置正確文件權(quán)限、添加安全HTTP響應(yīng)頭、限制連接數(shù)、配置IP白名單、優(yōu)化SSL配置、確保文件上傳安全、防止常見攻擊。通過這些措施,可以有效提升Nginx的安全性,保護網(wǎng)站和應(yīng)用程序免受潛在威脅。

引言

在當(dāng)今數(shù)字化的世界中,網(wǎng)絡(luò)安全已成為每一個組織和個人不可忽視的重要議題。作為最流行的Web服務(wù)器之一,Nginx不僅因為其高性能而被廣泛使用,還因為它能夠提供強大的安全保障。然而,默認(rèn)配置下的Nginx可能無法抵御所有潛在的安全威脅。為了確保您的網(wǎng)站和應(yīng)用程序能夠在互聯(lián)網(wǎng)上穩(wěn)健運行,對Nginx進行適當(dāng)?shù)陌踩庸田@得尤為重要。

本文旨在為系統(tǒng)管理員、開發(fā)者以及任何對提升Nginx安全性感興趣的讀者提供一份詳盡的安全加固路線圖。我們將探討從基礎(chǔ)到高級的各種策略,包括但不限于正確的權(quán)限設(shè)置、限制對外暴露的信息、啟用加密連接、配置防火墻等關(guān)鍵措施。無論您是希望保護個人博客免受攻擊,還是為企業(yè)的在線服務(wù)構(gòu)建堅固的防線,本文都將為您提供寶貴的實踐指導(dǎo)和技術(shù)支持。讓我們一起深入了解如何通過優(yōu)化Nginx配置來提高您的網(wǎng)絡(luò)環(huán)境的安全性吧。

隱藏版本號信息

默認(rèn)情況下,Nginx會在HTTP響應(yīng)頭中暴露其版本號。攻擊者可以利用這些信息來尋找特定版本的漏洞。通過在配置文件中的http、server或location塊內(nèi)添加server_tokens off;來關(guān)閉這個功能。

步驟

打開Nginx配置文件:通常位于/etc/nginx/nginx.conf或/usr/local/nginx/conf/nginx.conf,具體位置取決于你的安裝方式。

編輯配置文件:找到http塊,并在其中添加server_tokens off;指令。如果你有多個server塊,也可以在每個server塊中單獨設(shè)置這個選項,以確保它在整個服務(wù)器范圍內(nèi)生效。

保存并退出編輯器:完成修改后保存更改。

檢查配置語法:使用命令nginx -t來測試配置文件是否有語法錯誤。

重新加載Nginx:如果配置文件沒有問題,使用命令nginx -s reload來應(yīng)用新的配置。

# nginx.conf 或者某個特定的 server 配置文件

http {
   
    # 其他配置...

    # 關(guān)閉版本信息顯示
    server_tokens off;

    # 更多其他配置...

    server {
   
        listen 80;
        server_name example.com;

        # 在 server 塊內(nèi)也可以設(shè)置 server_tokens
        # server_tokens off;

        location / {
   
            root /var/www/html;
            index index.html index.htm;
        }
    }
}

限制訪問敏感目錄

為了防止外部用戶訪問敏感資源,比如.htaccess文件或.git目錄,你可以使用Nginx的location塊和deny all;指令來實現(xiàn)。以下是如何配置的具體示例代碼以及一個實際案例說明。

下面的例子展示了如何在Nginx配置中添加規(guī)則以阻止對.git目錄和.htaccess文件的訪問:

server {
   
    listen 80;
    server_name example.com;

    # 根目錄設(shè)置
    root /var/www/html;

    # 禁止訪問.git目錄
    location ~ /.git {
   
        deny all;
    }

    # 禁止訪問.htaccess文件
    location ~ /.ht {
   
        deny all;
    }

    # 其他location配置...
}

在這個例子中,我們使用了正則表達式匹配來定位.git和.htaccess文件,并通過deny all;指令拒絕所有請求到這些資源的訪問。

假設(shè)你有一個基于Git版本控制的Web項目部署在你的服務(wù)器上,并且你不希望任何訪問者能夠看到.git目錄下的內(nèi)容,因為這可能包含敏感信息如提交歷史、開發(fā)者郵箱等。同樣地,如果你不小心將.htaccess文件留在了你的Web根目錄下,你也希望能夠阻止外部訪問這個文件。

按照上述配置,當(dāng)你嘗試直接訪問http://example.com/.git/或http://example.com/.htaccess時,Nginx會返回403 Forbidden錯誤,從而保護這些敏感資源不被公開訪問。

此外,如果你想提供一個友好的錯誤頁面而不是默認(rèn)的403錯誤頁面,可以結(jié)合使用error_page指令。例如:

server {
   
    listen 80;
    server_name example.com;

    # 根目錄設(shè)置
    root /var/www/html;

    # 定義自定義403錯誤頁面
    error_page 403 /custom_403.html;

    # 禁止訪問.git目錄
    location ~ /.git {
   
        deny all;
    }

    # 禁止訪問.htaccess文件
    location ~ /.ht {
   
        deny all;
    }

    # 自定義403錯誤頁面的位置
    location = /custom_403.html {
   
        allow all;
        root /usr/share/nginx/html;
    }
}

這樣,當(dāng)發(fā)生403錯誤時,用戶將會看到位于/usr/share/nginx/html/custom_403.html的自定義錯誤頁面,而不是默認(rèn)的Nginx 403錯誤提示。

配置錯誤頁面

配置自定義錯誤頁面是提升用戶體驗和增強安全性的重要措施。下面將通過具體的Nginx配置示例來說明如何設(shè)置404、500等錯誤頁面,并確保這些頁面不會泄露過多的服務(wù)器信息。

首先,你需要編輯Nginx的配置文件(通常是nginx.conf或位于sites-available目錄下的某個站點配置文件)。以下是一個簡單的配置示例:

server {
   
    listen 80;
    server_name example.com;

    # 根目錄設(shè)置
    root /var/www/html;
    index index.html index.htm;

    # 隱藏Nginx版本信息
    server_tokens off;

    # 定義自定義錯誤頁面
    error_page 404 /custom_404.html;
    error_page 500 502 503 504 /custom_50x.html;

    # 自定義404錯誤頁面的位置
    location = /custom_404.html {
   
        root /usr/share/nginx/html;
        internal;
    }

    # 自定義50x錯誤頁面的位置
    location = /custom_50x.html {
   
        root /usr/share/nginx/html;
        internal;
    }

    # 其他location配置...
}

在這個例子中,我們使用了error_page指令來指定當(dāng)發(fā)生404或500系列錯誤時應(yīng)該顯示的頁面。internal;指示Nginx只在內(nèi)部重定向到這個位置,不允許直接訪問這些錯誤頁面。

假設(shè)你正在運營一個在線商店,網(wǎng)站偶爾會因為各種原因出現(xiàn)臨時性的問題,比如數(shù)據(jù)庫連接失敗導(dǎo)致的500內(nèi)部服務(wù)器錯誤。為了確保即使在這種情況下也能提供良好的用戶體驗,你可以創(chuàng)建一個設(shè)計精美的500錯誤頁面,它不僅告訴用戶當(dāng)前遇到了問題,還提供了幫助鏈接或者聯(lián)系客服的方式。

同樣地,對于404錯誤,一個好的做法是提供一個搜索框或者導(dǎo)航鏈接,讓用戶可以方便地找到他們可能感興趣的內(nèi)容,而不是簡單地顯示“頁面未找到”。

例如,你的custom_404.html頁面可能包含如下內(nèi)容:




    
    Page Not Found


    

Oops! Page not found.

We're sorry, but the page you were looking for doesn't exist.

Go back to homepage

而custom_50x.html可能會這樣設(shè)計:




    
    Server Error


    

Something went wrong!

Our team has been notified and is working on fixing the issue as quickly as possible.

Return to homepage

Contact us if you need further assistance.

啟用HTTPS

啟用HTTPS對于保護數(shù)據(jù)傳輸?shù)陌踩灾陵P(guān)重要。這通常涉及到幾個步驟:獲取SSL證書、安裝SSL證書以及在Nginx配置中設(shè)置以支持HTTPS連接。下面,我將通過具體的代碼示例和實際案例來詳細說明這個過程。

獲取并安裝SSL證書

首先,你需要從一個可信的證書頒發(fā)機構(gòu)(CA)獲取SSL證書。你可以選擇付費的SSL證書提供商,如DigiCert、Comodo等,或者使用Let's Encrypt提供的免費SSL證書。

生成CSR文件

在申請SSL證書之前,你需要生成一個證書簽名請求(CSR)。以下是使用OpenSSL工具生成CSR文件的命令:

openssl req -new -newkey rsa:2048 -nodes -out yourdomain.csr -keyout yourdomain.key

系統(tǒng)會提示你輸入一些信息,例如國家、組織名稱、域名等。

提交CSR并下載證書

完成上述步驟后,提交生成的CSR給選定的CA,并按照其指示進行身份驗證。一旦驗證通過,你會收到一個或多個證書文件,包括服務(wù)器證書和中間證書。

在Nginx中啟用HTTPS

假設(shè)你已經(jīng)獲取了SSL證書并且準(zhǔn)備好了所有必要的文件(如yourdomain.crt和yourdomain.key),接下來需要在Nginx配置中啟用HTTPS。

Nginx配置示例

以下是一個基本的Nginx配置示例,展示了如何設(shè)置HTTPS支持:

server {
   
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    # 將HTTP請求重定向到HTTPS
    return 301 https://$host$request_uri;
}

server {
   
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate /path/to/yourdomain.crt;
    ssl_certificate_key /path/to/yourdomain.key;
    ssl_trusted_certificate /path/to/intermediate.crt;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCMAES256+EECDH:AES256+EDH';

    location / {
   
        # 你的網(wǎng)站根目錄和其他配置
        root /var/www/html;
        index index.html index.htm;
    }
}

在這個配置中,我們首先定義了一個監(jiān)聽80端口的服務(wù)器塊,用于處理HTTP請求并將它們重定向到HTTPS。然后,我們定義了另一個服務(wù)器塊,它監(jiān)聽443端口,并啟用了SSL/TLS加密。這里指定了證書文件的位置以及一些額外的安全參數(shù)。

應(yīng)用內(nèi)容安全策略(CSP)

內(nèi)容安全策略(CSP)是一個額外的安全層,用于檢測并削弱某些特定類型的攻擊,包括跨站腳本(XSS)和數(shù)據(jù)注入攻擊等。通過在Nginx配置中應(yīng)用CSP,你可以指定哪些資源是允許加載的,從而防止?jié)撛诘膼阂獯a執(zhí)行。

設(shè)置CSP的基本步驟

首先,你需要定義一個適合你網(wǎng)站需求的CSP策略。這通常涉及到指定哪些源可以加載腳本、樣式、圖片等資源。然后,將這個策略添加到你的Nginx配置文件中。

示例代碼

假設(shè)你有一個簡單的博客網(wǎng)站,并且希望確保所有的資源都來自相同的源(即self),除了圖片可以從任何地方加載外,其他資源都不允許內(nèi)聯(lián)或使用eval()函數(shù)。以下是如何在Nginx中設(shè)置這樣一個CSP的例子:

server {
   
    listen 80;
    server_name example.com;

    # 其他配置...

    add_header Content-Security-Policy "default-src 'self'; img-src *; script-src 'self' 'unsafe-inline' 'unsafe-eval'";

    # 其他location配置...
}

在這個例子中,我們設(shè)置了以下規(guī)則:

default-src 'self':默認(rèn)情況下,只允許從當(dāng)前域名加載資源。

img-src*:允許圖片從任何源加載。

script-src 'self' 'unsafe-inline' 'unsafe-eval':允許腳本從當(dāng)前域名加載,并允許內(nèi)聯(lián)腳本和eval()函數(shù)。然而,在實際生產(chǎn)環(huán)境中應(yīng)盡量避免使用unsafe-inline和unsafe-eval,因為它們會增加XSS攻擊的風(fēng)險。

假設(shè)一個在線銀行系統(tǒng),它需要非常嚴(yán)格的安全措施來保護用戶的數(shù)據(jù)。在這種情況下,銀行可能會采取如下的CSP策略:

add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trustedscripts.example.com; style-src 'self' https://trustedstyles.example.com; img-src 'self' data: https://trustedimages.example.com; connect-src 'self' https://api.example.com; object-src 'none'; frame-src 'none';";

這里,我們做了如下限制:

只允許從當(dāng)前域加載所有類型的內(nèi)容(default-src 'self')。

腳本只能從當(dāng)前域和一個可信的第三方腳本提供者加載(script-src 'self'https://trustedscripts.example.com)。

樣式表也受到類似的限制(style-src 'self'https://trustedstyles.example.com)。

圖片可以從當(dāng)前域、data URI以及一個可信的圖片服務(wù)器加載(img-src 'self' data:https://trustedimages.example.com)。

API請求只能發(fā)送到當(dāng)前域或一個可信的API端點(connect-src 'self'https://api.example.com)。

禁止加載插件內(nèi)容(object-src 'none')以減少潛在的安全風(fēng)險。

不允許頁面被嵌入到任何iframe中,防止點擊劫持攻擊(frame-src 'none')。

監(jiān)控與調(diào)整

一旦部署了CSP,重要的是要監(jiān)控其表現(xiàn)。通過使用report-uri指令,你可以讓瀏覽器向你指定的URL報告任何違反CSP的行為,這樣就可以及時發(fā)現(xiàn)并修復(fù)問題。例如:

add_header Content-Security-Policy "default-src 'self'; report-uri /csp-report-endpoint";

這將指示瀏覽器將任何CSP違規(guī)報告發(fā)送到/csp-report-endpoint路徑上。定期審查這些報告有助于優(yōu)化你的CSP策略,確保既不過于寬松也不過于嚴(yán)格。

請根據(jù)實際情況調(diào)整CSP策略,逐步實施新的限制,并測試對網(wǎng)站功能的影響,同時保持對新威脅的關(guān)注并適時更新策略。

設(shè)置正確的文件權(quán)限

設(shè)置正確的文件權(quán)限是確保Nginx服務(wù)安全運行的重要步驟。這涉及到配置文件、日志文件以及網(wǎng)站根目錄下的文件和目錄的權(quán)限設(shè)置。以下是一些指導(dǎo)原則和具體的代碼示例,用于幫助你正確地設(shè)置這些權(quán)限。

文件和目錄權(quán)限的一般規(guī)則

文件權(quán)限:通常推薦將文件權(quán)限設(shè)為644,這意味著所有者可以讀寫(rw-),而組用戶和其他人只能讀取(r--)。

目錄權(quán)限:目錄權(quán)限通常設(shè)為755,允許所有者讀寫執(zhí)行(rwx),組用戶和其他人只能讀取和執(zhí)行(r-x)。

所有者和組:所有者應(yīng)設(shè)置為運行Nginx服務(wù)的非root用戶,例如nginx或www-data,具體取決于你的系統(tǒng)配置。

設(shè)置文件和目錄權(quán)限的命令

Linux系統(tǒng)中,你可以使用chmod命令來修改文件或目錄的權(quán)限,使用chown命令來更改文件或目錄的所有者和所屬組。

假設(shè)你有如下結(jié)構(gòu):

/var/www/html/  # 網(wǎng)站根目錄
/etc/nginx/nginx.conf  # Nginx主配置文件
/var/log/nginx/access.log  # 訪問日志文件

你可以使用以下命令來設(shè)置權(quán)限:

# 設(shè)置文件權(quán)限為644
sudo chmod 644 /var/www/html/index.html
sudo chmod 644 /etc/nginx/nginx.conf
sudo chmod 644 /var/log/nginx/access.log

# 設(shè)置目錄權(quán)限為755
sudo chmod 755 /var/www/html/

更改文件所有者和組

如果你需要更改文件的所有者和組,可以使用chown命令:

# 假設(shè)nginx運行用戶為nginx,組也為nginx
sudo chown nginx:nginx /var/www/html/index.html
sudo chown root:nginx /etc/nginx/nginx.conf  # 主配置文件可能由root擁有,但屬于nginx組
sudo chown nginx:nginx /var/log/nginx/access.log

假設(shè)正在維護一個基于Nginx的WordPress博客。為了確保安全性,你需要正確設(shè)置文件和目錄的權(quán)限。

首先,確定Nginx是以哪個用戶運行的。可以通過查看Nginx配置文件中的user指令得知,通常是nginx或www-data。

grep 'user' /etc/nginx/nginx.conf

然后,應(yīng)用適當(dāng)?shù)臋?quán)限設(shè)置:

# 設(shè)置WordPress安裝目錄下的文件和目錄權(quán)限
find /var/www/html -type f -exec chmod 644 {
   } ;
find /var/www/html -type d -exec chmod 755 {
   } ;

# 更改所有權(quán)
sudo chown -R nginx:nginx /var/www/html

# 設(shè)置Nginx日志文件權(quán)限
sudo chmod 640 /var/log/nginx/*.log
sudo chown nginx:nginx /var/log/nginx/*.log

在這個例子中,我們對WordPress安裝目錄下的所有文件設(shè)置了644權(quán)限,對目錄設(shè)置了755權(quán)限,并且將所有權(quán)更改為Nginx用戶。對于日志文件,我們采用了稍微嚴(yán)格的權(quán)限640,以限制訪問。

配置安全Headers

添加安全相關(guān)的HTTP響應(yīng)頭,可以有效防御常見的Web攻擊:

# 防止點擊劫持
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy "frame-ancestors 'self';";

# 強化XSS防護
# 注意:根據(jù)實際情況決定是否保留X-XSS-Protection,因為現(xiàn)代瀏覽器支持程度不同
add_header X-XSS-Protection "1; mode=block";

# 防止MIME類型混淆攻擊
add_header X-Content-Type-Options nosniff;

# 增強隱私保護
add_header Referrer-Policy "strict-origin-when-cross-origin";

# 強化的CSP策略
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'; upgrade-insecure-requests;";

限制連接數(shù)

為了防止DoS(拒絕服務(wù))攻擊,可以通過限制單個IP的連接數(shù)和請求頻率來減少惡意流量對服務(wù)器的影響。

Nginx提供了兩個模塊來進行這種類型的限制:ngx_http_limit_conn_module和ngx_http_limit_req_module。前者用于限制連接數(shù),后者用于限制請求頻率。

以下是一個簡單的Nginx配置片段,用于限制每個客戶端IP的最大并發(fā)連接數(shù)為10:

http {
   
    # 定義一個名為addr的共享內(nèi)存區(qū)域,大小為10MB,鍵值為$binary_remote_addr
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
   
        location / {
   
            # 每個IP地址最多允許10個并發(fā)連接
            limit_conn addr 10;
        }
    }
}

下面是一個限制請求頻率的例子,它限制了每個客戶端IP每秒最多發(fā)起20次請求,并且設(shè)置了突發(fā)緩沖區(qū)為5次請求:

http {
   
    # 定義一個名為req_zone的共享內(nèi)存區(qū)域,大小為10MB,鍵值為$binary_remote_addr,速率限制為每秒20次請求
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=20r/s;

    server {
   
        location / {
   
            # 應(yīng)用名為req_zone的限制規(guī)則,允許突發(fā)請求量為5
            limit_req zone=req_zone burst=5 nodelay;
        }
    }
}

配置白名單

配置IP白名單是一種有效的安全措施,特別是對于管理后臺等敏感區(qū)域。通過只允許特定的、受信任的IP地址訪問這些區(qū)域,可以大大減少未經(jīng)授權(quán)訪問的風(fēng)險。

如果你使用Nginx作為你的Web服務(wù)器,可以通過以下方式限制對某些路徑的訪問僅限于指定的IP地址:

server {
   
    listen 80;
    server_name yourdomain.com;

    location /admin/ {
   
        allow 192.168.1.1; # 允許的IP地址
        deny all; # 拒絕所有其他IP地址
        proxy_pass http://backend;
    }
}

上述配置會使得只有來自192.168.1.1的請求能夠訪問/admin/路徑下的資源,而所有其他IP地址的請求都將被拒絕。

優(yōu)化SSL配置

優(yōu)化SSL配置是確保網(wǎng)站安全性和性能的關(guān)鍵步驟。以下是一些具體的建議和代碼示例,用于增強SSL/TLS的安全性:

禁用舊版本的SSL/TLS協(xié)議(如SSLv3, TLS 1.0, 和 TLS 1.1),因為它們存在已知的安全漏洞。

在Nginx中,你可以通過以下配置來實現(xiàn):

server {
   
    listen 443 ssl http2;
    ssl_protocols TLSv1.2 TLSv1.3;

    # 其他配置...
}

選擇強加密套件以保護數(shù)據(jù)傳輸。避免使用含有MD5、RC4等不安全算法的套件。

server {
   
    listen 443 ssl http2;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384ECDHE-ECDSA-CHACHA20-POLY1305ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;

    # 其他配置...
}

在線證書狀態(tài)協(xié)議(OCSP)Stapling允許服務(wù)器預(yù)先獲取證書吊銷狀態(tài),并將其提供給客戶端,從而減少客戶端查詢時間。

server {
   
    listen 443 ssl http2;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 10s;

    # 其他配置...
}

HSTS告訴瀏覽器總是使用HTTPS訪問你的站點,即使用戶嘗試通過HTTP訪問。

server {
   
    listen 443 ssl http2;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 其他配置...
}

會話票據(jù)可以加快后續(xù)連接的速度,因為它們允許跳過完整的TLS握手過程。

server {
   
    listen 443 ssl http2;
    ssl_session_tickets on;

    # 其他配置...
}

文件上傳安全

為了確保Nginx配置能夠防止通過上傳大文件耗盡服務(wù)器資源,并且保證上傳目錄的權(quán)限配置正確,我們需要從幾個方面入手:限制上傳文件大小、設(shè)置正確的目錄權(quán)限以及確保上傳的文件不會被執(zhí)行。

在Nginx中,我們可以通過client_max_body_size指令來控制允許客戶端上傳的最大文件大小。這個指令可以在http, server, 或者 location塊中進行設(shè)置。以下是一個示例配置:

http {
   
    # 其他配置...

    client_max_body_size 10m; # 設(shè)置最大上傳文件大小為10MB

    server {
   
        listen       80;
        server_name  example.com;

        location /upload {
   
            # 將請求轉(zhuǎn)發(fā)給后端處理文件上傳的應(yīng)用服務(wù)器
            proxy_pass http://backend_server;

            # 確保這里也設(shè)置了client_max_body_size以覆蓋默認(rèn)值
            client_max_body_size 10m;
        }

        # 其他配置...
    }
}

上述配置將所有上傳請求的最大文件大小限制為10MB。如果用戶嘗試上傳超過此大小的文件,Nginx會返回413 (Request Entity Too Large)錯誤。

為了保護上傳的文件不被惡意執(zhí)行,應(yīng)該對上傳目錄設(shè)置適當(dāng)?shù)臋?quán)限,并禁止該目錄下的腳本執(zhí)行。以下是如何在Nginx配置中做到這一點的一個例子:

server {
   
    listen       80;
    server_name  example.com;

    location /uploads {
   
        alias /path/to/uploads; # 指定上傳目錄的實際路徑

        # 防止任何PHP或類似腳本被執(zhí)行
        location ~* .(php|pl|py|jsp|asp|sh|cgi)$ {
   
            deny all; # 對匹配這些擴展名的文件返回403 Forbidden
        }
    }
}

在這個配置中,任何試圖訪問具有.php, .pl, .py, .jsp, .asp, .sh, 或 .cgi擴展名的文件都會被拒絕訪問,即使這些文件位于/uploads目錄下。這可以有效避免由于文件上傳而導(dǎo)致的安全風(fēng)險。

防止常見攻擊

防止DDoS攻擊

http {
   
    # 設(shè)置請求速率限制
    limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

    server {
   
        location /login.html {
   
            # 應(yīng)用請求速率限制
            limit_req zone=one;
        }

        # 設(shè)置并發(fā)連接數(shù)限制
        limit_conn_zone $binary_remote_addr zone=addr:10m;

        location /shopping/ {
   
            limit_conn addr 10; # 每個IP最多允許10個并發(fā)連接
        }

        # 關(guān)閉慢連接
        client_body_timeout 5s;
        client_header_timeout 5s;
    }
}

通過這種方式,可以有效地減少惡意用戶發(fā)起的大量請求對服務(wù)器造成的壓力。

防止SQL注入

雖然SQL注入主要是應(yīng)用程序?qū)用娴膯栴},但是Nginx也可以通過過濾特定的查詢字符串來輔助防護:

location / {
       
# 檢查URL中是否包含特殊字符    
# 如果包含分號、單引號、尖括號等字符,返回444狀態(tài)碼    
# 444是Nginx特殊狀態(tài)碼,表示關(guān)閉連接而不發(fā)送響應(yīng)頭    
if ($request_uri ~* [;'<>] ) {
           
return 444;    
}       
# 檢查查詢字符串中的特殊字符    
if ($args ~* [;'<>] ) {
          
 return 444;    }       
 # 保護敏感URI    
location ~* /(admin|backup|config|db|src)/ {
          
 deny all;    
}}

這會阻止包含有潛在危險字符的請求到達后端服務(wù)。

防止跨站腳本攻擊(XSS)

可以通過設(shè)置HTTP響應(yīng)頭來增加安全性:

add_header X-XSS-Protection "1; mode=block";

這個頭部告訴瀏覽器啟用XSS過濾,并在檢測到XSS攻擊時阻止渲染頁面。

點擊劫持(Clickjacking)防御

通過設(shè)置X-Frame-Options響應(yīng)頭來防止點擊劫持:

add_header X-Frame-Options SAMEORIGIN;

這樣可以確保你的網(wǎng)站只能被嵌入到相同域名下的iframe中,增加了額外的安全層

防止目錄遍歷

防止目錄遍歷攻擊是Nginx配置中的一個重要方面,這種攻擊允許攻擊者通過構(gòu)造特殊的URL訪問Web服務(wù)器上的未授權(quán)文件或目錄。

禁用目錄列表(autoindex off)

默認(rèn)情況下,Nginx不會列出目錄內(nèi)容,但是如果你不小心啟用了autoindex on,則可能暴露敏感信息。確保在所有相關(guān)位置塊中禁用目錄列表:

server {
   
    listen 80;
    server_name example.com;

    location / {
   
        autoindex off; # 確保目錄瀏覽被關(guān)閉
        root /var/www/html;
    }
}

使用正則表達式阻止包含../的請求

你可以使用正則表達式匹配并拒絕任何試圖進行目錄遍歷的請求:

location ~ /../ {
   
    deny all; # 拒絕所有包含“../”的請求
}

正確配置別名(alias)和根路徑(root)

當(dāng)使用alias時,確保正確地添加斜杠以避免潛在的目錄遍歷漏洞:

location /static/ {
    # 注意這里的斜杠
    alias /var/www/static_files/; # 確保這里也有斜杠
}

啟用基于IP的訪問控制

你可以限制對特定目錄的訪問,只允許某些IP地址訪問:

location /admin/ {
   
    allow 192.168.1.100; # 允許特定IP訪問
    deny all; # 拒絕其他所有IP訪問
}

URL解碼過濾

雖然Nginx默認(rèn)會對URL進行解碼,但你仍然可以添加額外的安全層來確保路徑中的特殊字符不會導(dǎo)致問題:

if ($uri ~* "..") {
   
    return 403; # 如果URI包含“..”,返回403 Forbidden
}

假設(shè)你有一個網(wǎng)站托管在Nginx上,并且你希望保護你的服務(wù)器不受目錄遍歷攻擊的影響。你的網(wǎng)站有一個公開可訪問的靜態(tài)資源目錄/static/images/,以及一個后臺管理面板/admin/。為了防止目錄遍歷攻擊,你可以采取以下措施:

對于靜態(tài)資源目錄,確保autoindex被關(guān)閉,并且正確配置了別名:

location /static/ {
   
    alias /var/www/static_files/;
    autoindex off; # 確保目錄瀏覽被關(guān)閉
}

對于后臺管理面板,你可以設(shè)置基于IP的訪問控制:

location /admin/ {
   
    allow 192.168.1.100; # 只允許特定IP訪問
    deny all; # 拒絕其他所有IP訪問
}

全局防護,在整個服務(wù)器配置中添加針對目錄遍歷的防護規(guī)則:

server {
   
    listen 80;
    server_name yoursite.com;

    # 拒絕不含斜杠的父級目錄嘗試
    location ~ /../ {
   
        deny all;
    }

    # 正常的站點配置...
}

這些配置能夠幫助你構(gòu)建一個更加安全的環(huán)境,有效地防止目錄遍歷攻擊。

日志安全

在Nginx中,通過配置訪問日志和錯誤日志,可以有效地記錄用戶行為和系統(tǒng)狀態(tài),這對于安全分析至關(guān)重要。下面我將提供具體的代碼示例來說明如何配置這些日志。

為了詳細記錄訪問信息,你可以自定義log_format來包含盡可能多的相關(guān)字段,并使用access_log指令指定日志文件的位置以及使用的格式。以下是一個詳細的訪問日志配置示例:

http {
   
    # 定義一個名為'main'的日志格式,包含多種有用的信息
    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '"$http_x_forwarded_for" "$msec" '
                    '"$connection" "$connection_requests" '
                    '"$upstream_addr" "$upstream_response_time" '
                    '"$request_time" "$gzip_ratio"';

    # 指定使用'main'格式記錄訪問日志到特定位置
    access_log /var/log/nginx/access.log main buffer=32k flush=1m;

    server {
   
        listen 80;
        server_name example.com;

        location / {
   
            root /var/www/html;
            index index.html;
        }
    }
}

在這個例子中,我們定義了一個叫做main的復(fù)雜日志格式,它包括了客戶端IP地址、請求時間、請求詳情、響應(yīng)狀態(tài)碼、發(fā)送給客戶端的數(shù)據(jù)大小、來源頁面、用戶代理、X-Forwarded-For頭(如果有的話)、毫秒級的時間戳、連接序列號、通過該連接發(fā)出的請求數(shù)量、上游服務(wù)器地址、上游響應(yīng)時間、整個請求處理時間和壓縮率等。

對于錯誤日志,你需要根據(jù)實際情況選擇合適的日志級別。例如,在生產(chǎn)環(huán)境中,你可能希望設(shè)置為warn或error級別,以減少不必要的信息并專注于實際問題。以下是配置錯誤日志級別的示例:

http {
   
    # 設(shè)置全局錯誤日志級別為warn
    error_log /var/log/nginx/error.log warn;

    server {
   
        listen 80;
        server_name example.com;

        location / {
   
            root /var/www/html;
            index index.html;
        }

        # 可以為特定虛擬主機設(shè)置不同的錯誤日志級別
        error_log /var/log/nginx/example.error.log error;
    }
}

在這個配置中,全局錯誤日志被設(shè)置為warn級別,這意味著只有警告及以上級別的消息會被記錄。而對于特定的虛擬主機(如example.com),錯誤日志被設(shè)置為更嚴(yán)格的error級別,這樣可以集中關(guān)注那些真正可能導(dǎo)致服務(wù)中斷的問題。

其他安全措施

禁止執(zhí)行腳本

在Nginx中,你可以通過配置location塊來限制特定目錄下的腳本執(zhí)行權(quán)限。下面是一個示例,展示了如何阻止在/uploads目錄下執(zhí)行PHP腳本:

server {
   
    listen 80;
    server_name example.com;

    location /uploads/ {
   
        # 禁止訪問任何php腳本
        location ~* .php$ {
   
            deny all;
        }

        # 或者使用以下方式直接返回403錯誤給所有嘗試執(zhí)行php腳本的請求
        # location ~* .php$ {
   
        #     return 403;
        # }

        # 其他靜態(tài)資源處理規(guī)則...
    }

    # 其他server配置...
}

另一種方法是使用偽靜態(tài)規(guī)則來實現(xiàn)同樣的目的,這在寶塔面板等管理工具中較為常見:

location ~ /(uploads)/.*.(php|php5)$ {
   
    deny all; # 返回403 Forbidden
}

配置超時時間

設(shè)置合理的超時參數(shù)是防御慢速攻擊(Slow HTTP DoS Attack)的關(guān)鍵措施之一。慢速攻擊利用了HTTP協(xié)議的特性,通過緩慢地發(fā)送請求或響應(yīng)數(shù)據(jù)來消耗服務(wù)器資源,導(dǎo)致服務(wù)器無法處理正常請求。以下是針對不同層面配置超時時間以防止此類攻擊的方法和示例。

在Nginx中,可以通過調(diào)整以下參數(shù)來防御慢速攻擊:

client_body_timeout: 設(shè)置客戶端與服務(wù)器建立連接后發(fā)送request body的超時時間。

client_header_timeout: 設(shè)置客戶端向服務(wù)器發(fā)送一個完整的request header的超時時間。

send_timeout: 設(shè)置服務(wù)端向客戶端傳輸數(shù)據(jù)的超時時間。

keepalive_timeout: 設(shè)置每個TCP連接最多可以保持多長時間。

client_max_body_size: 限制客戶端能夠上傳的最大文件大小。

limit_rate: 限制連接速率,防止客戶端過快地使用帶寬。

下面是一個基本的Nginx配置示例:

http {
   
    # 設(shè)置客戶端主體讀取超時時間為10秒
    client_body_timeout 10s;

    # 設(shè)置客戶端頭部讀取超時時間為10秒
    client_header_timeout 10s;

    # 設(shè)置發(fā)送給客戶端的數(shù)據(jù)超時時間為10秒
    send_timeout 10s;

    # 設(shè)置Keep-Alive連接的超時時間為60秒
    keepalive_timeout 60s;

    # 設(shè)置允許客戶端上傳的最大文件大小為1M
    client_max_body_size 1M;

    # 限制每秒傳輸?shù)臄?shù)據(jù)量為100KB
    limit_rate 100k;

    server {
   
        listen 80;
        server_name example.com;

        location / {
   
            # 其他配置...
        }
    }
}

總結(jié)

綜上所述,通過禁用不必要的HTTP方法、隱藏版本信息、設(shè)置緩沖區(qū)大小限制、屏蔽不受歡迎的爬蟲、限制IP訪問、控制并發(fā)連接數(shù)及速度、調(diào)整超時時間,并采用HTTPS協(xié)議與優(yōu)化SSL/TLS策略等措施,可以顯著增強Nginx的安全性。同時,配置安全頭部字段如Content Security Policy (CSP)有助于防御跨站腳本攻擊和其他代碼注入威脅。確保Nginx及其模塊保持最新,遵循最小權(quán)限原則運行服務(wù),并定期審計系統(tǒng)日志,對于構(gòu)建堅固的安全防線至關(guān)重要。實施這些策略不僅能夠有效抵御已知威脅,也為應(yīng)對未知挑戰(zhàn)提供了有力保障。

鏈接:https://developer.aliyun.com/article/1650977?spm=5176.21213303.J_v8LsmxMG6alneH-O7TCPa.5.4a5f2f3dvsDvvQ&scm=20140722.S_community@@%E6%96%87%E7%AB%A0@@1650977._.ID_1650977-RL_nginx-LOC_search~UND~community~UND~item-OR_ser-PAR1_2150422117395193796102487ec1a7-V_4-P0_4-P1_0

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 網(wǎng)絡(luò)安全
    +關(guān)注

    關(guān)注

    11

    文章

    3339

    瀏覽量

    61446
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    171

    瀏覽量

    12589

原文標(biāo)題:總結(jié)

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Nginx性能優(yōu)化終極指南

    而worker 進程數(shù)默認(rèn)為 1 。單進程最大連接數(shù)為1024。如下圖(打開Nginx目錄下的/conf/nginx.conf 文檔),現(xiàn)在我們對這兩個數(shù)值進行調(diào)優(yōu)
    的頭像 發(fā)表于 06-16 13:44 ?245次閱讀
    <b class='flag-5'>Nginx</b>性能<b class='flag-5'>優(yōu)化</b>終極指南

    Nginx服務(wù)優(yōu)化教程

    隱藏Nginx版本號,避免安全漏洞泄漏:修改配置文件法;修改源碼法
    的頭像 發(fā)表于 03-12 15:57 ?505次閱讀
    <b class='flag-5'>Nginx</b>服務(wù)<b class='flag-5'>優(yōu)化</b>教程

    EulerOS+Nginx+MySQL 部署 GLPI 資產(chǎn)管理系統(tǒng)

    1. 部署環(huán)境說明 ??本次環(huán)境選擇使用華為云 Flexus 云服務(wù)器 X 實例,因為其具有高性能的計算能力、靈活的資源配置、穩(wěn)定的運行環(huán)境、高效的
    的頭像 發(fā)表于 01-03 09:28 ?724次閱讀
    EulerOS+<b class='flag-5'>Nginx</b>+MySQL 部署 GLPI 資產(chǎn)管理系統(tǒng)

    提高網(wǎng)絡(luò)性能的阻抗優(yōu)化技巧

    提高網(wǎng)絡(luò)性能的阻抗優(yōu)化技巧涉及多個層面,包括電路板設(shè)計、網(wǎng)絡(luò)架構(gòu)設(shè)計、以及具體設(shè)備配置等。以下是一些關(guān)鍵的阻抗
    的頭像 發(fā)表于 12-10 10:09 ?859次閱讀

    電池的安全性測試項目有哪些?

    電池的安全性測試是保證電池在實際使用過程中穩(wěn)定、安全的重要手段。通過一系列嚴(yán)格的測試項目,能夠有效評估電池在不同條件下的表現(xiàn),并提前發(fā)現(xiàn)潛在的安全隱患。對于消費者而言,了解這些測試項目
    的頭像 發(fā)表于 12-06 09:55 ?2100次閱讀
    電池的<b class='flag-5'>安全性</b>測試項目有哪些?

    「服務(wù)器」Nginx Proxy Manager申請cloudflare泛域名

    ,可以快速添加和管理代理主機(即反向代理規(guī)則)。SSL管理:支持通過Let'sEncrypt自動獲取和續(xù)訂SSL/TLS證書,以保護網(wǎng)站的安全性。訪問控制:可以對代理
    的頭像 發(fā)表于 12-06 01:03 ?606次閱讀
    「服務(wù)器」<b class='flag-5'>Nginx</b> Proxy Manager申請cloudflare泛域名

    如何配置modem設(shè)備以提高網(wǎng)絡(luò)速度

    配置Modem設(shè)備以提高網(wǎng)絡(luò)速度可以通過多個方面進行,以下是一些建議的步驟: 一、硬件選擇與優(yōu)化 高性能Modem :選擇性能卓越的Mode
    的頭像 發(fā)表于 11-22 16:08 ?872次閱讀

    在電氣安裝中通過負(fù)載箱實現(xiàn)最大效率和安全性

    性能,通過負(fù)載箱,可以模擬各種實際的運行條件,對設(shè)備進行全面的性能測試。這不僅可以發(fā)現(xiàn)設(shè)備的潛在的問題,還可以優(yōu)化設(shè)備的運行參數(shù),提高設(shè)備的運行效率和穩(wěn)定性。 通過負(fù)載箱,可以實現(xiàn)電氣
    發(fā)表于 11-20 15:24

    如何配置 VLAN 以提高網(wǎng)絡(luò)安全

    配置虛擬局域網(wǎng)(VLAN)是一種在交換網(wǎng)絡(luò)提高網(wǎng)絡(luò)安全的有效方法。VLAN通過網(wǎng)絡(luò)劃分為多個
    的頭像 發(fā)表于 11-19 09:17 ?1439次閱讀

    nginx負(fù)載均衡配置介紹

    目錄 nginx負(fù)載均衡 nginx負(fù)載均衡介紹 反向代理與負(fù)載均衡 nginx負(fù)載均衡配置 Keepalived高可用nginx負(fù)載均衡器
    的頭像 發(fā)表于 11-10 13:39 ?750次閱讀
    <b class='flag-5'>nginx</b>負(fù)載均衡<b class='flag-5'>配置</b>介紹

    恒訊科技分析:IPSec與SSL/TLS相比,安全性如何?

    IPSec和SSL/TLS都是用于保護網(wǎng)絡(luò)通信安全的協(xié)議,但它們在實現(xiàn)方式、安全性側(cè)重點、兼容以及使用場景上存在一些顯著的區(qū)別。1、安全性
    的頭像 發(fā)表于 10-23 15:08 ?899次閱讀
    恒訊科技分析:IPSec與SSL/TLS相比,<b class='flag-5'>安全性</b>如何?

    ipsec組網(wǎng)通過其加密和驗證機制提供高安全性

    ipsec組網(wǎng)是一種在公用網(wǎng)絡(luò)上建立專用網(wǎng)絡(luò)的技術(shù),它通過在IP層對數(shù)據(jù)包進行加密和驗證保證通信的安全性。IPSec VPN
    的頭像 發(fā)表于 10-18 10:37 ?816次閱讀

    在跨境電商中,如何確保網(wǎng)絡(luò)節(jié)點的安全性和合規(guī)?

    在跨境電商中,確保網(wǎng)絡(luò)節(jié)點的安全性和合規(guī)是至關(guān)重要的。以下是一些關(guān)鍵措施: 1、數(shù)據(jù)保護:加強數(shù)據(jù)保護是提高安全性的重要方面。這包括確保所有敏感數(shù)據(jù)都
    的頭像 發(fā)表于 09-25 13:45 ?1153次閱讀

    通過實時盲區(qū)檢測提高車輛安全性

    車載汽車安全系統(tǒng)通過檢測駕駛員盲區(qū)中是否存在相鄰車輛,并警告駕駛員可能發(fā)生的事故防止發(fā)生車禍。駕駛員可以使用此信息來安全地變道。在本文中,我們將討論盲區(qū)檢測技術(shù)。
    的頭像 發(fā)表于 08-30 16:39 ?1565次閱讀
    <b class='flag-5'>通過</b>實時盲區(qū)檢測<b class='flag-5'>提高</b>車輛<b class='flag-5'>安全性</b>

    請問DM平臺訪問安全性如何控制?

    DM平臺訪問安全性如何控制?
    發(fā)表于 07-25 06:10