如何在 Nginx 中設定安全標頭

在 NGINX 中設定安全標頭對於增強 Web 應用程式的安全性至關重要。安全標頭可防止各種攻擊,例如跨站腳本 (XSS)、點擊劫持和其他程式碼注入攻擊。它們指示瀏覽器如何處理您網站的內容,從而提供額外的安全層。

本指南將引導您完成在 NGINX 中設定安全標頭的步驟,協助您保護 Web 應用程式並提高整體安全性。

在 NGINX 中實現 HTTP 嚴格傳輸安全性 (HSTS)

了解 HSTS

HTTP 嚴格傳輸安全性 (HSTS) 是至關重要的網站安全協定。它強制與網域的連接僅透過 HTTPS 進行。這可以減輕中間人攻擊等風險,並確保在線上傳輸資料的完整性和機密性。當使用者嘗試透過 HTTP 存取網站時,HSTS 會自動將連線升級到 HTTPS。

在 NGINX 中配置 HSTS

要在 NGINX 中設定 HSTS,您必須更新 NGINX 設定檔中的伺服器區塊。該檔案通常位於 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 的站點特定配置中。此更新涉及新增標頭,指示瀏覽器始終對指定網域使用 HTTPS。

在您的網域的伺服器區塊中,新增以下行:

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

該行包含兩個元件:

  • max-age=31536000:指示瀏覽器記得在接下來的 12 個月內對您的網站使用 HTTPS。
  • includeSubDomains:將 HSTS 策略套用至網站的所有子網域,以實現全面的安全性。

使用 HSTS 的 NGINX 設定範例

帶有 HSTS 標頭的 NGINX 配置可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    location / {
        proxy_pass http://my_portal;
    }
}

新增此標頭後,重新載入 NGINX 以使用 sudo systemctl reload nginx 或 sudo nginx -s reload 實作變更。

其他 NGINX 設定範例

對於不同的場景,您的 NGINX 配置與 HSTS 可能會有所不同。以下是其他範例:

多網域伺服器

server {
    listen 80;
    server_name example1.com example2.com;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    location / {
        # Configuration details
    }
}

此配置將 HSTS 套用至同一伺服器上託管的多個網域。列出的每個網域都將強制執行 HTTPS 連線。

具有 SSL 終止功能的伺服器

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/private/key;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    location / {
        # Configuration details
    }
}

此設定適用於處理 SSL 終止的伺服器。它使用指定的 SSL 憑證在安全連接埠 (443) 上設定 HSTS,從而增強安全連線。

在 NGINX 中設定內容安全性原則 (CSP)

在 NGINX 中實施 CSP

將內容安全策略 (CSP) 整合到 NGINX 中是增強 Web 應用程式安全性的策略性舉措。它涉及在 NGINX 設定檔的伺服器區塊中新增特定標頭。該檔案通常位於 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目錄中,需要仔細編輯才能有效套用 CSP。

對於基本的 CSP 設置,請在伺服器區塊中新增以下行:

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

此指令限制內容載入到網站的網域(「自身」),從而顯著降低惡意外部內容執行的風險。

使用 CSP 的 NGINX 設定範例

帶有基本 CSP 指令的 NGINX 配置可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Content-Security-Policy "default-src 'self';" always;

    location / {
        proxy_pass http://my_portal;
    }
}

新增此指令後,使用 sudo systemctl reload nginx 或 sudo nginx -s reload 重新載入 NGINX。

客製化 CSP 以滿足特定需求

CSP 可以客製化以滿足您網站的特定安全需求。以下是針對不同場景的擴充配置:

允許來自任何來源的圖像

add_header Content-Security-Policy "default-src 'self'; img-src *;" always;

此配置允許從任何來源載入映像,從而保持對其他類型內容的嚴格控制。

具體腳本和樣式配置

add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trustedscript.com; style-src 'self' 'unsafe-inline';";

此設定允許來自您的網域和受信任的外部來源的腳本以及內聯樣式,從而平衡功能與安全性。

探索 CSP 指令和選項

CSP 中的指令

CSP 指令是定義特定內容類型策略的規則。常見指令包括:

  • default-src:適用於大多數內容類型的預設策略。
  • script-src:管理 JavaScript 資源的來源。
  • style-src:指定允許的 CSS 資源來源。
  • img-src:控制影像資源的來源。
  • connect-src:設定網路連線策略,例如 XMLHttpRequest、WebSocket 和 EventSource。

CSP 中的來源表達式

來源表達式定義每個指令允許的來源:

  • 'none':阻止所有來源。
  • 'self':允許來自同一來源的資源。
  • 'unsafe-inline':允許內嵌資源,例如樣式或 JavaScript URL。
  • 'unsafe-eval':允許 JavaScript eval() 函數和類似的方法。
  • https:: 啟用來自任何 HTTPS URL 的資源。

在 NGINX 中設定 X-XSS 保護

X-XSS 防護簡介

X-XSS-Protection 或跨網站腳本標頭對於保護 Web 應用程式免受 XSS(跨網站腳本)攻擊至關重要。該標頭受到 Chrome、Internet Explorer 和 Safari 等主要 Web 瀏覽器的支持,透過在偵測到反射型 XSS 攻擊時阻止頁面載入來增強 Web 安全性。

在 NGINX 中啟用 X-XSS 保護

將 X-XSS-Protection 標頭整合到 NGINX 伺服器配置中可以增強瀏覽器的本機 XSS 保護。若要啟用此安全功能,請存取 NGINX 設定文件,該檔案通常位於 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目錄中。

在 NGINX 設定檔的伺服器區塊中,插入下列指令:

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

指令包括兩部分:

  • 1:啟動瀏覽器的XSS過濾器。
  • mode=block:如果偵測到 XSS 攻擊,則指示瀏覽器封鎖頁面,而不是嘗試對其進行清理。

具有 X-XSS 保護的 NGINX 設定範例

包含 X-XSS-Protection 的 NGINX 設定範例可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header X-XSS-Protection "1; mode=block";

    location / {
        proxy_pass http://my_portal;
    }
}

新增此標頭後,使用 sudo systemctl reload nginx 或 sudo nginx -s reload 重新載入 NGINX。

其他 NGINX 配置場景

對於具有 SSL 的伺服器

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/private/key;
    add_header X-XSS-Protection "1; mode=block";

    # Further configuration
}

此設定適用於具有 SSL 的伺服器,確保 X-XSS 保護在加密連線上處於活動狀態。

處理多個域

server {
    listen 80;
    server_name example1.com example2.com;
    add_header X-XSS-Protection "1; mode=block";

    # Further configuration
}

此配置跨單一伺服器上託管的多個網域套用 X-XSS 保護。

在 NGINX 中設定 X-Frame-Options

X-Frame-Options 的作用

X-Frame-Options 是一個重要的安全標頭,旨在保護網站免受點擊劫持攻擊。它可以防止網頁顯示在這些攻擊中經常使用的框架或 iframe 中。 X-Frame-Options 受到所有主要 Web 瀏覽器的支持,提供廣泛的保護,增強您跨不同平台的 Web 存在的安全性。

在 NGINX 中實作 X-Frame-Options

將 X-Frame-Options 標頭合併到 NGINX 伺服器配置中對於增強站點的安全性至關重要。此任務涉及編輯 NGINX 設定文件,通常位於 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目錄中。

若要啟用此安全功能,請將下列指令新增至 NGINX 設定檔中的伺服器區塊:

add_header X-Frame-Options "DENY";

該指令設定為“DENY”,指示瀏覽器阻止任何在框架或 iframe 中渲染頁面的嘗試,從而提供針對點擊劫持的強大防禦。

使用 X-Frame-Options 的 NGINX 設定範例

帶有 X-Frame-Options 標頭的 NGINX 設定範例如下:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header X-Frame-Options "DENY";

    location / {
        proxy_pass http://my_portal;
    }
}

新增此標頭後,重新載入 NGINX 以啟動變更非常重要。這可以使用 sudo systemctl reload nginx 或 sudo nginx -s reload 來完成。

擴充 X-Frame-Options 的 NGINX 配置

對於啟用 SSL 的伺服器

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/private/key;
    add_header X-Frame-Options "DENY";

    # Additional configuration
}

此配置適用於具有 SSL 的伺服器,確保在安全連線上強制執行 X-Frame-Options。

處理多個域

server {
    listen 80;
    server_name example1.com example2.com;
    add_header X-Frame-Options "DENY";

    # Additional configuration
}

此設定將 X-Frame-Options 標頭套用至同一伺服器上的多個網域,從而增強每個網域的安全性。

在 NGINX 中實作 X-Content-Type-Options

X-Content-Type-Options 的作用

X-Content-Type-Options 是 Web 安全性中至關重要的安全標頭,可防止瀏覽器進行 MIME 類型嗅探。此標頭強調瀏覽器尊重 HTTP 標頭中聲明的內容類型,解決瀏覽器誤解文件類型時可能出現的安全漏洞,例如將圖像文件視為可執行 HTML,這可能導致跨網站腳本 (XSS) 攻擊。

在 NGINX 中設定 X-Content-Type-Options

若要使用 X-Content-Type-Options 標頭增強 Web 伺服器的安全性,您需要直接修改 NGINX 設定檔。該檔案通常位於 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 中的站點特定配置中。

透過將以下行新增至以下內容來合併此標頭 server NGINX 配置塊:

add_header X-Content-Type-Options "nosniff";

「nosniff」設定指示瀏覽器嚴格遵循伺服器指定的內容類型,防止對內容進行替代解釋。

使用 X-Content-Type-Options 的 NGINX 設定範例

具有 X-Content-Type-Options 的 NGINX 配置的結構可能如下:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header X-Content-Type-Options "nosniff";

    location / {
        proxy_pass http://my_portal;
    }
}

更新配置後,請確保使用 sudo systemctl reload nginx 或 sudo nginx -s reload 重新載入 NGINX 以使變更生效。

擴充 NGINX 設定範例

SSL/TLS 配置

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/key.pem;
    add_header X-Content-Type-Options "nosniff";

    # Additional SSL configurations and locations
}

此設定適用於具有 SSL/TLS 的伺服器,在安全連線上套用 X-Content-Type-Options 以增強安全性。

多網域伺服器配置

server {
    listen 80;
    server_name example1.com example2.com;
    add_header X-Content-Type-Options "nosniff";

    # Additional configurations for multiple domains
}

此配置將 X-Content-Type-Options 標頭套用至同一伺服器上託管的多個網域,從而確保所有網域的安全設定保持一致。

在 NGINX 中配置 Referrer 策略

Referrer-Policy 的作用

Referrer-Policy 是一個重要的 HTTP 標頭,用於增強網路上的使用者隱私和安全性。它控制當使用者從您的網站導航到其他網站時,Referer 標頭中包含的建議資訊量,從而保護敏感資訊免遭 Web 請求中的洩漏。

在 NGINX 中設定引薦來源網址策略

要在 NGINX 伺服器中實作 Referrer-Policy 標頭,請修改 NGINX 設定文件,該檔案通常位於 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目錄中。將以下指令新增至伺服器區塊:

add_header Referrer-Policy "no-referrer";

該指令設定為“no-referrer”,可確保在網站導航期間不發送引用者訊息,從而最大限度地保護隱私。

使用引用策略的 NGINX 設定範例

帶有 Referrer-Policy 標頭的 NGINX 配置可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Referrer-Policy "no-referrer";

    location / {
        proxy_pass http://my_portal;
    }
}

新增此標頭後,使用 sudo systemctl reload nginx 或 sudo nginx -s reload 等指令重新載入 NGINX。

推薦人策略選項和定義

  • no-referrer:不發送引用者資訊。
  • no-referrer-when-downgrade(預設):從安全性頁面傳送同源目標或安全性 (HTTPS) 目標 URL 的引薦來源網址資訊。
  • origin:僅傳送來源(方案、主機和連接埠)。
  • origin-when-cross-origin:對於同源請求發送完整 URL,但對於其他情況僅發送來源。
  • same-origin:為同源請求傳送完整的引薦來源網址,但為跨來源請求傳送不標頭。
  • strict-origin:傳送 HTTPS 請求的來源,但不傳送 HTTP 請求的標頭。
  • strict-origin-when-cross-origin:將完整引用者傳送到同源請求,從 HTTPS 頁面將來源傳送到 HTTPS 目標,並且不向 HTTP 目標傳送標頭。
  • unsafe-url:發送完整 URL,無論來源或安全性如何(不建議)。

擴充 NGINX 設定範例

SSL/TLS 配置

server {
    listen 443 ssl;
    server_name secure.example.com;
    ssl_certificate /path/to/certificate.pem;
    ssl_certificate_key /path/to/key.pem;
    add_header Referrer-Policy "no-referrer";

    # Additional SSL configurations
}

此配置在啟用 SSL/TLS 的安全環境中套用 Referrer-Policy 標頭,從而增強加密連線的隱私性。

多網域伺服器配置

server {
    listen 80;
    server_name example1.com example2.com;
    add_header Referrer-Policy "no-referrer";

    # Additional configurations for each domain
}

此設定可確保 Referrer-Policy 標頭套用於同一伺服器上託管的多個網域,從而保持一致的隱私設定。

在 NGINX 中實施權限策略

了解權限策略

Permissions-Policy 標頭使 Web 管理員能夠精確控制其網站上的瀏覽器功能和 API。配置此標頭可顯著增強網站安全性和隱私性,並根據站點的特定需求啟用地理定位、攝影機和麥克風等功能限制。

在 NGINX 中配置權限策略

若要將 Permissions-Policy 標頭合併到 NGINX 伺服器中,請修改 NGINX 設定文件,該檔案通常位於 /etc/nginx/nginx.conf 或 /etc/nginx/sites-available/ 目錄中。

將以下指令新增至伺服器區塊:

add_header Permissions-Policy "geolocation=(); midi=(); notifications=(); push=(); sync-xhr=(); accelerometer=(); gyroscope=(); magnetometer=(); payment=(); usb=(); vr=(); camera=(); microphone=(); speaker=(); vibrate=(); ambient-light-sensor=(); autoplay=(); encrypted-media=(); execute-clipboard=(); document-domain=(); fullscreen=(); imagecapture=(); lazyload=(); legacy-image-formats=(); oversized-images=(); unoptimized-lossy-images=(); unoptimized-lossless-images=(); unsized-media=(); vertical-scroll=(); web-share=(); xr-spatial-tracking=();";

該指令列出了各種瀏覽器功能和 API,將它們全部設定為 (),從而有效地停用它們。此配置提供了一種全面的方法來限制可能損害使用者隱私或安全的功能。

具有權限策略的 NGINX 設定範例

以下是帶有 Permissions-Policy 標頭的 NGINX 配置的範例:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "geolocation=(); midi=(); notifications=(); push=(); sync-xhr=(); accelerometer=(); gyroscope=(); magnetometer=(); payment=(); usb=(); vr=(); camera=(); microphone=(); speaker=(); vibrate=(); ambient-light-sensor=(); autoplay=(); encrypted-media=(); execute-clipboard=(); document-domain=(); fullscreen=(); imagecapture=(); lazyload=(); legacy-image-formats=(); oversized-images=(); unoptimized-lossy-images=(); unoptimized-lossless-images=(); unsized-media=(); vertical-scroll=(); web-share=(); xr-spatial-tracking=();";

    location / {
        proxy_pass http://my_portal;
    }
}

該指令全面列出了各種瀏覽器功能和 API,將它們設為 () 可有效停用它們。

具有權限策略的 NGINX 設定範例

您的 NGINX 配置(包括權限策略)可能如下所示:

upstream my_portal {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "geolocation=(); midi=(); notifications=(); push=(); sync-xhr=(); accelerometer=(); gyroscope=(); magnetometer=(); payment=(); usb=(); vr=(); camera=(); microphone=(); speaker=(); vibrate=(); ambient-light-sensor=(); autoplay=(); encrypted-media=(); execute-clipboard=(); document-domain=(); fullscreen=(); imagecapture=(); lazyload=(); legacy-image-formats=(); oversized-images=(); unoptimized-lossy-images=(); unoptimized-lossless-images=(); unsized-media=(); vertical-scroll=(); web-share=(); xr-spatial-tracking=();";

    location / {
        proxy_pass http://my_portal;
    }
}

進行這些變更後,使用 sudo systemctl reload nginx 或 sudo nginx -s reload 重新載入 NGINX。

權限-策略選項解釋

Permissions-Policy 標頭可讓您自訂各種功能的使用:

  • 地理定位:控制地理位置資料的存取。
  • 迷笛:管理對 MIDI 設備的存取。
  • 通知:控制通知的顯示。
  • :影響推播通知功能。
  • 同步xhr:與同步 XMLHTTPRequest 相關。
  • 加速度計:指示對設備加速計的存取。
  • 陀螺儀:控制陀螺儀存取。
  • 磁力計:管理對設備磁力計的存取。
  • 支付:適用於付款請求功能。
  • USB:控制對 USB 裝置的存取。
  • 虛擬實境:與虛擬實境功能有關。
  • 相機:管理攝影機存取。
  • 麥克風:指定麥克風存取權限。
  • 揚聲器:控制揚聲器設備的存取。
  • 顫動:影響振動 API。
  • 環境光感測器:與環境光感測器有關。
  • 自動播放:控制媒體的自動播放。
  • 加密媒體:管理加密媒體存取。
  • 執行剪貼簿:控制剪貼簿讀/寫存取。
  • 文件域:與 document.domain 功能相關。
  • 全螢幕:指定全螢幕存取。
  • 影像捕捉:控制影像捕捉功能。
  • 延遲載入:影響影像的延遲載入。
  • 舊版圖片格式:與傳統圖像格式相關。
  • 超大影像:控制超大圖像的載入。
  • 未優化的有損影像:管理未優化的有損影像。
  • 未優化的無損影像:適用於未優化的無損影像。
  • 未調整大小的媒體:控制沒有明確大小的媒體。
  • 垂直滾動:影響垂直滾動。
  • 網路分享:與網路共享功能相關。
  • xr 空間追蹤:控制 XR 空間追蹤。

NGINX 中權限策略的進階配置

配置具有特定網域和通配符的權限策略

除了使用 () 停用功能的基本設定之外,NGINX 中的權限策略還可以自訂為允許來自特定網域或使用萬用字元的某些功能。這種高級配置可以更細緻地控制您的網站可以訪問的內容以及從何處訪問。

範例:允許來自特定域的功能

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "geolocation=(https://trusteddomain.com), microphone=(https://alloweddomain.com)";

    location / {
        proxy_pass http://my_portal;
    }
}

此配置僅允許從 https://trusteddomain.com 存取地理位置數據,並僅從 https://alloweddomain.com 存取麥克風,透過將這些敏感功能限制為可信任來源來增強安全性。

範例:使用通配符獲得廣泛權限

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "camera=*; fullscreen=*";

    location / {
        proxy_pass http://my_portal;
    }
}

此設定中的通配符 * 允許從任何網域存取相機和全螢幕模式。這種方法提供了更廣泛的權限,適合需要從各種來源存取廣泛功能的網站。

範例:結合限制和權限

server {
    listen 80;
    server_name example.com;
    add_header Permissions-Policy "accelerometer=(); gyroscope=(self https://example2.com); payment=*";

    location / {
        proxy_pass http://my_portal;
    }
}

在此配置中,停用加速度計訪問,允許來自同一網域和 https://example2.com 的陀螺儀訪問,並且允許來自所有網域的付款請求。

在 NGINX 中使用 Curl 指令驗證安全標頭

使用 Curl 檢查安全標頭

curl 指令是一個很有價值的工具,用來驗證 NGINX 伺服器中安全標頭的設定。它允許您檢查網站的標頭並確認安全標頭設定正確。此驗證步驟對於確保 Web 伺服器的安全措施有效且按預期運行至關重要。

執行curl指令進行頭驗證

若要檢查網站的標題,請在終端機中執行以下命令:

curl -I http://example.com

將 example.com 替換為您的網域。此命令從您的伺服器請求標頭,從而提供對活動安全性配置的深入了解。

預期輸出和解釋

執行curl命令後,您應該會收到類似於以下內容的輸出:

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 20 Mar 2023 00:00:00 GMT
Content-Type: text/html
Connection: keep-alive
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Security-Policy: default-src 'self';
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer
Permissions-Policy: geolocation=(); midi=(); notifications=(); push=(); sync-xhr=(); accelerometer=(); gyroscope=(); magnetometer=(); payment=(); usb=(); vr=(); camera=(); microphone=(); speaker=(); vibrate=(); ambient-light-sensor=(); autoplay=(); encrypted-media=(); execute-clipboard=(); document-domain=(); fullscreen=(); imagecapture=(); lazyload=(); legacy-image-formats=(); oversized-images=(); unoptimized-lossy-images=(); unoptimized-lossless-images=(); unsized-media=(); vertical-scroll=(); web-share=(); xr-spatial-tracking=();"

此輸出確認伺服器上各種安全標頭的存在和正確配置,例如 Strict-Transport-Security、Content-Security-Policy、X-XSS-Protection 等。輸出中列出的每個標頭在保護 Web 伺服器免受各種 Web 漏洞影響方面發揮特定作用。

結論

透過在 NGINX 中設定安全標頭,您可以顯著增強 Web 應用程式的安全性。定期檢查和更新您的安全標頭,以適應不斷變化的安全威脅。實施這些標頭有助於防範各種攻擊,並確保為用戶提供更安全的瀏覽體驗。保持警惕並使您的 NGINX 配置保持最新,以穩健地保護您的網路資產。

Joshua James
跟我來
Joshua James 的最新帖子 (看全部)

發佈留言