介绍
向互联网公开服务总是一种风险,但往往是首先拥有服务器背后的全部原因。 任何开放端口或暴露的服务都可能遭受恶意用户或自动化脚本的相当多的探测和访问尝试。
虽然一些服务必须保持可访问,因为它们是公共可用的(如托管站点的Web服务器),但其他服务仅意味着由一个或几个授权用户使用,没有其他任何人(如SSH)使用。 在最好的情况下,这些服务将得到很好的保护,但也只有当我们真正想使用它们时才能访问。
单分组认证是一种允许防火墙阻止对服务的访问,直到专门的加密分组被发送到监听服务的方法。 当服务验证此数据包时,它会立即修改防火墙规则以显示所需的端口。
所谓的工具fwknop
,代表防火墙敲操作,可以用来解释这些数据包,修改防火墙规则。 在本指南中,我们将在Ubuntu 12.04系统上配置fwknop服务器和客户端。 这将使我们能够屏蔽我们的SSH服务器,直到特别要求。
在一个VPS上安装fwknop服务器
我们的配置将假设你有两个Ubuntu 12.04 VPS实例。 我们还将假设您有一个域名指向服务器VPS,虽然使用IP地址也应该工作。 如果您需要帮助配置 ,请点击此处。
在服务器上,通过apt-get安装fwknop服务器组件:
sudo apt-get update
sudo apt-get install fwknop-server
在安装过程中,系统会询问您几个问题,以配置服务和相关组件。
有问题的第一个组件是Stapling。 选择“Internet站点”,然后在下一部分填写您的域名。
接下来,它会询问您是否希望fwknop默认使用较不安全的密钥系统来保护SSH端口。 选择“yes”,以便服务配置一些参数。 我们将在稍后更改为更安全的设置。
选择您要保护的接口。 通常这将是“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 client sub 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
您应该看到一个只包含四个活动行的文件。 它应该看起来像这样:
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 远程 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: connect to host server_domain_or_ip port 22: Connection timed out
你可以按“Ctrl-C”,如果你不想等待这个超时。
现在,我们可以发送一个加密的数据包,用我们的服务器验证我们。 我们这样做是通过传递fwknop客户端命令一些参数:
-A TCP / 22:此选项指定我们要求打开的协议和端口。
--gpg-RECIP:此选项将指定服务器的GPG密钥ID。
--gpg符号 :此选项指定客户端的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 ACCEPT
该实用程序向iptables添加了另一个链,并通过它过滤所有输入。 然后检查连接是否与生成加密包的机器匹配,如果是,则接受它。 否则,它像往常一样丢弃。
结论
通过设置单个数据包认证机制,您可以在连接服务器之间添加额外的安全层。 这不仅会隐藏您的SSH服务器免受随机攻击和企图暴力攻击,它也将帮助在安全漏洞被发现在受保护的服务的情况下。 这将允许您在工作时保持安全,以解决问题。
虽然单个数据包认证可能对一些用户来说太麻烦,但是为您的安全添加一个附加层是一个很好的选择。 结合常规SSH安全措施,这应该使您的隐蔽服务相当安全。