一文帶你瞭解中間人攻擊和HSTS

本文整理自HSTS學習筆記HSTS詳解什麼是中間人攻擊?如何避免?這三篇的文章java

1.中間人攻擊

「中間人攻擊(MiTM)」就是當數據離開一個端點前往另外一個端點時,傳輸的期間即是對數據失去控制的時候。當一個攻擊者將本身置於兩個端點並試圖截獲或阻礙數據傳輸時,便稱爲中間人(MiTM)攻擊。web

攻擊手段

談及MiTM時,並非只有一種方式能夠形成損害——答案是四種!通常說來,有嗅探、數據包注入、會話劫持和SSL剝離。apache

  • 嗅探:嗅探或數據包嗅探是一種用於捕獲流進和流出系統/網絡的數據包的技術。網絡中的數據包嗅探就好像電話中的監聽。記住,若是使用正確,數據包嗅探是合法的;許多公司出於「安全目的」都會使用它。瀏覽器

  • 數據包注入:在這種技術中,攻擊者會將惡意數據包注入常規數據中。這樣用戶便不會注意到文件/惡意軟件,由於它們是合法通信流的一部分。在中間人攻擊和拒絕式攻擊中,這些文件是很常見的。安全

  • 會話劫持:你曾經遇到過「會話超時」錯誤嗎?若是你進行過網上支付或填寫過一個表格,你應該知道它們。在你登陸進你的銀行帳戶和退出登陸這一段期間便稱爲一個會話。這些會話一般都是黑客的攻擊目標,由於它們包含潛在的重要信息。在大多數案例中,黑客會潛伏在會話中,並最終控制它。這些攻擊的執行方式有多種。服務器

  • SSL剝離:SSL剝離或SSL降級攻擊是MiTM攻擊的一種十分罕見的方式,可是也是最危險的一種。衆所周知,SSL/TLS證書經過加密保護着咱們的通信安全。在SSL剝離攻擊中,攻擊者使SSL/TLS鏈接剝落,隨之協議便從安全的HTTPS變成了不安全的HTTP,從而截獲用戶的傳輸內容。網絡

2.HSTS

2.1什麼是HSTS

HSTS(HTTP Strict Transport Security) 是一種Web安全協議,它的做用是在本地強制客戶端(如瀏覽器)使用HTTPS與服務器建立鏈接。服務器開啓HSTS的方法是,當客戶端經過HTTPS發出請求時,在服務器返回的超文本傳輸協議響應頭中包含STS(Strict-Transport-Security)字段。dom

2.2響應頭各個參數的意義

語法規則工具

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
複製代碼

各個參數的意義學習

  • max-age:它是必選參數,是一個以秒爲單位的數值,它表明着HSTS Header的過時時間,一般設置爲1年,即31536000秒。
  • includeSubDomains是可選參數,若是包含它,則意味着當前域名及其子域名均開啓HSTS保護
  • preload是可選參數,表示使用瀏覽器預載的HSTS地址列表,其中,HSTS預載列表preload list由Google維護,Chrome/ Firefox/ Safari等瀏覽器支持預加載的HSTS,避免第一次訪問時沒法用HSTS創建HTTPS鏈接的問題,若是某個網站成功提交了加入preload列表的申請,那麼它的地址就會出如今這個列表中,只有當你申請將本身的域名加入到瀏覽器內置列表的時候才須要使用到它

2.3原理與做用過程

2.3.1網址不在preload列表中的狀況

  • 在服務器端設置響應頭,添加Strict-Transport-Security,並設置max-age等參數;
  • 用戶第一次訪問時,服務器把含有STS的響應頭髮給客戶端(瀏覽器);
  • 下次瀏覽器若是使用HTTP訪問該網址,只要max-age未過時,瀏覽器內部會進行307跳轉,直接HTTPS訪問服務器。

2.3.2 網址存在preload列表中的狀況

  • 在服務器端設置響應頭,添加Strict-Transport-Security,並設置max-age等參數;
  • 瀏覽器若是使用HTTP訪問該網址,只要max-age未過時,瀏覽器內部會進行307跳轉,直接HTTPS訪問服務器。

所以,若是使用了HSTS,就能防止第一次80請求出問題,它的作法就是不通過網絡而是直接在瀏覽器內部改寫地址和請求方式。對應於以前的例子,就至關於你一開始就擁有了一隻神奇的筆,用它寫下來的文字只有你和銀行才能看得懂,我卻看不懂。而我拿着這些文字信息到銀行後只能換一個保險櫃,保險櫃的密碼只有你和銀行知道,所以我也拿不到裏面的錢。所以,HSTS有助於安全性的提高。

3.能解決的問題

3.1三個威脅

HSTS主要針對如下三個威脅:

  • 用戶書籤中的連接或者手動輸入的地址是example.com,而後瀏覽器以HTTP方式訪問。這種方式可能遭遇中間人劫持;
  • HTTPS頁面的連接無心中包含HTTP,這個HTTP頁面可能被中間人劫持;
  • 在傳輸過程當中可能會被攔截流量,而瀏覽器顯示證書錯誤連接不安全時用戶可能點擊繼續訪問不安全的連接。

3.2 解決方案

HSTS針對以上三個威脅的解決方案:

  • 支持HSTS的瀏覽器直接內部重定向,用HTTPS取代HTTP訪問目標域名;
  • 第二點同上;
  • 在證書錯誤的時候沒有目標頁的連接入口,用戶不能忽略瀏覽器警告繼續訪問網站。

如前所述,若沒有使用HSTS,雖然會出現安全警告,可是仍可選擇繼續不安全的鏈接。而若是使用了HSTS,則沒法繼續不安全的連接。

3.3 節省時間和資源

利用HSTS,還能夠節省一次302/301跳轉請求。若是瀏覽器已經記住對應網址的HSTS規則,每次對其進行http訪問時,都會在瀏覽器內部直接307跳轉到https,不用先80到服務器而後再被告知443端口訪問,節省資源和時間。

最後,使用HSTS的優勢是能夠強制客戶端使用HTTPS訪問頁面,避免中間人劫持;免去一次302/301的跳轉請求,直接進行HTTPS鏈接,節省時間和資源。更加安全和高效。可是它也存在一些缺點:

  • 沒法處理純IP的請求,也即若是在地址欄輸入http://2.2.2.2,即使響應頭中設置了STS,瀏覽器也不會處理。(參考資料中未設置,可是用百度的IP不會創建HTTPS鏈接,而若是用淘寶網首頁的IP會顯示501錯誤);
  • 由於HSTS只能在80和443端口之間切換,若是服務是8080端口,即使設置了STS,也無效;
  • 若是瀏覽器證書錯誤,通常狀況會提醒存在安全風險,然是依然給一個連接進入目標頁,而 HSTS 則沒有目標頁入口,因此一旦證書配置錯誤,會致使根本沒法訪問,用戶體驗不好;
  • 若是服務器的HTTPS沒有配置好就開啓了STS的響應頭,而且還設置了很長的過時時間,那麼在你服務器HTTPS配置好以前,用戶都是沒辦法鏈接到你的服務器的,除非max-age過時了。

4.配置服務器

4.1 Apache2

修改配置文件,如/etc/apache2/sites-enabled/websites.conf和/etc/apache2/httpd.conf,在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;"
</VirtualHost>
複製代碼

4.2 Lighttpd

修改配置文件,如/etc/lighttpd/lighttpd.conf,而後重啓Lighttpd便可:

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

4.3 Nginx

將如下內容添加到https的配置文件中便可:

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; ";
複製代碼

5.初步測試

利用Chrome的開發者工具,分別對

進行實驗,能夠發現taobao, douban, google已經開始使用HSTS,並且在輸入上面網址的時候能夠看到307狀態碼,在瀏覽器內部切換到https進行訪問。而訪問http://www.baidu.com的時候,仍是隻有302,屢次訪問仍舊如此,說明百度首頁尚未使用HSTS,還是先80端口訪問而後服務器再返回302告訴瀏覽器要用443端口進行https訪問。

相關文章
相關標籤/搜索