1 个不稳定版本
0.1.0 | 2023年2月25日 |
---|
#13 在 #来源
在 2 个crate中使用
21KB
330 行
名称
seqknock - 使用TCP序列号提供一种在-band、难以检测的流身份验证方法,类似于端口敲击。
描述
受SilentKnock[1]启发,seqknock将为配置的端口安装防火墙规则,仅允许具有给定序列号的TCP数据包通过本地防火墙。每当观察到有效的序列号时,它就会被无效化以进行进一步的身份验证,并使用连接跟踪允许观察到的流通过。
与SilentKnock不同,该算法是基于时间的,类似于标准的TOTP,包括默认的30秒周期。这一设计决策是为了简化防火墙中的实现,因为与SilentKnock算法相比,它对反应性的需求有限。
端口敲击的优点是不需要打开除服务端口以外的其他端口。它完全依赖于本地防火墙,而本地防火墙应该是一块加固的软件。最后,数据包在很大程度上与“正常”流量不可区分。
基于MAC的序列号生成器的参考实现可在源代码的seqknock-common目录中找到。
用法
对于服务器实现,请参阅seqknock-nftables。对于客户端实现,请参阅seqknock-proxycmd。
限制
连接速率有限。默认设置下,30秒周期,用户需要等待新的序列号轮换后才能重新连接。这可以通过降低周期或通过将容忍度设置为周期的倍数(结合seqknock-proxycmd的--fudge-time参数)来解决重叠周期。对于特定的客户端,如OpenSSH,可以使用控制套接字。务必事先了解任何安全考虑。最后,可以通过为每个用户使用PSK来解决多个用户之间的争用。
仅支持Linux客户端/服务器。此实现严重依赖于Linux特有的功能,例如服务器端的nftables,以及客户端套接字的TCP_REPAIR选项。可以通过仅添加其他防火墙技术的抽象来扩展对其他平台的服务器支持,但客户端支持将更难实现。
客户端需要root权限。遗憾的是,没有其他选项可以使用TCP_REPAIR,除了以CAP_NET_ADMIN能力运行。选项包括通过Unix域套接字提供预先“修复”套接字的服务,但这比较麻烦。
在安全环境中,端口敲击(及其相关序列敲击)的作用存在争议。在正确的范围内,它可能是有用的,例如提供一种低门槛的方式(例如与IPsec相比)来隐藏服务以避免端口扫描工具和服务发现。它不应被视为一种认证方法,而应作为一种在已加密的协议(如SSH或TLS)之上提供一层隐蔽性的手段。
作者
Jonas Eriksson
主页
https://git.sr.ht/~upto/seqknock/
参考文献
[1] https://www-users.cse.umn.edu/~hoppernj/silentknock_esorics.pdf
依赖项
~2–12MB
~118K SLoC