金钱(警告)
** 状态:** 被贬值
如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:
** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。
** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。
介绍
将服务暴露在互联网上总是是一种风险,但往往是首先拥有服务器的全部原因,任何开放的端口或暴露的服务都可能受到恶意用户或自动脚本的大量调查和访问尝试。
虽然有些服务必须保持可访问性,因为它们的目的是公共消费(如网站托管的网页服务器),但其他服务只能被一个或几个授权的用户使用,而不是其他任何人(如SSH)。
Single Packet Authentication 是允许防火墙阻止访问服务的一种方法,直到将专门的加密包发送到收听服务,当该服务验证该包时,它会立即修改防火墙规则以曝露所需的端口。
一个名为fwknop
的工具,即防火墙打击操作员,可以用来解释这些包并修改防火墙规则. 在本指南中,我们将在Ubuntu 12.04系统上配置一台fwknop服务器和客户端。
在 One VPS 上安装 fwknop 服务器
我们的配置将假定你有两个Ubuntu 12.04 VPS实例,我们也将假定你有一个域名指向服务器VPS,尽管使用IP地址也应该起作用。
在服务器机上,通过 apt-get 安装 fwknop 服务器组件:
1sudo apt-get update
2sudo apt-get install fwknop-server
在安装过程中,您将被问到一些关于配置服务和相关组件的问题。
它有问题的第一个组件是postfix. 选择互联网网站
,然后在下一节填写您的域名。
接下来,它会询问您是否希望 fwknop 默认地使用更不安全的密钥系统来保护 SSH 端口。选择是
以便该服务配置一些参数。
选择你想要保护的界面. 通常这将是eth0
。 最后,选择一个加密密钥用于加密器. 因为我们将更改后,它不重要你把什么。
在其他 VPS 上安装 fwknop 客户端
在我们将作为客户端使用的VPS上,我们需要安装客户端组件,这是我们系统的一部分,它将制造我们的加密包发送到另一台机器:
1sudo apt-get update
2sudo apt-get install fwknop-client
客户端部分此时不需要任何配置。
配置 GPG 密钥
我们将使用 GPG 密钥为我们的数据包传输提供身份验证,因为这是一个不对称的加密,我们需要在客户端和服务器机器上执行这些步骤。
在每个机器上,通过键入生成一个密钥:
1gpg --gen-key
这会问你一些信息. 对于大多数问题,你可以安全地接受默认值。
提供并确认一个密码,然后,需要一段时间才能生成足够的随机信息来创建一个密钥。
接下来,我们需要写下来或以其他方式复制我们生成的每个密钥的公共ID。
gpg --list-keys
/home/test/.gnupg/pubring.gpg ------------------------------- pub 2048R/11111111 2014-01-09 uid clientsub 2048R/C1C26BA6 2014-01-09
上面的部分是你需要的每个密钥的部分. 将其复制到某个地方,并标记为服务器或客户端组件。
1SERVER: 11111111
2CLIENT: 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数据库中。
在服务器机上,类型:
1gpg --import client.asc
在客户端机器上,类型:
1gpg --import server.asc
现在每个计算机在其数据库中都有相反的密钥,您可以签署每个密钥来验证它们。
在每个机器上输入这个命令,引用你刚刚导入的密钥的ID。
gpg --edit-key 11111111
在服务器机器上,我们会键入:
gpg --edit-key 99999999
您将收到 GPG 提示. 我们想要签署密钥,所以输入:
1sign
你會被告知你是否確定:
1Y
在此之后,您可以通过键入保存和停止:
1save
在此时,您的每个计算机都有对方的GPG密钥的副本,它们被签署,表示我们信任密钥的真实性。
在 fwknop 服务器上配置访问
在服务器机器上,我们需要配置 fwknop 服务以使用我们的 GPG 密钥,并允许我们的客户端连接和身份验证。
在服务器上,打开使用 root 特权的访问配置:
1sudo nano /etc/fwknop/access.conf
您应该看到一个只包含大约四个活跃行的文件,它应该看起来像这样:
SOURCE: ANY; OPEN_PORTS: tcp/22; ### for ssh (change for access to other services) KEY: throw_away_password; FW_ACCESS_TIMEOUT: 30;
这是使用您在安装服务时选择的密码配置的。我们不需要这个,因为我们将更改为GPG身份验证。
SOURCE: ANY; OPEN_PORTS: tcp/22; ### for ssh (change for access to other services) # KEY: throw_away_password; FW_ACCESS_TIMEOUT: 30;
接下来,我们将附加一些额外的参数,这些参数将告诉 fwknop 服务我们的密钥,我们需要添加一些更多信息:
SOURCE: ANY; OPEN_PORTS: tcp/22; ### for ssh (change for access to other services) # KEY: throw_away_password; FW_ACCESS_TIMEOUT: 30; REQUIRE_SOURCE_ADDRESS: Y; DATA_COLLECT_MODE: PCAP; GPG_REMOTE_ID: 99999999; ## Client key goes here GPG_DECRYPT_ID: 11111111; ## Server key goes here GPG_DECRYPT_PW: your_GPG_passphrase_here; ## Place the GPG passphrase here GPG_HOME_DIR: /home/test/.gnupg; ## Path to your user's GPG directory. Usually ## this is in your user's home directory.
请确保您更改 GPG_REMOTE_ID 以反映客户端的关键 ID 和 GPG_DECRYPT_ID 以反映服务器 ID。
此外,您还需要输入您的 GPG 密码,并包括到您的用户的 .gnupg
目录的路径。
保存并关闭文件。
设置IPTables规则
现在我们已经修改了 fwknop 服务器配置,我们需要制定一些实际的 iptables 规则,服务将根据需要修改这些规则,但我们需要先关闭我们的端口。
首先,我们需要允许我们的当前连接. 此规则将允许已经建立的连接和相关数据:
1sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
接下来,直接之后,我们将通过放弃所有未建立的连接尝试来限制所有其他对端口的访问:
1sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP
现在我们有一个基本的防火墙,限制访问该端口,我们可以实现我们的配置。
1sudo service fwknop-server restart
现在, fwknop 服务将开始监控我们的服务器,以检测符合我们配置的规则的包。
从客户端连接到服务器
现在我们已经配置并运行了我们的服务器,我们可以进行测试,看看我们是否可以从我们的客户端连接到我们的SSH服务器。
ssh root@server_domain_or_ip
ssh: connect to host server_domain_or_ip port 22: Connection timed out
您可以按一下Ctrl-C
,如果你不想等到这个时间结束。
现在,我们可以发送一个加密的包,将我们与我们的服务器进行身份验证。
- -A tcp/22: 此选项指定了我们要打开的协议和端口。
- --gpg-recip: 此选项将指定服务器的 GPG 密钥 ID.
- --gpg-sign: 此选项指定了客户端的 GPG 密钥 ID.
- -a: 此参数告诉 fwknop 允许访问的 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 ACCEPT
该实用程序会向 iptables 添加另一个链,并通过其过滤所有输入,然后检查连接是否匹配产生加密包的机器,并接受它。
结论
通过设置单个包验证机制,您可以在服务器之间连接时添加一个额外的安全层,这不仅会隐藏您的SSH服务器免受随机攻击和试图强迫,还会帮助在受保护服务中发现安全漏洞的情况下。
虽然单个套件身份验证对一些用户来说可能太麻烦了,但在与常规的 SSH 安全措施相结合时,可以为您的隐藏服务添加一个额外的安全层是一个很好的选择。