实现 Jump Box 以访问您的网络资源。






4.20/5 (2投票s)
安全的 Jump Box,用于从远程位置访问您的网络基础设施。
引言
跳板服务器(jump server)、跳板主机(jump host)或跳板机(jumpbox)是网络中一种(专用)计算机,通常用于访问位于不同安全区域内的设备。最常见的例子是从受信任的网络或计算机管理DMZ中的主机。这可能包括从远程位置访问您的家庭网络,通过VPN在公共场所使用移动设备访问互联网等等。
在本文中,我将演示一些DevOps混搭——如何结合四个Ansible角色来构建基于Ubuntu的跳板机。
让我们简要说明我们的目标
- 执行基础服务器加固(例如,防火墙、仅限密钥登录、禁止失败的SSH尝试、为进一步配置做准备)
- 可选安装PPTP VPN服务
- 可选安装OpenVPN VPN服务
- 可选安装SoftEther VPN作为OpenVPN VPN服务的替代方案
- 如果您想更加安全,可以通过端口敲门(port knocking)增加额外的安全级别。这将使端口扫描器更难检测您服务器上的服务,尽管进入会更复杂。
基础服务器加固
如今,部署已从裸机服务器转向快速启动的虚拟机,例如Amazon、Digital Ocean、基于OpenStack的提供商提供的虚拟机。因此,服务器的配置不再需要手动管理步骤。至少在时间和金钱上是过度消耗的。其中一个选项是使用即用型预配置服务器镜像。另一种方法是从初始系统重启开始,并使用Ansible或Chef等配置工具根据项目需求进行配置。
进行自定义配置的第一步是执行基本的服务器加固,因为在某些情况下,您会获得一台全新安装并带有root密码的服务器。
让我与您分享一个快速的基础服务器加固方案,这应该适用于大多数Web部署。
我通常的做法是:严格禁止使用密码进行SSH登录,并确保只使用强密钥。如果我将SSH端口暴露给公共网络,我建议安装像file2ban这样的工具——一个用于禁止导致多次认证错误的守护进程。在我家的跳板机上,黑名单几年内已超过10万个主机,因此我甚至不得不通过禁止更大的网络来压缩列表以缩短它。
对于跳板机而言,保持服务正常运行很重要,我还可能推荐安装monit工具——用于对Unix系统、网络和云服务进行轻量级主动监控。
因此,我们混搭中的第一个组件是sa-box-bootstrap角色,可以在这里找到。
您需要修改以下参数:deploy_user
(与root不同的用户,将用于服务器访问/配置)。难以猜测的用户会提高您服务器的安全性。根据您计划在跳板机上运行的服务,您还可以预配置一些防火墙规则。例如,我们将使用22 SSH;500/4500 - 带IPSec的SoftEther;1194 - OpenVPN;1723 - PPTP;
角色本身提供了更多配置选项,但超出了当前示例的范围。
my_deploy_user: slavko
my_deploy_authorized_keys:
- "~/.ssh/id_rsa.pub"
# revise port list for your use , consider securing by custom_ufw_rules_allow_from_hosts
custom_ports_allow:
- {
port: 22,
proto: tcp
}
- {
port: 500,
proto: udp
}
- {
port: 4500,
proto: udp
}
- {
port: 1194,
proto: tcp
}
- {
port: 1723,
proto: tcp
}
因此,我们的引导部分将是
roles:
- {
role: "sa-box-bootstrap",
deploy_user: "{{my_deploy_user}}",
deploy_user_authorized_keys: "{{my_deploy_authorized_keys}}",
ufw_rules_allow: "{{custom_ports_allow}}"
}
一旦这个剧本执行完毕,我们将拥有运行中的ufw防火墙,file2ban
准备好防护,monit准备好监控。您的部署用户也将配置好以便使用Ansible进行进一步配置。
可选的PPTP VPN
即使PPTP被认为是一种弱VPN协议,但它对于没有经验的用户来说是最容易配置的。因此,我通常会为我的客户启用它,但会强制执行更严格的密码轮换策略+密码强度本身。对于家庭使用,我只需设置足够长的随机密码+额外使用端口敲门进行保护。
对于PPTP,我们将在混搭中使用sa-vpn-pptp
角色,可以在这里找到。
要配置该角色,我们只需要传递要创建的用户列表和使用的防火墙类型。(目前支持IPTables
或ufw
)。
custom_pptp_vpn_users:
- {
name: "my_user",
password: "my_password"
}
我们的PPTP VPN设置部分将是
roles:
- {
role: "sa-vpn-pptp",
pptp_vpn_users: "{{custom_pptp_vpn_users}}",
firewall_used: "ufw",
when: option_jumpbox_pptp
}
在角色执行结束时,我们的PPTP服务器将启动。
可选的OpenVPN VPN
OpenVPN被认为比PPTP强得多,并且被认为对于企业部署来说是安全的。对于OpenVPN,我们将在混搭中使用sa-vpn-openvpn
角色,可以在这里找到。
要配置该角色,我们只需要传递要创建的用户列表和使用的防火墙类型。(目前支持IPTables
或ufw
)。
custom_openvpn_vpn_users:
- {
name: "my_user"
}
如果您在上述配置中指定了密码,它将设置为密钥密码,每次访问时都会要求输入。
我们的OpenVPN设置部分将是
roles:
- {
role: "sa-vpn-openvpn",
openvpn_vpn_users: "{{custom_openvpn_vpn_users}}",
firewall_used: "ufw",
when: option_jumpbox_openvpn
}
在剧本执行结束时,playbook会为每个您请求的用户下载OpenVPN配置文件。现在,分发密钥是您的责任。如果您为个人使用创建跳板机,很可能只需要一个密钥。
有关使用OpenVPN的更多具体信息,可以在角色GitHub仓库中找到。
可选的SoftEther VPN
SoftEther VPN(“SoftEther”意为“软件以太网”)是世界上最强大、最易于使用的多协议VPN软件之一。它可在Windows、Linux、Mac上运行。SoftEther VPN是开源的。您可以免费将SoftEther用于任何个人或商业用途。
据信它能够通过项目基础设施在NAT后工作,并且有时,从Windows系统连接它更容易。支持的VPN协议数量更多:SoftEther VPN协议(基于HTTPS的以太网)、OpenVPN(L3模式和L2模式)、L2TP/IPsec、MS-SSTP(Microsoft Secure Socket Tunneling Protocol)、L2TPv3/IPsec、EtherIP/IPsec。请注意,如果您的Windows计算机位于NAT后面,您将需要额外的注册表调整才能连接到IPSec VPN。
也就是说,如果您选择SoftEther,您可以以更多方式连接到您的跳板机。此外,如果您选择SoftEther,则不应使用sa-vpn-openvpn
剧本。
对于SoftEther,我们将在混搭中使用sa-vpn-softether
角色,可以在这里找到。
该角色可以通过您自己的SoftEther设置脚本进行配置,但默认情况下它会配置OpenVPN和IPSec部分。
custom_softether_vpn_users:
- {
name: "my_user",
password: "my_password"
}
custom_softether_ipsec_presharedkey: "[1KH;+r-X#cvhpv7Y6=#;[{u"
我们的SoftEther设置部分将是
roles:
- {
role: "sa-vpn-softether",
softether_vpn_users: "{{custom_softether_vpn_users}}",
softether_ipsec_presharedkey: "{{custom_softether_ipsec_presharedkey}}",
firewall_used: "ufw",
when: option_jumpbox_softether
}
有关使用SoftEther的更多具体信息,可以在角色GitHub仓库中找到,甚至更多信息可以在项目文档中找到。
与OpenVPN角色类似,您会发现连接详细信息已下载到您的本地计算机,以供进一步分发。
可选的端口敲门
从定义上讲,服务器是作为提供服务以及使应用程序和资源对用户可用的方式而实现的。然而,任何连接到互联网的计算机都不可避免地成为恶意用户和脚本的目标,这些用户和脚本希望利用安全漏洞。
防火墙存在并且应该用于阻止对未被服务利用的端口的访问,但仍然存在一个问题:对于您希望访问但又不想向所有人公开的服务应该如何处理。您希望在需要时能够访问,但在不需要时将其阻止。
端口敲门是一种隐秘的方法,用于外部打开防火墙默认关闭的端口。它通过要求对一系列预定义的关闭端口进行连接尝试来实现。从端口扫描的角度来看,您可以使您的主机完全静默。
有几种用于端口敲门的实用程序。我发现一个名为knockd
的实用程序非常健壮。
因此,为了实现端口敲门安全,我们将在混搭中使用sa-port-knock
角色,可以在这里找到。
要配置端口规则,我们将需要如下配置:“在5秒内依次敲击端口16000、15000、17000,为您的地址打开ssh端口10秒”。
您可以使用更复杂的规则,例如通过敲门密码关闭等。请查阅knockd
文档。非常感谢您对角色的拉取请求。
custom_knock_ports:
- {
"name": "ssh",
"sequence": "16000, 15000, 17000",
"seq_timeout": 5,
"port": 22,
"protocol": "tcp",
"tcpflags": "syn",
"cmd_timeout": 10
}
我们的端口敲门守护进程设置部分将是
roles:
- {
role: "sa-port-knock",
knock_ports: "{{custom_knock_ports}}",
when: option_jumpbox_port_knock
}
Using the Code
完整代码的实际应用可在GitHub上此处找到。它默认配置了带有PPTP/OpenVPN/SSH密钥的跳板机,但可以使用选项开关进行调整,以部署上述组合。
option_jumpbox_pptp: true # install classic PPTP server
option_jumpbox_openvpn: true # install OpenVPN server
option_jumpbox_softether: false # install openvpn SoftEther server (+ few more targeting windows)
option_jumpbox_port_knock: false # configure portknocking
关注点
您可以重用此Playbook来创建您自己的跳板机引导项目,并重用该角色以通过Ansible以安全的方式更快地配置您的环境。
适用于家庭/小型团队使用。对于企业使用——请确保您了解自己在做什么,因为您的公司可能需要遵循不同的程序。