fwknop 实现了一种称为单包授权 (SPA) 的授权方案,用于强大的服务隐藏。SPA 只要求一个数据包,该数据包经过加密、不可重放,并通过 HMAC 进行身份验证,以便向隐藏在默认丢弃过滤规则的防火墙后面的服务传达所需的访问权限。SPA 的主要应用是使用防火墙丢弃所有尝试连接到 SSH 等服务的行为,从而使利用漏洞(包括 0-day 和未打补丁的代码)更加困难。由于没有开放端口,任何通过 SPA 隐藏的服务自然无法被 Nmap 扫描到。fwknop 项目支持四种不同的防火墙:Linux 上的 iptables、firewalld、以及跨 Linux、OpenBSD、FreeBSD 和 Mac OS X 的 PF 和 ipfw。此外还支持自定义脚本,使 fwknop 能够支持其他基础设施,如 ipset 或 nftables。
SPA 本质上是下一代端口敲击 (PK),但在保留其核心优势的同时解决了 PK 的许多限制。PK 的限制包括:通常难以防御重放攻击,通常无法可靠支持非对称密码和 HMAC 方案,并且只需在 PK 序列穿越网络时伪造一个额外的数据包即可轻松对 PK 服务器发起 DoS 攻击(从而让 PK 服务器认为客户端不知道正确的序列)。SPA 解决了所有这些缺点。同时,SPA 将服务隐藏在默认丢弃的防火墙策略之后,被动获取 SPA 数据(通常通过 libpcap 或其他方式),并实现标准的加密操作用于 SPA 数据包的身份验证和加密/解密。
由 fwknop 生成的 SPA 包采用先加密后验证的模式,利用 HMAC 进行认证加密。虽然 HMAC 的使用目前是可选的(通过 --use-hmac 命令行开关启用),但强烈建议使用,原因有三:
最后一点也是为什么即使使用 GnuPG 加密 SPA 包时仍应使用 HMAC 的原因:因为除非先通过 HMAC 检查,否则 SPA 数据不会传递给 libgpgme 函数。GnuPG 和 libgpgme 是相对复杂的代码库,因此通过 HMAC 操作限制潜在攻击者与此代码交互的能力有助于维持更强的安全态势。为 SPA 通信生成 HMAC 需要一个除正常加密密钥之外的专用密钥,两者都可以通过 --key-gen 选项生成。
fwknop 要么使用 Rijndael 分组密码对 SPA 包进行加密,要么使用 GnuPG 及其关联的非对称密码。如果选择对称加密方法,则加密密钥在客户端和服务器之间共享(详见 /etc/fwknop/access.conf 文件)。用于 Rijndael 加密的实际加密密钥是通过标准 PBKDF1 密钥派生算法生成的,并设置 CBC 模式。如果选择 GnuPG 方法,则加密密钥来自 GnuPG 密钥环。
使用单包授权 (SPA) 或其安全性较差的表亲端口敲击 (PK) 的人通常会访问运行在部署了 SPA/PK 软件的同一系统上的 SSHD。也就是说,主机上的防火墙对所有传入的 SSH 连接采用默认丢弃策略,因此 SSHD 无法被扫描,但 SPA 守护进程会重新配置防火墙,暂时授予已验证的 SPA 客户端访问权限:
"使用 SPA 访问 SSHD 的基本用法"
fwknop 支持上述功能,但更进一步,充分利用了 NAT(针对 iptables/firewalld 防火墙)。毕竟,重要的防火墙通常是网络之间的网关,而不仅仅是部署在独立主机上。此类防火墙上通常使用 NAT(至少对于 IPv4 通信)来为处于 RFC 1918 地址空间内的内部网络提供 Internet 访问,同时也允许外部主机访问内部系统上托管的服务。
由于 fwknop 与 NAT 集成,外部 Internet 上的用户可以通过 SPA 经由防火墙访问内部服务。这在现代传统网络中有大量应用,同时 fwknop 也支持云计算环境,例如亚马逊的 AWS:
"在亚马逊 AWS 云环境中的 SPA 使用方式"
官方跨平台 fwknop 客户端用户界面 fwknop-gui(下载,GitHub)由 Jonathan Bennett 开发。支持大多数主要客户端端 SPA 模式,包括 NAT 请求、HMAC 和 Rijndael 密钥(尚不支持 GnuPG)、fwknoprc 配置段保存等。目前 fwknop-gui 可在 Linux、Mac OS X 和 Windows 上运行——以下是 OS X 上的截图:
"Mac OS X 上的 fwknop-gui"
同样,更新的
Android 客户端
也已提供。
关于 fwknop 的全面教程可在此处找到:
http://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html
以下是 fwknop 项目支持的全部功能列表:
tcpdump -w <file>)、iptables ULOG pcap 写入器、或在 --udp-server 模式下直接通过 UDP 套接字获取包数据。fwknop 项目作为开源软件发布,遵循 GNU 通用公共许可证 (GPL v2) 或(由你选择)任何更高版本。最新版本可在以下位置找到: http://www.cipherdyne.org/fwknop/
本 README 文件描述了 fwknop 项目截至 2013 年 7 月 2.5 版本发布时的当前状态。目前,我们实现了防火墙敲击操作库 libfko,以及 fwknop 客户端和服务器应用程序。该库提供了管理 fwknop 其他组件使用的单包授权 (SPA) 数据的 API 和后端功能。其他需要 SPA 功能的程序也可以使用它(参见 perl 目录中的 FKO perl 模块示例,python 目录中也有 python 绑定)。
如果你正在从旧版本的 fwknop(包括最初的 perl 实现)升级,建议阅读以下链接,以确保顺利过渡到 fwknop-2.5 或更高版本:
http://www.cipherdyne.org/fwknop/docs/fwknop-tutorial.html#backwards-compatibility
本发行版使用 GNU autoconf 来设置构建。请参阅 INSTALL 文件了解使用 autoconf 的一般基础知识。
有一些特定于 fwknop 的“configure”选项。它们(摘自 ./configure --help)如下:
--disable-client 不构建 fwknop 客户端组件。默认构建客户端。
--disable-server 不构建 fwknop 服务器组件。默认构建服务器。
--with-gpgme 支持使用 libgpgme 进行 gpg 加密
[默认=检查]
--with-gpgme-prefix=PFX 已安装 GPGME 的前缀(可选)
--with-gpg=/path/to/gpg 指定 gpgme 将使用的 gpg 可执行文件路径
[默认=检查路径]
--with-firewalld=/path/to/firewalld
指定 firewalld 可执行文件路径
[默认=检查路径]
--with-iptables=/path/to/iptables
指定 iptables 可执行文件路径
[默认=检查路径]
--with-ipfw=/path/to/ipfw
指定 ipfw 可执行文件路径 [默认=检查
路径]
--with-pf=/path/to/pfctl
指定 pf 可执行文件路径 [默认=检查
路径]
--with-ipf=/path/to/ipf
指定 ipf 可执行文件路径 [默认=检查
路径]
示例:
./configure --disable-client --with-firewalld=/bin/firewall-cmd
./configure --disable-client --with-iptables=/sbin/iptables --with-firewalld=no
如果你当前正在使用 Perl 版本并计划迁移到此版本,需要注意以下几点:
并非所有基于 Perl 的 fwknop 的功能特性都被移植到此实现中。我们认为保持 C 版本尽可能精简轻量很重要。大部分被省略的功能(如电子邮件警报)可以通过其他方式实现(例如,使用外部脚本监控日志文件并根据适当的日志消息发出警报)。
fwknop 配置和访问文件的指令和值存在一些差异。其中一些差异相当细微。你应该仔细阅读那些文件中的文档和注释。
如果你从 git 拉取此发行版,应运行 autogen.sh 脚本来生成 autoconf 文件。如果出现关于缺少目录或文件的错误,请尝试再次运行 autogen.sh。之后,当你想要重新生成配置时,可以运行 autoreconf -i。如果由于某些原因 autoreconf 无法正常工作,autogen.sh 脚本应该足够了。
fwknop 和 fwknopd 手册页的 nroff 源文件分别位于其各自的目录(client 和 server)中。这些 nroff 文件源自 'docs' 目录中的 asciidoc 源文件。详情请参阅 docs 中的 README。