如何在Ubuntu12.04上使用fwknop启用单包身份验证
状态: 已弃用
本文介绍了不再受支持的 Ubuntu 版本。 如果您当前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:
原因: Ubuntu 12.04 已于 2017 年 4 月 28 日终止生命周期 (EOL) and no longer receives security patches or updates. This guide is no longer maintained.
请参阅: 本指南可能仍可用作参考,但可能不适用于其他 Ubuntu 版本。 如果可用,我们强烈建议使用为您正在使用的 Ubuntu 版本编写的指南。 您可以使用页面顶部的搜索功能来查找更新的版本。
介绍
将服务暴露在互联网上总是有风险的,但通常是首先拥有服务器的全部原因。 任何开放的端口或暴露的服务都可能受到恶意用户或自动化脚本的大量探测和访问尝试。
虽然某些服务必须保持可访问性,因为它们是公开可消费的(例如托管站点的 Web 服务器),但其他服务仅供一个或几个授权用户使用,其他人不得使用(例如 SSH)。 在最好的情况下,这些服务将得到很好的保护,但也只有在我们真正想要使用它们时才能访问。
单数据包身份验证是一种允许防火墙阻止对服务的访问,直到将专门的加密数据包发送到侦听服务的方法。 当服务验证此数据包时,它会立即修改防火墙规则以公开所需的端口。
一个名为 fwknop
的工具代表 Firewall Knock Operator,可用于解释这些数据包并修改防火墙规则。 在本指南中,我们将在 Ubuntu 12.04 系统上配置 fwknop 服务器和客户端。 这将使我们能够屏蔽我们的 SSH 服务器,直到特别请求。
在一个 VPS 上安装 fwknop 服务器
我们的配置将假设您有两个 Ubuntu 12.04 VPS 实例。 我们还将假设您有一个指向服务器 VPS 的域名,尽管使用 IP 地址也应该可以。 如果您需要帮助为 DigitalOcean 配置 域名,请单击此处。
在服务器机器上,通过 apt-get 安装 fwknop 服务器组件:
sudo apt-get update sudo apt-get install fwknop-server
在安装过程中,系统会询问您几个问题来配置服务和相关组件。
它有疑问的第一个组件是后缀。 选择“Internet Site”,然后在下一部分填写您的域名。
接下来,它会询问您是否希望 fwknop 默认使用安全性较低的密钥系统来保护 SSH 端口。 选择“是”,以便服务配置一些参数。 稍后我们将切换到更安全的设置。
选择您要保护的接口。 通常这将是“eth0”。 最后,选择用于密码的加密密钥。 因为我们稍后会改变它,所以你放什么并不重要。 只要确保它是一个单词,否则配置会出错。
在其他 VPS 上安装 fwknop 客户端
在我们将用作客户端的 VPS 上,我们需要安装客户端组件。 这是我们系统的一部分,它将制作我们的加密数据包以发送到另一台机器:
sudo apt-get update sudo apt-get install fwknop-client
客户端部分此时不需要任何配置。
配置 GPG 密钥
我们将使用 GPG 密钥为我们的数据包传输提供身份验证。 因为这是一个非对称密码,我们需要在客户端和服务器机器上执行这些步骤。 GPG 应该默认安装。
在每台机器上,通过键入以下命令生成一个密钥:
gpg --gen-key
这将询问您一些信息。 对于大多数问题,您可以安全地接受默认设置。
提供并确认密码。 之后,需要一些时间来生成足够的随机信息来创建密钥。
接下来,我们需要记下或以其他方式复制我们生成的每个密钥的公共 ID。 您可以通过键入以下内容来获取这些信息:
gpg --list-keys
/home/test/.gnupg/pubring.gpg
pub 2048R/ 11111111 2014-01-09 uid 客户端客户@domain.com 子 2048R/C1C26BA6 2014-01-09
上面突出显示的部分是每个键所需的部分。 将其复制到某处并标记为服务器或客户端组件。
SERVER: 11111111 CLIENT: 99999999
现在,在客户端计算机上,通过将密钥导出到文件来制作密钥的 client.asc
ascii 副本。 您需要引用刚刚为客户端复制的密钥 ID:
gpg -a --export 99999999 > client.asc
在服务器机器上,参考服务器密钥 ID 执行类似的过程,以生成 server.asc
文件:
gpg -a --export 11111111 > server.asc
在计算机之间传输密钥
现在,我们需要在机器之间传输密钥,以便每台机器都拥有两者的副本。
我们将使用客户端计算机上的 scp
工具来执行此操作。
在客户端机器上,使用如下命令将 client.asc
文件复制到服务器:
scp client.asc server_domain_or_ip : /path/to/user/home/directory
这将要求您使用服务器的普通帐户密码进行身份验证。 修改路径以反映普通用户的主文件夹。
接下来,我们将使用类似的命令获取 server.asc
文件:
scp server_domain_or_ip : /path/to/user/home/directory /server.asc 。
您现在应该在每台机器上都有这两个文件。
导入和签署密钥
现在我们可以访问每台机器上的另一个密钥,我们可以将相反的(客户端上的服务器密钥和服务器上的客户端密钥)密钥导入本地 GPG 数据库。
在服务器计算机上,键入:
gpg --import client.asc
在客户端计算机上,键入:
gpg --import server.asc
现在每台计算机的数据库中都有相反的密钥,您可以对每个密钥进行签名以验证它们。
在每台机器上键入此命令,引用您刚刚导入的密钥的 ID。 在我们的示例中,在客户端计算机上,我们将键入:
gpg --edit-key 11111111
在服务器机器上,我们会输入:
gpg --edit-key 99999999
您将收到 GPG 提示。 我们要对密钥进行签名,所以输入:
sign
系统将提示您是否确定:
Y
之后,您可以通过键入以下内容保存并退出:
save
此时,您的每台计算机都拥有另一台 GPG 密钥的副本。 它们经过签名表示我们相信密钥的真实性。
在 fwknop 服务器上配置访问
在服务器机器上,我们需要配置 fwknop 服务以使用我们的 GPG 密钥并允许我们的客户端连接和验证。
在服务器上,使用 root 权限打开访问配置:
sudo nano /etc/fwknop/access.conf
您应该会看到一个仅包含大约四个活动行的文件。 它应该看起来像这样:
来源:任何; 开放端口:tcp/22; ### for ssh(更改以访问其他服务) KEY: throw_away_password; FW_ACCESS_TIMEOUT:30;
这是使用您在服务安装期间选择的密码进行配置的。 我们不需要这个,因为我们将更改为 GPG 身份验证。 立即评论该行:
来源:任何; 开放端口:tcp/22; ### 用于 ssh(更改以访问其他服务) KEY: throw_away_password; FW_ACCESS_TIMEOUT:30;
接下来,我们将附加一些额外的参数,这些参数将告诉 fwknop 服务我们的密钥。 我们需要添加更多信息:
来源:任何; 开放端口:tcp/22; ### 用于 ssh(更改以访问其他服务) KEY: throw_away_password; FW_ACCESS_TIMEOUT:30; REQUIRE_SOURCE_ADDRESS:是的; DATA_COLLECT_MODE:PCAP; GPG_REMOTE_ID:99999999; ## 客户端密钥在这里 GPG_DECRYPT_ID: 11111111; ## 服务器密钥放在这里 GPG_DECRYPT_PW: your_GPG_passphrase_here ; ## 将 GPG 密码放在此处 GPG_HOME_DIR: /home/ test /.gnupg; ## 用户 GPG 目录的路径。 通常 ## 这是在您用户的主目录中。
确保更改 GPG_REMOTE_ID 以反映客户端的密钥 ID,并更改 GPG_DECRYPT_ID 以反映服务器 ID。
此外,您需要输入您的 GPG 密码并包含用户的 .gnupg
目录的路径。
保存并关闭文件。
配置 IPTables 规则
现在我们已经修改了 fwknop 服务器配置,我们需要制定一些实际的 iptables 规则。 该服务将根据需要修改这些,但我们需要首先关闭我们的端口。
首先,我们需要允许我们当前的连接。 此规则将允许已建立的连接和相关数据:
sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
接下来,紧接着,我们将通过丢弃所有未建立的连接尝试来限制对端口的所有其他访问:
sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP
现在我们有一个基本的防火墙来限制对该端口的访问,我们可以实现我们的配置。 通过键入以下内容重新启动 fwknop 服务器:
sudo service fwknop-server restart
现在,fwknop 服务将开始监视我们的服务器以查找与我们配置的规则匹配的数据包。
从客户端连接到服务器
现在我们已经配置并运行了我们的服务器,我们可以做一个测试,看看我们是否可以从我们的客户端连接到我们的 SSH 服务器。 这应该超时,因为我们还没有发送加密数据包:
ssh root@ server_domain_or_ip
ssh:连接到主机 server_domain_or_ip 端口 22:连接超时
如果您不想等待超时,可以按“Ctrl-C”。
现在,我们可以发送一个加密数据包,该数据包将通过我们的服务器对我们进行身份验证。 我们通过向 fwknop 客户端命令传递一些参数来做到这一点:
- -A tcp/22:此选项指定我们请求打开的协议和端口。
- –gpg-recip:此选项将指定服务器的 GPG 密钥 ID。
- –gpg-sign:此选项指定客户端的 GPG 密钥 ID。
- -a:这个参数告诉 fwknop 允许访问哪个 IP 地址。 这应该是您的客户端计算机。
- -D:这告诉命令我们将数据包发送到的目的地。 这是我们服务器的域名或 IP 地址。
现在我们知道了字符串中需要的信息,我们可以创建并发送我们的数据包:
fwknop -A tcp/22 --gpg-recip 11111111 --gpg-sign 99999999 -a client_ip_address -D server_domain_or_ip
系统将要求您提供 GPG 密码来解密密钥。 之后,您的数据包将被发送到服务器。
此时,如果您的数据包被接受,您将有 30 秒的时间尝试通过 SSH 连接:
ssh root@ server_domain_or_ip
如果一切顺利,您应该可以成功登录。 打开的端口将在 30 秒后关闭,但您的连接将保持活动状态。
在服务器机器上,在您发送数据包后(并且在 30 秒之前),您应该能够看到添加的新规则以临时允许您的客户端的 IP 地址:
sudo iptables -S
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N FWKNOP_INPUT -A INPUT -j FWKNOP_INPUT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j DROP -A FWKNOP_INPUT -s client_ip_address/32 -p tcp -m tcp --dport 22 - j 接受
该实用程序将另一个链添加到 iptables,并通过它过滤所有输入。 然后它检查连接是否与产生加密数据包的机器匹配,如果匹配则接受它。 否则,它会像往常一样丢弃它。
结论
通过设置单个数据包身份验证机制,您可以在服务器之间连接时添加额外的安全层。 这不仅可以隐藏您的 SSH 服务器免受随机攻击和暴力破解的企图,还有助于在受保护的服务中发现安全漏洞的情况。 这将使您在解决问题时保持安全。
虽然单个数据包身份验证对某些用户来说可能太麻烦了,但为您的安全性添加一个额外的层是一个不错的选择。 结合常规的 SSH 安全措施,这将使您的隐藏服务相当安全。