fwknop教程
目录
4.1利用HMAC和对称加密进行单包认证(通过Rijndael)
4.2利用HMAC和非对称密钥进行单包认证(通过GnuPG)
概述
fwknop实现了被称作为单包认证(SPA)的授权协议,目的是为了获得强大的服务隐藏功能。SPA只需要一个加密的单包、无需重发,而且可以通过HMAC实现认证,从而可以获取到权限访问隐藏在默认丢弃过滤规则的防火墙后面的服务。SPA的主应用就是利用防火墙拦截所有想访问服务的非法连接,目的是为了使得零日漏洞(刚刚发布且未打补丁的代码)被攻破变的更困难。所有的服务都被SPA隐藏了,自然就无法被Nmap扫描到。fwknop原生支持四种不同的防火墙:Linux系统上的iptables和firewalld、OpenBSD的pf、FreeBSD和Mac OS X的ipfw。
1. fwknop快速入门
1.1基础概述
fwknop结合单包认证(SPA)隐藏SSH后台进程大体分为以下步骤,前置条件是安装了SPA客户端(主机名:spaclient)、安装了fwknopd服务的SPA服务端(域名:spaserver.domain.com)、后台SSH进程处在监听状态:
1.使用fwknop --key-gen命令生成密码和HMAC 密钥。
2.把刚刚生成密钥发送给安装了fwknopd服务的服务端(SSHD处于监听状态)。
3.启动fwknopd服务然后开启配置了默认丢弃策略的防火墙来拦截所有入站的SSH连接。
4.在外网利用fwknop客户端发送SPA数据包给服务端并且让fwknopd服务打开服务端的防火墙。
5.使用你手头上常用的ssh客户端去连接服务端。此时,其他人发现不了服务端的SSHD服务处在监听状态。
下面列举还是跟上面相同的步骤,但是更具体的阐述了每个步骤中包含的完整命令:
1.在spa客户端上使用ssh携带参数请求spaserver.domain.com域名,生成密码和HMAC密钥。下面的fwknopd命令:'-a 1.1.1.1’中的1.1.1.1是客户端ip,假设用户知道这个ip。这个ip是客户端的对外ip,不同于内网ip。加上 -a 参数生成SPA数据包,会把允许通过远程防火墙的ip地址加密后放到数据包中,这种方式要比通过网络层的header头来判断是否可信更安全有效。fwknopd客户端可以通过-R参数解析外部ip,背后原理是fwknop会发送一个HTTPS请求(通过wget -- secure-protocol...命令)给cipherdyne.org主机使用脚本解析获得外网ip。然而,如果你担心本地网络管理员或者其他用户可以通过流量分析发现fwknop的使用情况,那么你就不应该用这个选项,因为利用DNS或者HTTPS请求cipherdyne.org网站产生的流量是相当大的。
[spaclient]$ fwknop -A tcp/22 -a 1.1.1.1 -D spaserver.domain.com --key-gen --use-hmac --save-rc-stanza
[+] Wrote Rijndael and HMAC keys to rc file: /home/mbr/.fwknoprc
[spaclient]$ grep KEY /home/mbr/.fwknoprc
KEY_BASE64 Sz80RjpXOlhH2olGuKBUamHKcqyMBsS9BTgLaMugUsg=
HMAC_KEY_BASE64 c0TOaMJ2aVPdYTh4Aa25Dwxni7PrLo2zLAtBoVwSepkvH6nLcW45Cjb9zaEC2SQd03kaaV+Ckx3FhCh5ohNM5Q==
2.在部署默认丢弃策略的防火墙之前,用ssh或者其他安全工具把客户端生成的密钥发送到域名为spaserver.domain.com的服务端。
这些密钥存放在/etc/fwknop/access.conf文件中,以SOURCE打头的变量段落,如下:
[spaserver.domain.com]# cat /etc/fwknop/access.conf
SOURCE ANY
REQUIRE_SOURCE_ADDRESS Y
KEY_BASE64 Sz80RjpXOlhH2olGuKBUamHKcqyMBsS9BTgLaMugUsg=
HMAC_KEY_BASE64 c0TOaMJ2aVPdYTh4Aa25Dwxni7PrLo2zLAtBoVwSepkvH6nLcW45Cjb9zaEC2SQd03kaaV+Ckx3FhCh5ohNM5Q==
3.在spaserver.domain.com主机上开启fwknopd服务,然后部署默认丢弃策略的防火墙,目的是为了拦截所有想连接本机ssh后台进程的请求。这里有个策略例子可以参考:iptables policy script 。
[spaserver.domain.com]# service fwknop start
fwknop start/running, process 4079
[spaserver.domain.com]# cat iptables.policy | iptables-restore
4.根据SPA服务端access.conf文件的要求,在SPA客户端系统上用fwknop客户端发送一个有效的SPA数据包(加密的、无需重发的、携带SHA-256的HMAC)。我们刚刚说到SSHD服务无法被Nmap扫描到是因为fwknop使用之前Nmap被配置了默认丢弃策略的防火墙给拦截了。所以, 当我们使用了fwknop之后,fwknop客户端会给服务端发送SPA数据包,这个加密的数据包中包含了可以访问SSHD服务的ip,除了这些ip之外的其他任何ip都无法扫描到服务端的SSHD服务。
[spaclient]$ sudo nmap -sS -p 22 spaserver.domain.com
[sudo] password for mbr:
Starting Nmap 6.00 ( http://nmap.org ) at 2013-06-14 20:24 EDT
Nmap scan report for spaserver.domain.com (2.2.2.2)
Host is up (0.00218s latency).
PORT STATE SERVICE
22/tcp filtered ssh
Nmap done: 1 IP address (1 host up) scanned in 0.42 seconds
[spaclient]$ fwknop -n spaserver.domain.com
5.最后一步,用ssh客户端正常访问ssh后台服务。SPA服务端上的防火墙策略是由fwknop控制, 在超出配置的超时时间后,这个策略就会被自动删除,但是防火墙(这里是iptables)会利用连接追踪机制保持已有的连接不会被中断。
[spaclient]$ ssh -l mbr spaserver.domain.com
mbr@spaserver.domain.com's password:
[spaserver.domain.com]$ hostname
spaserver.domain.com
1.2 网络配置
有了以上概述我们再来详细讨论下一般的SPA应用场景下网络配置情况。除此之外,这节内容还介绍了如何用SPA来隐藏SSH后台服务。文档的剩余部分,为了阐述清楚我们会使用到两个系统:SPA客户端(IP: 1.1.1.1)和域名为spaserver.domain.com的SPA服务端(IP : 2.2.2.2)。服务端系统部署了SSH后台服务、iptables防火墙、fwknopd服务,客户端系统部署了SSH客户端、fwknop客户端。这节内容前置条件是客户端和服务端都安装好了fwknopd,安装fwknop详细教程可以参考安装fwknop这节内容。需要注意的是fwknop安装教程虽然是针对Linux系统的,但对于FreeBSD、Mac OS X以及OpenBSD系统上的ipfw或者pf防火墙可以按照类似的步骤安装fwknop。
图1:单包认证--总体网络图
如上图所示,SPA客户端部署在防火墙之后的家庭或者办公网络中,通过防火墙的所有数据包都要经过NAT转换获取源IP(1.1.1.1),这个ip是客户端初始化时获得的用来对外通信的ip地址。
1.3默认丢弃防火墙策略
单包认证机制设计的初衷是可以用它来把防火墙本地被配置成默认丢弃状态,从而可以隐藏本地服务比如sshd。在服务端系统上我们假设eth0是外部接口,所有通过这个接口连接sshd服务的请求都会被拦截。下面这些iptables命令可以达到这个目的,而且跟fwknop是兼容的:
[spaserver]# iptables -I INPUT 1 -i eth0 -p tcp --dport 22 -j DROP
[spaserver]# iptables -I INPUT 1 -i eth0 -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
No Starch 出版社出版的“Linux Firewalls: Attack Detection and Response”书附带的iptables 安装脚本同样是按照上面那样配置。例如:不允许通过eth0连接sshd服务,但是保持已有的连接不断开(爆料下:这本书是我写的,除了前面提到的, 还有很多其他的配置安装脚本是很有用的)。你可能希望生产环境上的防火墙不允许任何入站连接访问sshd服务, 而且还要保证对已经建立的连接开启连接追踪。
1.4 详解SSH如何配置SPA
让我们回归下前面基础概述中提到的例子,但这次我们把所有东西放到一起来看,然后阐述下客户端用--verbose选项得到的输出结果以及服务端生成的syslog信息分别是什么含义。命令的提示信息展示了如何在SPA客户端和SPA服务端之间来回切换,下面的蓝色字体是对应的注释信息。我们首先看下服务端的/etc/fwknop/access.conf文件,打开可以看到里面存放了密码和HMAC密钥,这些是在前面基础概述章节中客户端通过开启--key-gen模式生成的。然后我们切换到客户端,运行fwknop,然后连接ssh。
当服务端的fwknopd服务接收到了SPA数据包之后,会进行如下校验:1)接收到的这个SPA数据包是不是重发的,2)数据包是否经过HMAC加密认证了,3)这个SPA数据包加密用到的密钥是否在access.conf文件中,目的是为了fwknopd能正确解密,4)数据包是否包含一个已经授予访问权限的请求,然后把访问权限授予SSHD。最后把ACCEPT规则添加到IP为1.1.1.1端口为tcp/22的FWKNOP_INPUT链30秒后删除。在SPA服务端你可以通过系统日志看到控制台打印出ACCEPT规则和fwknop发送的消息,清楚的展示了防火墙规则先是被添加上了30秒后又被删除了。ACCEPT规则删除后,刚开始的那个SSH连接还处于连通状态,这个是通过使用iptables的conntrack模块实现的(这里没有展示出来)。
[spaserver.domain.com]# cat /etc/fwknop/access.conf
SOURCE ANY
REQUIRE_SOURCE_ADDRESS Y
KEY_BASE64 Sz80RjpXOlhH2olGuKBUamHKcqyMBsS9BTgLaMugUsg=
HMAC_KEY_BASE64 c0TOaMJ2aVPdYTh4Aa25Dwxni7PrLo2zLAtBoVwSepkvH6nLcW45Cjb9zaEC2SQd03kaaV+Ckx3FhCh5ohNM5Q==
[spaserver.domain.com]# service fwknop status
fwknop start/running, process 4079
--- Switching over to the client, we first scan for SSH and then run fwknop:
[spaclient]$ sudo nmap -sS -p 22 spaserver.domain.com
[sudo] password for mbr:
Starting Nmap 6.00 ( http://nmap.org ) at 2013-06-14 20:24 EDT
Nmap scan report for spaserver.domain.com (2.2.2.2)
Host is up (0.00218s latency).
PORT STATE SERVICE
22/tcp filtered ssh
Nmap done: 1 IP address (1 host up) scanned in 0.42 seconds
--- Note that -R below allows fwknop to automatically resolve the externally
--- routable IP of the spaclient system that was set up during the --key-gen
--- in the basic outline. The resolution is done via HTTPS by default.
--- ***IMPORTANT***: If you already know the source IP of the network where
--- the SPA packet will come from, then it is safer to just specify this IP
--- IP with '-a' instead of using '-R'. I.e., in this case, one could use
--- '-a 1.1.1.1'. We include this example for completeness.
[spaclient]$ fwknop -n spaserver.domain.com --verbose -R
[+] Resolved external IP (via '/usr/local/bin/wget --secure-protocol=auto --quiet -O - https://www.cipherdyne.org/cgi-bin/myip') as: 1.1.1.1
FKO Field Values:
=================
Random Value: 3166542531372213
Username: mbr
Timestamp: 1371262681
FKO Version: 2.0.2
Message Type: 1 (Access msg)
Message String: 1.1.1.1,tcp/22
Nat Access: <NULL>
Server Auth: <NULL>
Client Timeout: 0 (seconds)
Digest Type: 3 (SHA256)
HMAC Type: 3 (SHA256)
Encryption Type: 1 (Rijndael)
Encryption Mode: 2 (CBC)
Encoded Data: 3166542531372213:bWJy:1371262681:2.0.2:1:NTAuNzYuMTUuMTcwLHRjcC8yMg
SPA Data Digest: jyiIo5ICRapo72UCjsHqFDipR4P4teAyyYI5W9sTe10
HMAC: 1VTsf4E2vlPP7Kum94SfyRJzAYwl86LVMQtt7H0/zP0
Plaintext: 3166542531372213:bWJy:1371262681:2.0.2:1:NTauNzYuMaUuMTcwLHajcC8yMg:jyiIo5ICRapo72UCjsHqFDipR4PateAyyYI5W9sTe10
Final Packed/Encrypted/Encoded Data:
8rqjaO4SdW4Yaf1grhi0f3pcdcWO6ZpRxnduxHwJ/5zcqne0VCrZ8oibPYiwazGCOJ7HhGy+f2ju2mVz//DnIr4qKYf48gqe0QJz14Y6Z7BQCYdJdwyYz+hTo9Z41tOA788VcK7sK2XJjdPQL0C794QqEFAqCOyno1VTsf4E2vlPP7Kum94SfyRJzAYwl86LVMQtt7H0/zP0
Generating SPA packet:
protocol: udp
source port: <OS assigned>
destination port: 62201
IP/host: spaserver.domain.com
send_spa_packet: bytes sent: 204
--- With the SPA packet sent, we now have access to SSHD:
[spaclient]$ ssh -l mbr spaserver.domain.com
mbr@spaserver.domain.com's password:
[spaserver.domain.com]$ hostname
spaserver.domain.com
[spaserver.domain.com]$ sudo fwknopd --fw-list
Listing rules in fwknopd iptables chains...
Chain FWKNOP_INPUT (1 references)
num target prot opt source destination
1 ACCEPT tcp -- 1.1.1.1 0.0.0.0/0 tcp dpt:22 /* _exp_1348326362 */
--- These are syslog messages written by fwknopd indicating firewall rule manipulations:
[spaserver.domain.com]$ sudo grep fwknopd /var/log/syslog
Jun 22 10:50:32 spaserver fwknopd[4079]: (stanza #1) SPA Packet from IP: 1.1.1.1 received with access source match
Jun 22 10:50:32 spaserver fwknopd[4079]: Added Rule to FWKNOP_INPUT for 1.1.1.1, tcp/22 expires at 1348326362
Jun 22 10:51:02 spaserver fwknopd[4079]: Removed rule 1 from FWKNOP_INPUT with expire time of 1348326362.
--- After the ACCEPT rule is deleted on spaserver, back on the client
--- SSHD is once again no longer scannable, and it is never scannable
--- by any IP that cannot construct a valid SPA packet:
[spaclient]$ nmap -P0 -n -p 22 spaserver
Starting Nmap 5.00 ( http://nmap.org ) at 2013-06-22 10:50 EDT
Interesting ports on 2.2.2.2:
PORT STATE SERVICE
22/tcp filtered ssh
Nmap done: 1 IP address (1 host up) scanned in 2.10 seconds
阐述了整个工作流程之后,我们再来看下服务端的fwknopd。很重要的一点是配置fwknopd后台进程嗅探指定的接口,Linux系统默认是eth0。如果你在其他的系统上(比如FreeBSD 或者 OpenBSD)运行fwknopd,就需要把参数PACP_INTF设置成对应的接口名称。/etc/fwknop/fwknopd.conf文件中有很多参数,但其中大多数只需要设置成默认值即可。比如,这里我们就把PCAP_INTF设置成eth0。
[spaserver]# grep PCAP_INTF /etc/fwknop/fwknopd.conf
PCAP_INTF eth0;
虽然fwknopd的核心就是以太网探测器,但默认情况下fwknopd不会处理每个数据包,因为bpf过滤器限制了它只能探测到62201端口的UDP数据包。如果想要改成让fwknopd处理每个数据包,你可以修改fwknopd.conf配置文件中的PCAP_FILTER变量,然后重启fwknopd服务。
2.介绍
这个教程对fwknop的使用、部署及背后的原理进行了详细介绍。读完之后,你将会学到fwknop的使用技巧,通常fwknop在使用的过程还需要一个配置好了“默认丢弃”策略的防火墙,这个防火墙可以在任何服务外层加上一个加密性很强的被动认证/授权层。这个认证/授权层就叫做单包认证(SPA),可以应用于所有类型的服务,从sshd、OpenVPN到邮件协议如POP、IMAP甚至是HTTP。最终的目的是阻止他人利用nmap这种隐蔽的方式探测到服务--更别说攻破漏洞或者企图暴力破解密码了(通常针对可以访问的SSH后台进程进行)。利用fwknop客户端生成一个有效的SPA消息,然后位于SPA数据包中加密ip就能暂时访问那些受保护的服务。一个SPA数据包是否有效是通过HMAC来认证的(fwknop为了HAMC操作支持各种摘要算法,包括SHA-512,默认是SHA-256),而且是用预估key来进行强加密的(fwknop支持Rijndael对称加密和GnuPG非对称加密),还可以利用SHA-256摘要校验防止重播攻击。
2.1.什么是端口敲击
2.2.什么是单包认证
2.3.什么是fwknop
2.4.fwknop开源协议(GPL v2)
3.安装fwknop
3.1依赖
fwknop客户端和服务端依赖libfko,这个依赖包是为fwknop项目专门开发的,在源码和发布的安装包中就有。除此之外,如果想要用fwknop服务端,还需要安装libpcap依赖除非fwknopd服务部署成UDP监听模式。这种模式下,虽然fwknopd服务监听了UDP端口,但SPA传输数据包不会被发现。因为站在攻击者的角度看,就是否能被扫描到这点来说,fwknopd被动地从网络中嗅探数据包跟监听UDP端口是没有区别的。
如果需要GPG功能,还需要安装GnuPG和libgpgme依赖包。
为了使用fwknopd服务的认证和访问权限管理功能,还需要一个能正常工作的防火墙(iptables、ipfw或者pf)。fwknop的依赖可以总结成下面这张表格。注意下,最好通过系统的包管理工具来安装libpcap和libgpme依赖,而且依赖包的名字在不同的系统中可以不太一样。比如,在Debian/Ubuntu系统中, 包名叫libpcap-dev和libgpgme11-dev。
Dependency | fwknop Client | fwknopd Server |
libpcap | N/A | optional(not required in UDP server mode) |
libgpgme | optional | optional |
libfko | required | required |
iptables/ipfw/pf | N/A | required |
3.2 支持的系统
各种系统上的fwknop代码通常都是很简洁的,下面的表格列举了对各种操作系统的支持现状。表格下方的章节是针对各种系统上如何操作fwknop的具体说明,如果你想要运行fwknop的操作系统不在下面表格列出的操作系统中,请联系fwknop开发人员,让他们补充上。对于开发者,如果你发现fwknop的某个组件不支持你当前的操作系统(比如,安卓系统的GnuPG组件),然后你开发了一个补丁使其得到支持,请把这个补丁提交到给官方,有可能下一个版本会把这个补丁包加进去。我们会在CREDITS文件中写明这个补丁包是属于你个人。
Component/Technology | Fedora/RHEL/CentOS | Debian/Ubuntu | OpenWRT | FreeBSD | Mac OS X | OpenBSD | iPhone | Android | Cygwin | Windows |
fwknop client | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y |
fwknopd server | Y | Y | Y | Y | Y | Y | N | N | N | N |
GnuPG Support | Y | Y | Y | Y | Y | Y | N | N | N | N |
HMAC Support | Y | Y | Y | Y | Y | Y | N | Y | Y | N |
Client NAT Access Support | Y | Y | Y | N | N | N | N | Y | Y | N |
fwknopd Server-Side NAT | Y | Y | Y | N | N | N | N/A | N/A | N/A | N |
Native Windows binary(client) | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | Y |
libfko library | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y |
perl libfko bindings | Y | Y | Y | Y | Y | Y | N | N | Unknown | Unknown |
python libfko bindings | Y | Y | Y | Y | Y | Y | N | N | Unknown | Unknown |
3.4 特定系统注意事项
fwknop的大部分新特性首先在Linux系统上做原型,然后再移植到其他操作系统。fwknop客户端是fwknop项目中最简单的部分,一般运行在非Linux系统上,因为它不依赖于本地防火墙的各种特性,所以就没有必要担心不同的防火墙命令语法有差异(iptables、ipfw 和 pf)。然而,从上一节中列举的支持系统,我们可以看到fwknopd服务支持多种非Linux系统。针对Linux独有的特性,fwknopd后台服务依赖于iptables的“comment”匹配规则,目的是为了当fwknopd服务接收到有效的SPA数据包之后要给创建的ACCEPT规则存储超时时间。在初始化阶段,fwknopd会检验comment匹配是否可用。需要注意的是所有新建的规则都会被fwknopd服务加到FWKNOP_INPUT链中去,目的是为了和其他的iptables策略区分开来。
/sbin/iptables -t filter -A FWKNOP_INPUT -p 6 -s 1.1.1.1 --dport 22 -m comment --comment _exp_1348688232 -j ACCEPT
关于其他依赖,如果你想编译运行fwknopd后台服务就需要安装libpcap依赖。最好是用系统自带的包管理工具(yum、apt-get等)来安装“libpcap-dev”和“libpcap-devel“。
3.5 通过源码安装
写这个教程时,最新的fwknop版本是2.6.8,通过下面几个步骤可以轻松编译安装fwknop。注意下安装后的fwknopd配置文件存放在/etc/fwknop/目录下,可执行文件在/usr/bin和/usr/sbin/目录下(为了简便起见大部分命令的输出信息被省略掉了)。
4.fwknop实操
这个章节包括了对fwknop的各种操作,为了能演示实际如何操作的,我们假设fwknop已经安装好了客户端spaclient(IP:1.1.1.1)和服务端spaserver(IP:2.2.2.2)。此外, 虽然这个章节我们都是在Ubuntu系统上演示如何操作fwknop,但是在其他受支持的系统上操作也是类似的。
4.1利用HMAC和对称加密进行单包认证(通过Rijndael)
这个章节将会展示通过Rijndael加密和SHA-256 HMAC生成对称加密的key,然后用这个key对想要通过SSL访问sshd和IMAP两个服务的请求进行单包认证。我们通过spaserver系统中的配置文件 /etc/fwknop/fwknopd.conf 让fwknop服务监听eth0网口,我们还要用到快速入门章节同样的Rijndael和HMAC密码。在fwknopd.confi配置中,我们除了需要新增一个OPEN_PORTS变量允许SPA客户端访问tcp/22端口的ssh服务和tcp/993端口的IMAPS服务之外不需要修改其他配置。
[spaserver]# grep PCAP_INTF /etc/fwknop/fwknopd.conf
PCAP_INTF eth0;
[spaserver.domain.com]# cat /etc/fwknop/access.conf
SOURCE ANY
OPEN_PORTS tcp/22, tcp/993
REQUIRE_SOURCE_ADDRESS Y
KEY_BASE64 Sz80RjpXOlhH2olGuKBUamHKcqyMBsS9BTgLaMugUsg=
HMAC_KEY_BASE64 c0TOaMJ2aVPdYTh4Aa25Dwxni7PrLo2zLAtBoVwSepkvH6nLcW45Cjb9zaEC2SQd03kaaV+Ckx3FhCh5ohNM5Q==
假设已经给sshd和IMAPS服务配置了默认丢弃的防火墙策略,并且有连接跟踪规则来允许已经建立了TCP连接的通道可以继续发送数据。下面这3条命令可以给这两个服务设置成我们想要的那样,但是如果你用的防火墙策略接口(假如用的不是iptables防火墙)不一样,还需要根据实际情况进行适当的调整。可以参考默认丢弃防火墙策略这节提到的内容。
[spaserver]# iptables -I INPUT 1 -i eth0 -p tcp --dport 22 -j DROP
[spaserver]# iptables -I INPUT 1 -i eth0 -p tcp --dport 993 -j DROP
[spaserver]# iptables -I INPUT 1 -i eth0 -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
现在我们在spaclient系统上运行fwknop客户端来模拟同时请求访问SSHD和IMAPS服务,需要注意的是,虽然这里用的是快速入门章节中得到的Rijndeal码和HMAC码,但是有点小改动,要把原来的 -A tcp/22替换成下面这个命令:
[spaclient]$ fwknop -A tcp/22,tcp/993 -n spaserver.domain.com
[spaclient]$ ssh mbr@spaserver
mbr@spaserver's password:
4.2利用HMAC和非对称密钥进行单包认证(通过GnuPG)
一些人喜欢用安全性更高的GnuPG作为单包认证的加密/解密。这个章节将会展示如何利用GnuPG密钥进行单包认证。首先, 需要在客户端和服务端生成GnuPG密钥。如果你已经有了GnuPG密钥,可以放心地在客户端直接使用它,因为这个密钥只会被fwknop用来做消息签名。在fwknop服务端你还需要生成一个独立的GnuPG密钥用来和fwknop客户端通信。因为用来解锁这个密钥的密码必须存放在/etc/fwknop/access.conf文件中,然后fwknopd服务端拿到这个解锁后的密钥去解密客户端用服务端公钥加密后的消息。因此,不建议在服务端设置有价值的私人GnuPG密钥。建议在服务端生成一个不需要密码解锁的GnuPG,然后在access.conf配置文件中把GPG_ALLOW_NO_PW项设置成Y。这样设置可能听起来不是个好主意,但是你要知道在自动化环境中这样设置很有用。正如官方文档https://www.gnupg.org/faq/gnupg-faq.html#automated_use介绍的那样“我们没办法保证存储密码比存储密钥本身更安全”。在那些libgpgme被强制用gpg-agent或者pinentry来收集密码的场合,如果能利用到上述特性把GnuPG密钥对中的密码剔除,将会起到很大的用途。
想要让fwknop用GnuPG支持单包认证必须要先安装libgpgme,编译fwknop的时候, configure自动配置脚本会检测libgpgme有没有安装,如果已经安装了, 编译之后就默认支持GnuPG。
如果你已经按照下面步骤生成了必要的key,你还需要把这些key导入并注册到对方的系统。也即是,把服务端的key导入且注册到客户端的GnuPG钥匙环,反过来也成立。因为SPA消息必须要放在单个数据包中,所以我建议用小于等于2048位的key作为fwknop服务端的GnuPG key。在技术层面上来讲, 只要客户端key小于等于2048位,就可以用4096位大小的key作为服务端GnuPG key。需要注意的是, 如果客户端和服务端的key大小都是4096位,然后你可以往客户端钥匙环中增加一个2048位的注册key用来做单包认证用途。
下面列举了客户端和服务端生成GnuPG key的步骤,首先,我们要先生成GnuPG key然后把它们导出到ascii文件中:
[spaserver]# gpg --gen-key
[spaserver]# gpg --list-keys
pub 1024D/ABCD1234 2012-05-01
uid fwknop server key <fwknopd@spaserver>
sub 2048g/EFGH1234 2012-05-01
[spaserver]# gpg -a --export ABCD1234 > server.asc
--- now from the spaclient system:
[spaclient]$ gpg --gen-key
[spaclient]$ gpg --list-keys
pub 1024D/1234ABCD 2012-05-01
uid fwknop client key <fwknop@spaclient>
sub 2048g/1234EFGH 2012-05-01
[spaclient]$ gpg -a --export 1234ABCD > client.asc
下一步,把这两个ascii文件分别拷贝到对方系统中。这个例子中用的是scp(如果部署了fwknop可能会被防火墙拦截下来),用其他的方法(ftp、http等等)都是可行的:
[spaclient]$ scp client.asc root@spaserver:
[spaclient]$ scp root@spaserver:server.asc .
然后把这些生成的key导入并注册到对方系统中:
[spaserver]# gpg --import client.asc
[spaserver]# gpg --edit-key 1234ABCD
Command> sign
[spaclient]$ gpg --import server.asc
[spaclient]$ gpg --edit-key ABCD1234
Command> sign
在服务端一侧, 需要在/etc/fwknop/access.conf文件中添加一些配置信息,以便fwknop可以用GnuPG来验证和解密SPA数据包,这些数据包往往是用GnuPG签名加密过的。需要注意的是服务端的key ID是ABCD1234、客户端的key ID是1234ABCD:
[spaserver]# cat /etc/fwknop/access.conf
SOURCE ANY
OPEN_PORTS tcp/22
REQUIRE_SOURCE_ADDRESS Y
GPG_REMOTE_ID 1234ABCD;
GPG_DECRYPT_ID ABCD1234;
GPG_DECRYPT_PW <your decryption password> ### or set GPG_ALLOW_NO_PW and remove the passphrase
HMAC_KEY_BASE64 c0TOaMJ2aVPdYTh4Aa25Dwxni7PrLo2zLAtBoVwSepkvH6nLcW45Cjb9zaEC2SQd03kaaV+Ckx3FhCh5ohNM5Q==
GPG_HOME_DIR /root/.gnupg
FW_ACCESS_TIMEOUT 30
[spaserver]# service fwknop restart
fwknop stop/waiting
fwknop start/running, process 12624
接下来我们来访问SSH服务,先执行fwknop以下命令,会在~/.fwknoprc文件中生成相应的配置信息:
[spaclient]$ fwknop -A tcp/22 --gpg-recip ABCD1234 --gpg-sign 1234ABCD -a 1.1.1.1 -D spaserver.domain.com --save-rc-stanza
Enter passphrase for signing:
[spaclient]$ ssh -l mbr spaserver
mbr@spaserver's password:
需要注意的是,如果前面你用了Rijndael作为SPA数据包加密算法,那么你需要修改~/.fwknoprc文件然后做下面3件事情:
1.删除KEY_BASE64这行,因为你的Rijndael密码可能跟GPG用的签名密码完全不一样(或者是至少有所不同)。如果你不想把GPG签名密码放到磁盘中,你可以根据自己的需求选择,fwknop客户端会在运行中提示让你输入密码。
2.如果你想把GPG签名密钥放在~/.fwknoprc文件中,然后更新KEY_BASE64变量。可以用下面这个命令生成base64编码后的数值:
echo -n "some gpg passphrase" | base64
c29tZSBncGcgcGFzc3BocmFzZQ==
3.最后,你只需要把KEY_BASE64替换为KEY并且提供正常的没有编码的密码。