這篇Nginx安全加固文章,我們將討論如何讓Nginx變得更安全
SSL加固
儘管你的網站被配置為只處理HTTPS流量,但它仍然允許客戶端嘗試進一步的HTTP連接。 在伺服器回應中添加Strict-Transport-Security頭將確保所有未來的連接都執行HTTPS。
打開Nginx的主配置檔。
sudo nano /etc/nginx/nginx.conf
在HTTP塊中添加以下代碼
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
你可能想知道,如果這個標頭自動執行HTTPS流量,為什麼還需要301重定向:不幸的是,IE10及以下版本不支持這個標頭。
測試一下你的Nginx配置,如果沒有問題,重新載入。
sudo nginx -t
sudo service nginx reload
現在,如果你使用Qualys SSL測試工具進行掃描,你應該得到一個A+的等級。
SSL性能
HTTPS連接比普通HTTP連接更耗費資源。 這是由於建立連接時需要額外的握手程式。 然而,可以對SSL會話參數進行緩存,這將完全避免後續連接的SSL握手過程。
打開Nginx的主配置檔。
sudo nano /etc/nginx/nginx.conf
在HTTP塊中添加以下代碼
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
測試Nginx的配置,如果成功則重新載入。
sudo nginx -t
sudo service nginx reload
跨站文稿(XSS)
處理XSS的最有效的方法是確保你正確地驗證和凈化你的代碼中的所有用戶輸入,包括WordPress管理區域內的輸入。 但是,當你考慮第三方主題和外掛程式時,大多數輸入驗證是你無法控制的。 但是,你可以通過配置Nginx來提供一些額外的回應頭來減少XSS攻擊的風險。
讓我們假設一個攻擊者設法將一個惡意的JS檔嵌入到網站的原始程式碼中,也許是通過一個評論表單或類似的東西。 默認情況下,瀏覽器會在不知情的情況下載入這個外部檔並允許其內容執行。 進入內容安全策略,它允許你定義一個被批准載入資產(JS、CSS等)的來源白名單。 如果腳本不在批准的名單上,它就不會被載入。
創建一個內容安全策略可能需要一些嘗試和錯誤,因為你需要小心不要阻止應該被載入的資產,如谷歌或其他第三方供應商。 這個樣本政策將允許當前的功能變數名稱和一些來自谷歌和 WordPress.org 的資源。
default-src 'self' https://.google-analytics.com https://.googleapis.com https://.gstatic.com https://.gravatar.com https://*.w.org data: 'unsafe-inline' 'unsafe-eval';
另外,有些人選擇只封鎖非HTTPS資產,雖然安全性較差,但管理起來卻容易得多。
default-src 'self' https: data: 'unsafe-inline' 'unsafe-eval';
你可以把這個指令添加到nginx.conf或每個網站的單獨配置檔中,這取決於你是否想在所有網站之間共用策略。 就我個人而言,我在全域配置檔中指定一個通用策略,然後根據需要在每個網站上覆蓋它。
sudo nano /etc/nginx/nginx.conf
在HTTP塊中添加以下代碼。
##
# Security
##
add_header Content-Security-Policy "default-src 'self' https: data: 'unsafe-inline' 'unsafe-eval';" always;
你們中的一些人可能已經發現,這隻涉及到外部資源,但內聯腳本呢? 有兩種方法可以處理這個問題。
通過從 「內容安全策略 」中刪除 「無安全內聯 」和 「無安全評價」,完全禁止內聯腳本。 然而,這種方法會破壞一些第三方外掛程式或主題,所以要小心。
啟用X-XSS保護,這將指示瀏覽器過濾使用者輸入,確保可疑代碼不會直接輸出到HTML。 雖然不是無懈可擊,但這是一個相對簡單的應對措施,可以實現。
要啟用X-Xss-Protection過濾器,請在 「內容-安全-政策」條目下添加以下指令。
add_header X-Xss-Protection "1; mode=block" always;
這些頭檔不能替代正確的驗證或凈化,但它們確實提供了另一道非常強大的防線,以防止常見的XSS攻擊。 只安裝來自可信來源的高品質外掛程式和主題是你最好的第一道防線。
點擊劫持
點擊劫持是一種欺騙使用者執行他們無意的行動的攻擊,通常是通過使用iframe實現的。 特洛伊-亨特的一篇文章對點擊劫持作了詳盡的解釋。
打擊這種攻擊媒介的最有效方法是完全禁用第三方域名的框架嵌入。 要做到這一點,請在X-Xss-Protection標頭下面添加以下指令。
add_header X-Frame-Options "SAMEORIGIN" always;
這將防止所有外部域通過使用iframe標籤將你的網站直接嵌入他們的網站。
http://mydomain.com/
目的地將收到。
https://myawesomesite.com
你可以使用下面的策略來實現這一點。
add_header Referrer-Policy "origin-when-cross-origin" always;
這就是所有建議的安全頭的實現。 在重新載入Nginx配置之前,確保沒有任何語法錯誤,保存並關閉該檔。
sudo nginx -t
sudo service nginx reload