29、深入了解fwknop:功能、配置与安全应用

fwknop安全配置与应用详解

深入了解fwknop:功能、配置与安全应用

1. fwknop与iptables规则

fwknop的规则操作不会与iptables策略中的现有规则冲突。在30秒计时器到期之前,可在fwknop服务器上执行以下命令查看授予对SSHD访问权限的iptables规则:

[root@spaserver ~]# fwknopd --fw-list
[+] Listing chains from IPT_AUTO_CHAIN keywords...
Chain FWKNOP_INPUT (1 references)
pkts bytes target prot opt in out source destination
11 812 ACCEPT tcp -- * * 204.23.X.X 0.0.0.0/0 tcp dpt:22

在这个例子中,fwknop服务器重新配置了iptables,允许在30秒内访问SSHD,之后fwknopd会从FWKNOP_INPUT链中删除ACCEPT规则。即便大多数SSH连接持续时间超过30秒,但只要使用Netfilter连接跟踪功能,就能让客户端和服务器之间已建立的TCP连接保持打开状态,可执行以下命令:

[root@spaserver ~]# iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
2. 通过非对称加密实现SPA

在密码学领域,密钥交换是核心问题,公钥密码系统提供了新颖的解决方案。与对称密码体制不同,对称密码体制中密钥必须在不安全的信道上以明文形式在双方之间共享,而非对称密码体制依赖于人们主动发布公钥/私钥对中的公钥部分。例如,当A使用B的公钥加密数据时,只有B能通过结合公钥和私钥的操作来解密密文。这种操作基于一个数学难题,若没有同时访问公钥和私钥,求解该难题的计算成本极高。

3. fwknop的GnuPG密钥交换

要在fwknop中使用GnuPG密钥,需将服务器的公钥创建并导入到客户端的密钥环中,反之亦然。由于客户端密钥的解密密码不会存储在文件中,所以在fwknop客户端使用任何GnuPG密钥都是安全的。以下是生成新的客户端和服务器密钥并导入的步骤:
- 客户端生成密钥

[mbr@spaclient ~]$ gpg --gen-key
gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc.
Please select what kind of key you want:
   (1) DSA and Elgamal (default)
   (2) DSA (sign only)
   (5) RSA (sign only)
Your selection? 1
DSA keypair will have 1024 bits.
ELG - E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
Real name: Michael Rash
Email address: mbr@cipherdyne.org
Comment: Linux Firewalls fwknop_client key
You selected this USER - ID:
    "Michael Rash (Linux Firewalls fwknop_client key) <mbr@cipherdyne.org>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a passphrase to protect your secret key.
Enter passphrase:
  • 查看客户端密钥
[mbr@spaclient ~]$ gpg --list - keys "fwknop_client"
pub   1024D/AB743C36 2007 - 10 - 18
uid                  Michael Rash (Linux Firewalls fwknop_client key) <mbr@cipherdyne.org>
sub   2048g/1035BC5C 2007 - 10 - 18

由于使用4096位Elgamal密钥加密的SPA消息的密文数据长度通常会超过以太网网络的1500字节MTU,所以选择2048位的密钥长度。
- 导出客户端公钥到文件

[mbr@spaclient ~]$ gpg -a --export - key "fwknop_client" > fwknop_client.asc
  • 服务器端生成并导出密钥
[root@spaserver ~]# gpg --gen - key
[root@spaserver ~]# gpg --list - keys "fwknop_server"
pub   1024D/25801B3A 2007 - 10 - 18
uid                  Michael Rash (Linux Firewalls fwknop_server key) <mbr@cipherdyne.org>
sub   2048g/39E2FDC6 2007 - 10 - 18
[root@spaserver ~]# gpg -a --export "fwknop_server" > fwknop_server.asc
  • 传输、导入和签名公钥
[mbr@spaclient ~]$ scp fwknop_client.asc root@spaserver:
Password: 
[mbr@spaclient ~]$ scp root@spaserver:fwknop_server.asc .
Password:
[mbr@spaclient ~]$ gpg --import fwknop_server.asc
gpg: key 25801B3A: public key "Michael Rash (Linux Firewalls fwknop server key) <mbr@cipherdyne.org>" imported
gpg: Total number processed: 1
gpg:               imported: 1
[mbr@spaclient ~]$ gpg --default - key "fwknop_client" --sign - key "fwknop_server"
[mbr@spaclient ~]$ ssh -l root spaserver
Password:
[root@spaserver ~]# gpg --import fwknop_client.asc
gpg: key AB743C36: public key "Michael Rash (Linux Firewalls fwknop client key) <mbr@cipherdyne.org>" imported
gpg: Total number processed: 1
gpg:               imported: 1
[root@spaserver ~]# gpg --default - key "fwknop_server" --sign - key "fwknop_client"
4. 使用GnuPG密钥运行fwknop

当GnuPG密钥在fwknop客户端和服务器的密钥环中都已导入并签名后,就可以使用GnuPG运行fwknop了。首先,fwknop服务器上的access.conf文件必须包含正确的GnuPG访问定义:

[root@spaserver ~]# cat /etc/fwknop/access.conf
SOURCE: ANY;
OPEN_PORTS: tcp/22;
REQUIRE_USERNAME: mbr;
GPG_HOME_DIR: /root/.gnupg;
GPG_DECRYPT_ID: fwknop_server;
GPG_DECRYPT_PW: GPGdecryptpw;
GPG_REMOTE_ID: fwknop_client;
FW_ACCESS_TIMEOUT: 30;

接着,部署iptables以关闭对SSHD的访问,并启动fwknop:

[root@spaserver ~]# iptables -I INPUT 1 -p tcp --dport 22 -j DROP
[root@spaserver ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@spaserver ~]# /etc/init.d/fwknop start
Starting fwknop ... [ ok ]

从客户端系统可以使用Netcat检查SSHD是否确实无法访问,并使用fwknop通过iptables获得访问权限:

[mbr@spaclient ~]$ nc -v spaserver 22
[mbr@spaclient ~]$ fwknop -A tcp/22 --gpg - recip "fwknop_server" --gpg - sign "fwknop_client" -R -k spaserver
[mbr@spaclient ~]$ ssh -l root spaserver
Password:
[root@spaserver ~]#

与fwknop使用Rijndael对称密码时一样,fwknop服务器会向syslog写入多条消息。此次有新信息表明GnuPG加密的SPA消息是由access.conf中GPG_REMOTE_ID变量定义的所需密钥ID签名的。通常,会添加一条iptables ACCEPT规则,并在30秒后删除:

Oct 18 15:48:07 spaserver fwknopd: received valid GnuPG encrypted packet (signed with required key ID: "fwknop_client") from: 204.23.X.X, remote user: mbr
Oct 18 15:48:07 spaserver fwknopd: adding FWKNOP_INPUT ACCEPT rule for 204.23.X.X -> tcp/22 (30 seconds)
Oct 18 15:48:08 spaserver knoptm: removed iptables FWKNOP_INPUT ACCEPT rule for 204.23.X.X -> tcp/22, 30 second timeout exceeded
5. 检测和阻止重放攻击

到目前为止,我们看到了fwknop在减少SSHD攻击面方面的合法应用。当SPA数据包在不可信网络中传输时,任何能在网络上监视该数据包的人都可以保存、分析并重放它。fwknop的SPA实现通过比较传入SPA消息的MD5总和,非常适合阻止重放攻击,以下是一个具体示例:

graph LR
    A[spaclient] -->|发送SPA数据包| B[spaserver]
    C[Attacker] -->|捕获数据包| B
    C -->|重放数据包| B

以下是实现SPA数据包重放的命令序列:
- 客户端发送有效SPA数据包:

[mbr@spaclient ~]$ fwknop -L spaserver
[+] Running with last command - line args: -A tcp/22 --gpg - recip fwknop_server --gpg - sign fwknop_client -R -k spaserver
[+] Starting fwknop in client mode.
[+] Resolving hostname: spaserver
    Resolving external IP via: http://www.whatismyip.com/
    Got external address: 204.23.X.X
[+] Enter the GnuPG password for signing key: fwknop_client
GnuPG signing password:
  • 攻击者捕获数据包:
[root@attacker ~]# tcpdump -i eth0 -l -nn -s 0 udp port 62201 -w spa.pcap
[root@attacker ~]# tcpdump -l -nn -X -r spa.pcap | head
  • 攻击者重放数据包:
[root@attacker ~]# tcpreplay -i eth0 spa.pcap
  • 攻击者尝试连接SSH服务器:
[root@attacker ~]# ssh -l root 71.157.X.X
  • fwknop服务器检测到重放数据包:
Oct 18 23:32:50 spaserver fwknopd: attempted message replay from: 204.23.X.X

fwknop检测到重放的SPA数据包,iptables策略不会授予攻击者任何访问权限,并且fwknop还会发送电子邮件警报,以强调之前的SPA数据包被重放这一异常情况。

6. 伪造SPA数据包源地址

SPA协议支持伪造源IP地址,这是由两个因素导致的:一是fwknop服务器能够从SPA数据包有效负载中获取真实源地址;二是SPA数据包默认通过UDP传输,不期望有返回流量。
fwknop使用Perl Net::RawIP模块通过原始套接字发送SPA数据包,这允许从fwknop客户端命令行将源IP地址设置为任意值(需要root权限)。以下是客户端发送伪造源地址的SPA数据包的命令:

[root@spaclient ~]# fwknop --Spoof - src 207.132.X.X -A tcp/22 --gpg - home - dir /home/mbr/.gnupg --Spoof - user mbr --gpg - recip "fwknop_server" --gpg - sign "fwknop_client" --quiet -R -k spaserver
GnuPG signing password:

syslog消息表明,fwknop服务器嗅探到SPA数据包,该数据包看似来自伪造的源IP地址207.132.X.X,但实际上授予访问SSHD权限的是加密数据包中包含的真实fwknop客户端IP地址204.23.X.X:

Oct 18 23:31:37 spaserver fwknopd: received valid GnuPG encrypted packet (signed with required key ID: "fwknop_client") from: 207.132.X.X, remote user: mbr
Oct 18 23:31:37 spaserver fwknopd: adding FWKNOP_INPUT ACCEPT rule for 204.23.X.X -> tcp/22 (30 seconds)
7. fwknop与OpenSSH集成补丁

fwknop项目旨在让SPA的使用尽可能简单和用户友好,与各种客户端应用程序无缝集成有助于减轻用户负担。由于SPA最常见的应用是保护SSH通信,fwknop提供了针对OpenSSH源代码的补丁,可直接从OpenSSH客户端命令行执行fwknop客户端。要实现这一点,需先将补丁应用到OpenSSH源代码并重新编译,以OpenSSH - 4.3p2版本为例,假设源代码位于/usr/local/src,操作步骤如下:

$ cd /usr/local/src/openssh - 4.3p2
$ wget http://www.cipherdyne.org/LinuxFirewalls/ch13/openssh - 4.3p2_SPA.patch
$ patch -p1 < openssh - 4.3p2_SPA.patch
patching file config.h.in
patching file configure
patching file configure.ac
patching file ssh.c
$ ./configure --prefix --with - spa - mode && make   
$ su -
Password:
# cd /usr/local/src/openssh - 4.3p2
# make install

上述命令中,configure脚本的–with - spa - mode参数确保在编译OpenSSH时包含SPA补丁代码。
安装修改后的SSH客户端后,可直接从SSH命令行调用fwknop客户端,无需在使用SSH建立连接前手动运行fwknop。补丁为SSH添加了新的命令行参数 -K fwknop args,可按以下方式使用该参数访问spaserver系统:

[mbr@spaclient ~]$ ssh -K "--gpg - recip ABCD1234 --gpg - sign DEFG5678 -A tcp/22 -R -k spaserver" mbr@spaserver
GnuPG signing password:
Password:
Last login: Wed Oct 17 15:48:19 2007 from spaclient
[mbr@spaserver ~]$

fwknop服务器端熟悉的日志消息表明已收到SPA数据包,并且该数据包通过了检查(即使用所需的密钥ID进行加密,且未在网络上被重放):

Oct 17 15:53:39 spaserver fwknopd: received valid GnuPG encrypted packet (signed with required key ID: A742839F) from: 204.23.X.X, remote user: mbr
Oct 17 15:53:39 spaserver fwknopd: adding FWKNOP_INPUT ACCEPT rule for 204.23.X.X -> tcp/22 (30 seconds)

新的SSH -K选项将其参数传递给fwknop命令行,因此fwknop提供的所有功能都可通过SSH命令行使用,包括 -L host参数,该参数允许重复使用之前针对同一主机使用过的fwknop命令行选项,以下命令是可行的:

ssh -K "-L host" user@host
8. 通过Tor传输SPA

洋葱路由器(Tor)是一个由全球分散的节点(称为洋葱路由器)组成的匿名网络(详见http://tor.eff.org)。Tor网络旨在强化基于TCP的服务,抵御一种名为流量分析的互联网监控手段。流量分析用于确定互联网上谁在与谁通信,任何能够访问互联网流量的组织(尤其是ISP)都能轻易部署这种分析方法。即使是加密的应用程序流量也容易受到流量分析的影响,因为IP地址是以明文形式传输的。
Tor的工作原理是为每个TCP连接在路由器云中建立一条单独的虚拟电路,该虚拟电路在入口路由器和随机选择的出口路由器之间建立。每条电路都是唯一的,电路中的每个跳点只知道流量的来源和去向。此外,当流量在路由器云中时会被加密。最终结果是,客户端可以通过这条虚拟电路在开放的互联网上与服务器通信,任何能够监控进入或离开路由器云的流量的第三方,看到的IP地址之间的通信看起来毫无关联。
通过Tor网络发送SPA数据包有明显好处,它增强了fwknop的服务隐藏特性,使在服务器端更难确定是否正在使用SPA。然而,存在一个问题:Tor使用TCP进行传输,这意味着Tor与SPA不兼容,因为SPA数据包默认通过UDP传输。尽管fwknop支持通过盲TCP ACK数据包发送SPA数据包,但这不足以让SPA数据包穿越Tor网络。只有在与入口路由器的初始TCP连接完全建立后,才能通过Tor创建虚拟电路,这意味着需要双向通信。
fwknop通过打破SPA的单包特性,将SPA数据包通过与fwknop_serv守护进程建立的完全TCP连接发送,解决了这个问题。该守护进程生成一个最小的TCP服务器,以nobody用户身份运行,在TCP端口62201上执行bind()和listen()操作,然后循环调用accept()。每次调用accept()时,会执行一次recv()操作。

深入了解fwknop:功能、配置与安全应用

9. 总结与操作要点回顾

为了更清晰地理解和使用fwknop,下面对前面提到的关键操作和要点进行总结:
| 操作类型 | 操作步骤 | 关键命令 |
| — | — | — |
| 查看iptables规则 | 在30秒计时器到期前,在fwknop服务器上执行 | fwknopd --fw-list |
| 生成客户端GnuPG密钥 | 按照提示选择密钥类型、长度、有效期等信息 | gpg --gen-key |
| 查看客户端密钥 | 列出指定名称的密钥信息 | gpg --list-keys "fwknop_client" |
| 导出客户端公钥 | 将客户端公钥导出到文件 | gpg -a --export-key "fwknop_client" > fwknop_client.asc |
| 生成服务器GnuPG密钥 | 与客户端类似,完成服务器密钥生成 | gpg --gen-key |
| 查看服务器密钥 | 列出指定名称的服务器密钥信息 | gpg --list-keys "fwknop_server" |
| 导出服务器公钥 | 将服务器公钥导出到文件 | gpg -a --export "fwknop_server" > fwknop_server.asc |
| 传输公钥 | 使用scp命令在客户端和服务器之间传输公钥 | scp fwknop_client.asc root@spaserver:
scp root@spaserver:fwknop_server.asc . |
| 导入和签名公钥 | 在客户端和服务器上分别导入对方公钥并签名 | gpg --import fwknop_server.asc
gpg --default-key "fwknop_client" --sign-key "fwknop_server"
gpg --import fwknop_client.asc
gpg --default-key "fwknop_server" --sign-key "fwknop_client" |
| 配置access.conf文件 | 在fwknop服务器上设置GnuPG访问定义 | cat /etc/fwknop/access.conf |
| 部署iptables规则 | 关闭对SSHD的访问并允许已建立和相关的连接 | iptables -I INPUT 1 -p tcp --dport 22 -j DROP
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
| 启动fwknop服务 | 在fwknop服务器上启动服务 | /etc/init.d/fwknop start |
| 客户端获取访问权限 | 使用Netcat检查,使用fwknop获取访问并通过SSH连接 | nc -v spaserver 22
fwknop -A tcp/22 --gpg-recip "fwknop_server" --gpg-sign "fwknop_client" -R -k spaserver
ssh -l root spaserver |
| 重放攻击检测示例 | 攻击者捕获和重放数据包,fwknop服务器检测 | tcpdump -i eth0 -l -nn -s 0 udp port 62201 -w spa.pcap
tcpreplay -i eth0 spa.pcap
ssh -l root 71.157.X.X |
| 伪造源地址发送数据包 | 在客户端设置伪造源地址发送SPA数据包 | fwknop --Spoof-src 207.132.X.X -A tcp/22 --gpg-home-dir /home/mbr/.gnupg --Spoof-user mbr --gpg-recip "fwknop_server" --gpg-sign "fwknop_client" --quiet -R -k spaserver |
| 应用OpenSSH集成补丁 | 下载补丁,应用到OpenSSH源代码并编译安装 | wget http://www.cipherdyne.org/LinuxFirewalls/ch13/openssh-4.3p2_SPA.patch
patch -p1 < openssh-4.3p2_SPA.patch
./configure --prefix --with-spa-mode && make
make install |
| 使用集成补丁后的SSH | 直接从SSH命令行调用fwknop客户端 | ssh -K "--gpg-recip ABCD1234 --gpg-sign DEFG5678 -A tcp/22 -R -k spaserver" mbr@spaserver |

10. 实际应用中的注意事项

在实际使用fwknop时,还需要注意以下几点:
- 密钥管理
- 确保客户端和服务器的GnuPG密钥安全存储,避免密钥泄露。定期更换密钥,以提高安全性。
- 对于密钥的生成、导出、传输、导入和签名等操作,要严格按照步骤执行,确保密钥的正确性和完整性。
- 防火墙配置
- 在部署iptables规则时,要仔细检查规则的设置,避免误操作导致网络访问异常。
- 考虑到不同网络环境的需求,可以根据实际情况调整规则,例如允许特定IP地址或网段的访问。
- 重放攻击防范
- 虽然fwknop能够检测重放攻击,但仍要注意网络环境的安全性,避免攻击者有机会捕获和重放数据包。
- 可以结合其他安全措施,如入侵检测系统(IDS)或入侵防御系统(IPS),进一步增强网络的安全性。
- Tor传输
- 在使用Tor传输SPA数据包时,要确保fwknop_serv守护进程正常运行,并且相关的TCP端口(如62201)未被防火墙阻止。
- 由于Tor网络的复杂性,可能会出现连接不稳定或延迟较高的情况,需要根据实际需求进行评估和调整。

11. 操作流程总结

为了更直观地展示fwknop的使用流程,下面是一个mermaid格式的流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(生成GnuPG密钥):::process
    B --> C(导出公钥):::process
    C --> D(传输公钥):::process
    D --> E(导入和签名公钥):::process
    E --> F(配置access.conf文件):::process
    F --> G(部署iptables规则):::process
    G --> H(启动fwknop服务):::process
    H --> I{客户端操作}:::decision
    I -->|获取访问权限| J(使用Netcat检查):::process
    J --> K(使用fwknop获取访问):::process
    K --> L(通过SSH连接):::process
    I -->|重放攻击检测示例| M(攻击者捕获数据包):::process
    M --> N(攻击者重放数据包):::process
    N --> O(fwknop服务器检测):::process
    I -->|伪造源地址发送数据包| P(客户端设置伪造源地址):::process
    P --> Q(发送SPA数据包):::process
    I -->|应用OpenSSH集成补丁| R(下载补丁):::process
    R --> S(应用补丁到OpenSSH源代码):::process
    S --> T(编译安装):::process
    T --> U(使用集成补丁后的SSH):::process
    I -->|通过Tor传输SPA| V(启动fwknop_serv守护进程):::process
    V --> W(建立TCP连接):::process
    W --> X(发送SPA数据包):::process
    L --> Y([结束]):::startend
    O --> Y
    Q --> Y
    U --> Y
    X --> Y
12. 结论

fwknop是一个强大的工具,通过与iptables、GnuPG、OpenSSH等技术的结合,为SSH服务提供了有效的安全防护。它能够减少SSHD的攻击面,抵御重放攻击,支持伪造源地址发送数据包,并通过Tor网络增强服务的隐藏性。在实际应用中,只要按照正确的步骤进行配置和操作,注意密钥管理、防火墙配置等方面的问题,就可以充分发挥fwknop的优势,提高网络的安全性。同时,fwknop的不断发展和完善,也为网络安全领域带来了更多的可能性和解决方案。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值