TCP 快速打开:服务器应该定期更改用于生成 TFO cookie 的加密密钥,以防止攻击者随着时间的推移收集大量 cookie 以用于对服务器进行协同攻击。
如何获取默认期限(如果存在)或在 Linux 上设置它?
答案1
据我所知,有两种方法可以在 Linux 中设置 TCP 快速打开键 - 系统范围和每个套接字。
每个插槽
如果应用程序知道 TCP 快速打开,则应用程序可以使用TCP_FASTOPEN
中的选项请求 TCP 快速打开行为setsockopt()
。设置后,如下图所示实施do_tcp_setsockopt
,密钥是通过调用tcp_fastopen_init_key_once()
来自一些随机字节。
据我了解,应用程序可以通过setsockopt()
再次调用来重新生成密钥TCP_FASTOPEN
,或者,也可以通过TCP_FASTOPEN_KEY
使用正确的密钥数据调用来设置特定密钥。您也可以最初这样做,而不是设置TCP_FASTOPEN
。我猜TCP_FASTOPEN_KEY
这对于在单播服务器集群中同步密钥很有用。
全系统
您可以使用 sysctl 可调参数net.ipv4.tcp_fastopen_key
来设置系统范围的 TFO 键,以供不知道 TFO 的进程使用。以下是 Wikimedia 技术 wiki 中关于 TFO 的讨论- 我认为这是用于管理 Wikimedia 服务器的 TFO 支持 - 在它的最后,他们有更新系统 TFO 密钥的示例代码。
概括
在 Linux 中,没有计划轮换 TCP 快速打开密钥 —— 这要么是应用程序的责任,要么是系统管理员必须设置一些东西。
据我所知,如果应用程序支持 TFO,那么就没问题了 - 应用程序负责其使用的任何安全措施,系统管理员无法覆盖这一点。这对我来说很有意义,因为它降低了在自定义软件集群环境中控制和同步 TFO 密钥的成本。
笔记
在 Linux 中,从版本 5.3 开始,有两个 TFO 密钥 - 一个主密钥和一个备份密钥。这样做是为了减少重置密钥的成本 - 每次重置密钥时,前一个密钥都会复制到备份位置,这样如果拥有旧密钥 cookie 的客户端发送 SYN,该数据包仍然有效。因此,如果您想刷新所有客户端上的所有 cookie,则需要设置 TFO 密钥两次。