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、微信、米聊等软件来看,它们都没有采用端到端加密,估计就是因为这个吧。


本文链接:http://www.servercoder.com/2018/05/17/tcp-safe/