Linux中國

如何配置使用 HTTP 嚴格傳輸安全(HSTS)

什麼是 HTTP 嚴格傳輸安全?

引用自 Mozilla Developer Network:

如果一個 web 伺服器支持 HTTP 訪問,並將其重定向到 HTTPS 訪問的話,那麼訪問者在重定向前的初始會話是非加密的。舉個例子,比如訪問者輸入 http://www.foo.com/ 或直接輸入 foo.com 時。

這就給了中間人攻擊的一個機會,重定向可能會被破壞,從而定向到一個惡意站點而不是應該訪問的加密頁面。

HTTP 嚴格傳輸安全(HSTS)功能使 Web 伺服器告知瀏覽器絕不使用 HTTP 訪問,在瀏覽器端自動將所有到該站點的 HTTP 訪問替換為 HTTPS 訪問。

以下引自維基百科:

HSTS 可以用來抵禦 SSL 剝離攻擊。SSL 剝離攻擊是中間人攻擊的一種,由 Moxie Marlinspike 於2009年發明。他在當年的黑帽大會上發表的題為 「New Tricks For Defeating SSL In Practice」 的演講中將這種攻擊方式公開。SSL剝離的實施方法是阻止瀏覽器與伺服器創建HTTPS連接。它的前提是用戶很少直接在地址欄輸入https://,用戶總是通過點擊鏈接或3xx重定向,從HTTP頁面進入HTTPS頁面。所以攻擊者可以在用戶訪問HTTP頁面時替換所有https://開頭的鏈接為http://,達到阻止HTTPS的目的。

HSTS可以很大程度上解決SSL剝離攻擊,因為只要瀏覽器曾經與伺服器創建過一次安全連接,之後瀏覽器會強制使用HTTPS,即使鏈接被換成了HTTP。

另外,如果中間人使用自己的自簽名證書來進行攻擊,瀏覽器會給出警告,但是許多用戶會忽略警告。HSTS解決了這一問題,一旦伺服器發送了HSTS欄位,用戶將不再允許忽略警告。

場景舉例:

當你通過一個無線路由器的免費 WiFi 訪問你的網銀時,很不幸的,這個免費 WiFi 也許就是由黑客的筆記本所提供的,他們會劫持你的原始請求,並將其重定向到克隆的網銀站點,然後,你的所有的隱私數據都曝光在黑客眼下。

嚴格傳輸安全可以解決這個問題。如果你之前使用 HTTPS 訪問過你的網銀,而且網銀的站點支持 HSTS,那麼你的瀏覽器就知道應該只使用 HTTPS,無論你是否輸入了 HTTPS。這樣就防範了中間人劫持攻擊。

注意,如果你之前沒有使用 HTTPS 訪問過該站點,那麼 HSTS 是不奏效的。網站需要通過 HTTPS 協議告訴你的瀏覽器它支持 HSTS。

伺服器開啟 HSTS 的方法是,當客戶端通過HTTPS發出請求時,在伺服器返回的 HTTP 響應頭中包含 Strict-Transport-Security 欄位。非加密傳輸時設置的HSTS欄位無效。

在 Apache2 中設置 HSTS

編輯你的 apache 配置文件(如 /etc/apache2/sites-enabled/website.conf 和 /etc/apache2/httpd.conf ),並加以下行到你的 HTTPS VirtualHost:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

現在你的 web 站點在每次訪問時都會發送該請求頭,失效時間是兩年(秒數)。這個失效時間每次都會設置為兩年後,所以,明天你訪問時,它會設置為明天的兩年後。

你只能在 HTTPS 虛擬機中設置這個頭,而不能設置在 HTTP 虛擬機中。

要將你的訪問者重定向到對應 HTTPS 站點,可使用如下設置:

<VirtualHost *:80>
  [...]
  ServerName example.com
  Redirect permanent / https://example.com/
</VirtualHost>

如果僅僅是做重定向的話,甚至不需要設置 DocumentRoot。

你也可以使用 mod_rewrite 來做重定向,但是上述的方式更簡單更安全。不過,mod_rewrite 可以重定向頁面到對應的 HTTPS 頁面,而上述配置則只重定向到「/」:

<VirtualHost *:80>
  [...]
  <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
  </IfModule>
</VirtualHost>

不要忘記重啟 Apache。

Lighttpd

對於 lighttpd 來說很簡單,將下述配置增加到你的 Lighttpd 配置文件(例如:/etc/lighttpd/lighttpd.conf):

server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload")
}

重啟 Lighttpd。失效時間也是兩年。

Nginx

Nginx 甚至更簡單,將下述行添加到你的 HTTPS 配置的 server 塊中:

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

不要忘記重啟 Nginx。


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理。

    More in:Linux中國

    Linux中國

    捐贈 Let&apos;s Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...