介绍
fwknop 实现了一种称为单包授权 (SPA) 的授权方案, 用于隐藏服务. SPA 将单个数据包经过加密, 不可重放, 并通过 HMAC 进行身份验证, 以便在传达到隐藏在防火墙后面的服务.
SPA 的主要应用场景是防火墙来过滤一切 SSH 等服务流量, 从而使漏洞的利用 (包括 0day 的和未打补丁) 变得更加困难. 由于没有开放端口, 因此无法使用 Nmap 扫描 SPA 隐藏的任何服务.
fwknop 项目支持四种不同的防火墙: Linux,OpenBSD,FreeBSD 和 Mac OS X 上的 iptables,firewalld,PF 和 ipfw.
SPA 基本上是下一代 Port Knocking(PK), 但在保留其核心优势的同时, 解决了 PK 所表现出的许多限制. PK 局限性包括难以防止重放攻击, 不对称密码和 HMAC 计划, 通常不可能可靠地支持, 这是非常简单的挂载一个 DoS 攻击 PK 服务器通过欺骗一个额外的包成 PK 顺序遍历网络(因此令人信服的 PK 服务器客户端不知道正确的序列). 所有这些缺点都通过 SPA 得到了解决.
同时, SPA 将服务隐藏在默认的 drop 防火墙策略后面, 被动地获取 SPA 数据(通常通过 libpcap 或其他方法), 并为 SPA 包身份验证和加密 / 解密实现标准的加密操作.
由 fwknop 生成的 SPA 数据包利用 HMAC 在加密然后验证模型中进行身份验证加密. 虽然 HMAC 的使用目前是可选的(通过 --use-hmac 命令行开关启用), 但有三个原因强烈建议使用:
如果没有 HMAC, 除非使用 GnuPG, 否则 fwknop 不可能进行加密的强身份验证, 但即使这样, 仍然应该应用 HMAC.
加密后应用的 HMAC 可防止密码分析 CBC 模式填充 oracle 攻击, 例如 Vaudenay 攻击和相关欺骗(如最近的针对 SSL 的 "Lucky 13" 攻击).
wknopd 守护进程验证 HMAC 所需的代码比解密 SPA 包所需的代码要简单得多, 因此没有正确的 HMAC 的 SPA 包甚至不会通过解密例程发送.
上面的最后一个原因是, 即使 SPA 数据包使用 GnuPG 加密, 仍然应该使用 HMAC, 因为 SPA 数据不是通过 libgpgme 函数发送的, 除非 HMAC 首先检出. GnuPG 和 libgpgme 是相对复杂的代码体, 因此限制潜在攻击者通过 HMAC 操作与此代码交互的能力有助于保持更强的安全性. 生成用于 SPA 通信的 HMAC 除了普通加密密钥之外还需要专用密钥, 并且可以使用该 --key-gen 选项生成两者.
fwknop 使用 Rijndael 分组密码或通过 GnuPG 和相关的非对称密码对 SPA 数据包进行加密. 如果选择了对称加密方法, 则通常在客户端和服务器之间共享加密密钥( /etc/fwknop/access.conf 有关详细信息, 请参阅文件). 用于 Rijndael 加密的实际加密密钥是通过标准 PBKDF1 密钥导出算法生成的, 并且设置了 CBC 模式. 如果选择 GnuPG 方法, 则加密密钥从 GnuPG 密钥环导出.
用例
使用单数据包授权 (SPA) 或安全性受到挑战的同类端口 Knocking(PK)的人通常访问在部署 SPA / PK 软件的同一系统上运行的 SSHD. 也就是说, 在主机上运行的防火墙对所有传入的 SSH 连接都有一个默认删除策略, 这样就不能扫描 SSHD, 但是 SPA 守护进程会重新配置防火墙, 暂时授予对被动认证的 SPA 客户机的访问权:
fwknop 支持上述内容, 但也更加牛批, 并且使用 NAT(对于 iptables / firewalld 防火墙). 毕竟, 重要的防火墙通常是网络之间的网关, 而不是仅部署在独立主机上. NAT 通常用于此类防火墙(至少用于 IPv4 通信), 以便为 RFC 1918 地址空间上的内部网络提供 Internet 访问, 并允许外部主机访问内部系统上托管的服务.
由于 fwknop 与 NAT 集成, 因此可以利用 SPA 通过外部 Internet 上的用户通过防火墙访问内部服务. 虽然这在现代传统网络上有很多应用, 但它也允许 fwknop 支持亚马逊的 AWS 等云计算环境:
用户界面
官方跨平台 fwknop 客户端用户界面 fwknop-gui ( 下载 https://incomsystems.biz/fwknop-gui/ , https://github.com/jp-bennett/fwknop-gui )由 Jonathan Bennett 开发. 支持大多数主要的客户端 SPA 模式, 包括 NAT 请求, HMAC 和 Rijndael 密钥(尚不支持 GnuPG),fwknoprc 节点保存等. 目前 fwknop-gui 在 Linux,Mac OS X 和 Windows 上运行.
这是来自 OS X 的截图:
教程
有关 fwknop 的综合教程可以在这里找到:
特征
以下是 fwknop 项目支持的完整功能列表:
1. 在 Linux 上的 iptables 和 firewalld 防火墙,* BSD 和 Mac OS X 上的 ipfw 防火墙以及 OpenBSD 上的 PF 上实现单个数据包授权.
2.fwknop 客户端在 Cygwin 下的 Linux,Mac OS X,* BSD 和 Windows 上运行. 此外, 还有一个 Android 应用程序 https://github.com/jp-bennett/Fwknop2/releases 可以生成 SPA 数据包.
3. 支持 Rijndael 和 GnuPG 方法用于 SPA 数据包的加密 / 解密.
4. 支持 Rijndael 和 GnuPG 的 HMAC 认证加密. 操作顺序是加密 - 然后验证以避免各种密码分析问题.
5. 通过有效传入 SPA 数据包的 SHA-256 摘要比较来检测和阻止重播攻击. 还支持其他摘要算法, 但 SHA-256 是默认算法.
6. 通过 libpcap 从导线上被动地嗅探 SPA 包. fwknopd 服务器还可以从由单独的以太网嗅探器(例如 with tcpdump -w <file> ),iptables ULOG pcap writer 或直接通过 UDP 套接字 --udp-server 模式写入的文件中获取数据包数据.
7. 对于 iptables 防火墙, fwknop 添加的 ACCEPT 规则在自定义 iptables 链中添加和删除(在可配置的超时之后), 以便 fwknop 不会干扰可能已经加载到系统上的任何现有 iptables 策略.
8. 支持经过身份验证的 SPA 通信的入站 NAT 连接(仅适用于 iptables 防火墙). 这意味着可以将 fwknop 配置为创建 DNAT 规则, 以便您可以从开放 Internet 访问 RFC 1918 IP 地址上的内部系统上运行的服务(如 SSH). 还支持 SNAT 规则, 它实质上将 fwknopd 转换为 SPA 验证网关 , 以从内部网络访问 Internet.
9.fwknop 服务器支持多个用户, 并且可以通过 / etc/fwknop/access.conf 文件为每个用户分配自己的对称或非对称加密密钥.
10. 通过 https://www.cipherdyne.org/cgi-bin/myip 自动解析外部 IP 地址 (当从 NAT 设备后面运行 fwknop 客户端时, 这非常有用). 由于外部 IP 地址在此模式下在每个 SPA 数据包内进行加密, 因此中间人 (MITM) 会攻击内联设备拦截 SPA 数据包并仅从其他 IP 转发以获取访问权限受到阻碍.
11.SPA 数据包的目标端口以及通过 iptables NAT 功能建立后续连接的端口支持 端口随机化 . 后者适用于转发到内部服务的连接以及授予运行 fwknopd 的系统上的本地套接字的访问权限.
12. 与 Tor 集成(如本 DefCon 14 演示文稿中所述). 请注意, 由于 Tor 使用 TCP 进行传输, 因此通过 Tor 网络发送 SPA 数据包要求每个 SPA 数据包都通过已建立的 TCP 连接发送, 因此从技术上讲, 这打破了 "单数据包授权" 的 "单一" 方面. 但是, Tor 提供的匿名优势在某些部署中可能超过这一考虑因素.
13. 实现 SPA 通信的版本化协议, 因此很容易扩展协议以提供新的 SPA 消息类型, 同时保持与旧的 fwknop 客户端的向后兼容性.
14. 支持代表有效 SPA 数据包执行 shell 命令.
15.fwknop 服务器可以配置为对入站 SPA 数据包施加多个限制, 超出加密密钥强制执行的限制和重放攻击检测. 即, 包年龄, 源 IP 地址, 远程用户, 对请求端口的访问等.
16. 捆绑了 fwknop 是一个全面的测试套件, 它发布了一系列测试, 旨在验证 fwknop 的客户端和服务器部分是否正常工作. 这些测试涉及通过本地环回接口嗅探 SPA 数据包, 构建临时防火墙规则, 根据测试配置检查相应的访问权限, 并解析来自 fwknop 客户端和 fwknopd 服务器的输出, 以获得每个测试的预期标记. 测试套件输出可以很容易地匿名化, 以便与第三方进行通信以进行分析.
17.fwknop 是第一个将端口敲击与被动操作系统指纹识别相结合的程序. 但是, 单包授权提供了除端口 knocking 之外的许多安全优势, 因此通常不推荐端口 knocking 操作模式.
License
fwknop 项目根据 GNU 通用公共许可证 (GPL v2) 或(根据您的选择) 任何更新版本的条款作为开源软件发布. 最新版本可在 http://www.cipherdyne.org/fwknop/ 找到.
升级
如果您从旧版本的 fwknop 升级(这也包括原始的 perl 实现), 那么您将需要阅读以下链接以确保顺利过渡到 fwknop-2.5 或更高版本:
Building fwknop
此发行版使用 GNU autoconf 来设置构建. INSTALL 有关使用 autoconf 的一般基础知识, 请参阅文件.
有一些特定于 fwknop 的 "配置" 选项. 它们是(从./configure -help 中提取):
- --disable-client Do not build the fwknop client component. The
- default is to build the client.
- --disable-server Do not build the fwknop server component. The
- default is to build the server.
- --with-gpgme support for gpg encryption using libgpgme
- [default=check]
- --with-gpgme-prefix=PFX prefix where GPGME is installed (optional)
- --with-gpg=/path/to/gpg Specify path to the gpg executable that gpgme will
- use [default=check path]
- --with-firewalld=/path/to/firewalld
- Specify path to the firewalld executable
- [default=check path]
- --with-iptables=/path/to/iptables
- Specify path to the iptables executable
- [default=check path]
- --with-ipfw=/path/to/ipfw
- Specify path to the ipfw executable [default=check
- path]
- --with-pf=/path/to/pfctl
- Specify path to the pf executable [default=check
- path]
- --with-ipf=/path/to/ipf Specify path to the ipf executable [default=check
- path]
- Examples:
- ./configure --disable-client --with-firewalld=/bin/firewall-cmd
- ./configure --disable-client --with-iptables=/sbin/iptables --with-firewalld=no
笔记
从 Perl 版本的 fwknop 迁移
对于那些目前正在使用 Perl 版本并计划迁移到此版本的人, 有一些事项需要注意:
1. 并非所有基于 Perl 的 fwknop 的特性和功能都被移植到此实现中. 我们认为保持 C 版本尽可能精简和轻量化非常重要. 大多数省略的功能 / 功能 (如电子邮件警报) 可以通过其他方式完成(即使用外部脚本监视日志文件并根据相应的日志消息发出警报).
2.fwknop 配置和访问文件指令和值存在一些差异. 其中一些是相当微妙的. 您应该特别注意这些文件中的文档和注释.
来源: http://www.tuicool.com/articles/umQrYzb