tcp通信應用的安全如何保證

只要是網絡通信,就必須要考慮網絡安全,本文主要闡述的是TCP通信業務有可能遇到的問題和解決辦法,http在通信層面的安全與tcp類似,但是業務層面的的安全要考慮的問題就太多了,比如session劫持、sql注入、xss攻擊等等,這一塊和udp的業務安全後續再單獨總結。

網絡攻擊和防禦

1. 傳輸層截獲、篡改、偽造

防禦:tls

我們談論網絡安全的時候,常常會從如下四種問題考慮:

  1. 中斷。攻擊者有意中斷他人的網絡通信。
  2. 截獲。攻擊者非法竊取他人正在通信的內容。
  3. 篡改。攻擊者惡意篡改他人正在通信的內容。
  4. 偽造。攻擊者偽造信息在網絡上傳輸。比如常見的重放攻擊,摘要算法擋不住重放攻擊。

對於中斷類的攻擊,大多都是從傳輸層中斷,最終的目的是該連接無法正常通信。對於客户端和服務端來説,都無法輕易感知,因而大多中斷類型的問題,都無法有效防範和解決。

對於截獲、篡改、偽造來説,tls是最好的解決辦法。tls的安全目標主要包括如下幾個:

  • 認證性 – 數字簽名防止偽造。
  • 機密性 – 所有數據都基於證書中的公鑰加密,是不堆成加密的一部分。
  • 完整性 – 藉助消息認證碼(MAC)保障數據完整性,防止消息篡改。
  • 重放保護 – 通過使用隱式串行號防止重放攻擊。

值得注意的是,tls有多個版本,tls1.0,tls1.1,tls1.2,安全起見,建議總是優先使用最新版本。

tls置於反向代理nginx處,還是業務服務器處?

如果條件允許,建議直接置於反向代理處,避免每台業務服務器都單獨配置證書。但這帶來了其他問題,tls的完整性沒法得到保障,因為反向代理到業務服務器的通信是tcp的了,需自行考慮數據完整性校驗;其次是業務服務器(不考慮接入層)最好是無狀態可任意調度的,不然得為每台服務器單獨配置nginx的端口。

2. tls中間人攻擊

防禦:客户端內置證書、瀏覽器自行辨別。

上面提到了很多tls的好處,https也類似。但這並不意味着tls就是萬能的了,因為我們還需要保證tls證書的安全。

路由器、網關、DNS服務器都可以幹這個事情,它們將原先的請求轉發給偽造方,並將偽造方的證書放回給客户端,同時假裝自己是客户端與真正的服務器通信。

對於chrome瀏覽器而言,它內置了信任的根證書機構。默認認為只有根證書頒發的證書,同時該證書頒發給該域名的,才是安全的。任何自己生成的,或是第三方機構生成的證書,它都認為不安全,比如12306。遇到這種情況,只能由用户自己辨別,還好chrome已經強制將非https和證書不對的網站標記為不安全了。

而對於app而言,並不能很直觀地查看網址是否安全,但我們可以提前將證書打包進app,每次創建連接時與服務器的證書比對一下,也能儘可能防禦tls的中間人攻擊。不過,app需要提前開發證書更新的接口。

app內置證書其實也並不是完美的,因為app能被人反編譯,也就以為着打包的證書可以被篡改。

3. ddos攻擊

防禦:防火牆配置

dos即deny of service,d-dos即distributed deny of service,也叫洪水攻擊。通俗的講,就是發動大量的設備或併發請求,消耗掉服務器的帶寬或資源,導致服務器不再接受服務。

如果沒有處理這些問題的經驗,就把問題丟給阿里雲吧,阿里雲的服務能搞定大部分的問題。同時我們的應用進程要做好隔離、快速上下線的能力。

4. syn攻擊

防禦:配置tcp相關的系統參數。

準確的説,syn攻擊也屬於ddos攻擊的一部分。操作起來,就是同一時間發動大量的tcp的syn請求,使得服務器中有大量的tcp處於半連接的狀態。此時每個連接都要消耗一個TCB(傳輸控制塊)的內存,同時還需要sync ack重傳消耗cpu和網絡資源。

解決辦法就是配置防火牆,同時修改syn_recv隊列、限制syn鬢髮、減少sync-ack的重發。

具體的解決辦法參見 Linux安全之SYN攻擊原理及處理

5. RST 和 FIN 攻擊

防禦:防火牆配置

如果FIN/RST 報文速率超過閾值會啟動會話檢查,當清洗設備檢查到FIN/RST報文沒有命中會話,則直接丟棄。

如果清洗設備檢查到FIN/RST報文命中會話,則檢查會話創建的原因,如果會話是由SYN或者SYN-ACK創建的,則允許報文通過,如果會話是由其他報文創建的(如ACK報文)則查看報文的串行號,若正確則放行,否則丟棄。

6. 服務端數據安全

防禦: 端到端加密

前面一直討論的是客户端與服務端通信時的安全,可還有一種情況,服務提供商可隨意查閲信息,比如qq。要想解決這個問題,端到端加密是目前唯一的解決辦法,客户端自行交換公鑰。

但網絡安全法第21條似乎不太允許國內運營商這樣做,它要求服務端需要保存相應的日誌、信息等。儘管沒有明確説明所有數據後台可查詢,但從qq、微信、米聊等軟件來看,它們都沒有采用端到端加密,估計就是因為這個吧。