赞
踩
大多数基础设施部署都包含应受到保护且不允许 Internet 上的任何人登录的系统。今天,我将介绍几种不同的方法来保护跳转主机(也称为堡垒主机),它可以用作安全基础设施环境的入口点。
使用跳转主机时,内部系统可以将防火墙规则配置为仅允许来自跳转主机的 SSH 访问,或者跳转主机可以有两个 NIC,一个在公共 Internet 上,另一个在您的内部网络上。
以 root开头的命令示例#
以 root 身份$
运行,并以普通用户身份运行。
- # apt update && apt upgrade -y
- # reboot
我还建议创建一个不能使用 sudo 的新用户,以尽量减少潜在的危害。如果您出于某种原因需要管理系统,您可以使用此低权限用户登录,然后在本地升级为root
使用su
. 为了使它起作用,我们还需要在 root 帐户上设置密码。如果您的 VM 已经有一个具有sudo
权限的标准用户,则应该创建另一个没有sudo
权限的用户。
添加lowpriv
用户时,请随时将所有用户信息字段留空,或根据自己的喜好填写。
- # passwd
- # adduser lowpriv
在向 SSH 进行身份验证时,最常见的身份验证方案是提供密码。但是,您也可以使用 SSH 密钥对自动连接而无需密码(解锁私钥除外,可选但推荐)。
如果您的系统上还没有生成 SSH 密钥对,您可以通过在本地系统上运行以下命令来生成一个:
$ ssh-keygen -t ed25519
现在,将您的公钥添加到lowpriv
用户上,这样您就不会在下一部分重新配置时被锁定sshd
(确保填写ssh-pub-key-here
占位符)。
- # su - lowpriv
-
- (we are now in a new shell as the lowpriv user)
- $ mkdir .ssh
- $ echo "ssh-pub-key-here" >> .ssh/authorized_keys
- $ chmod 600 .ssh/authorized_keys
- $ exit
现在,确保您可以使用密钥对以lowpriv
用户身份通过 SSH 连接到跳转主机 VM,然后再继续。
在上述情况下,私钥存在于您的计算机上,并且必须将其传输到您的其他计算机(更方便)或必须在其他计算机上生成额外的密钥对(更安全)。然而,一家名为Krypton的初创公司(最近被 Akamai 收购)开发了一种新技术,使私钥材料能够使用 iOS 上的 Secure Enclave 或 Android 上的 Keystore 保存在您的手机上,以保护您的密钥,并使您能够通过以下方式控制访问每次请求密钥时推送通知。我刚开始使用它,并真正享受到我的身份验证中增加的安全性/可见性,并将在我的大部分基础设施中推出它。
Krypton 旨在保护常见网站的 MFA,但如果您在手机上的应用程序中启用开发人员模式,您也可以设置 SSH 和 PGP。我不会在这篇文章中深入介绍它的设置,但它非常简单,我强烈推荐它。
重要提示:在对 SSH 配置进行以下修改之前,请确保您已经以lowpriv
用户身份测试了日志记录,因为在本节中,我们将禁止任何其他帐户使用 SSH。
我在我的设置以下选项 /etc/ssh/sshd_config
:
Port 31337
: 将 SSH 移至非标准端口。这并没有提供太多的安全性,但它可以阻止愚蠢的 SSH 暴力破解程序访问 SSH 端口。LogLevel VERBOSE
:增加日志详细程度PermitRootLogin no
:禁用root登录PubkeyAuthentication yes
:使用密钥对启用身份验证AuthorizedKeysFile .ssh/authorized_keys
: 用于授权公钥的硬编码目录(扩展为$HOME/.ssh/authorized_keys
)HostbasedAuthentication no
: 禁用主机认证IgnoreRhosts yes
: 明确禁用.rhosts
文件PasswordAuthentication no
:禁用基于密码的身份验证PermitEmptyPasswords no
:禁用空密码(这并不重要,因为我们禁用了密码验证,但额外的冗长不会受到伤害)ChallengeResponseAuthentication no
:禁用挑战/响应身份验证UsePAM yes
: 启用 PAM 模块AllowAgentForwarding yes
: 允许 SSH 客户端转发 SSH 代理以将此主机用作代理GatewayPorts no
: 禁用 SSH 远程转发X11Forwarding no
:禁用 X11 转发。根据您的用例,您可能需要启用此功能。PrintMotd no
:禁用打印 MOTD。这可以根据您的喜好启用/配置。AcceptEnv LANG LC_*
: 接受来自 SSH 客户端的语言环境变量AllowUsers lowpriv
:将lowpriv
用户列入白名单。这(与 结合使用PermitRootLogin no
)有效地禁止所有其他用户通过 SSH 登录。这是最终的配置:
- Port 31337
-
- LogLevel VERBOSE
-
- PermitRootLogin no
- PubkeyAuthentication yes
- AuthorizedKeysFile .ssh/authorized_keys
- HostbasedAuthentication no
- IgnoreRhosts yes
- PasswordAuthentication no
- PermitEmptyPasswords no
- ChallengeResponseAuthentication no
- UsePAM yes
-
- AllowAgentForwarding yes
- GatewayPorts no
- X11Forwarding no
- PrintMotd no
- AcceptEnv LANG LC_*
-
- AllowUsers lowpriv
接下来,我将设置iptables
为我们的防火墙软件,以防止连接到系统上的其他端口。这不是超级必要的,因为它是我们系统上运行的唯一可公开访问的守护程序,但配置防火墙始终是一个好主意,尤其是在这样的安全敏感上下文中。应用这些规则的顺序很重要,因为很容易将自己锁定在具有错误iptables
规则的系统之外(根据经验)。
- # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- # iptables -I INPUT -p tcp -m state --state NEW --dport 31337 -j ACCEPT
-
- (if you don't want the host to respond to ping, this rule isn't necessary)
- # iptables -A INPUT -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT
-
- # iptables -A INPUT -i lo -j ACCEPT
- # iptables -A INPUT -j DROP
现在,测试您是否仍然可以通过 SSH 进入系统。如果不是,请重新启动系统,这将导致规则被删除,并排除应用防火墙规则的故障。
一旦你得到了你喜欢的规则,保存它们,这样它们在重启时仍然存在:
- # apt install iptables-persistent netfilter-persistent
- # iptables-save > /etc/iptables/rules.v4
- # systemctl restart netfilter-persistent
- # systemctl enable netfilter-persistent
重新启动您的 VM 以确保正确保留防火墙规则(您可以使用 检查当前规则状态iptables -L
)
fail2ban
是一种流行的工具,用于通过分析应用程序日志和动态创建防火墙规则来阻止行为不端的 IP 来防止暴力攻击。
首先,您需要安装软件包并启动守护进程:
- # apt install -y fail2ban
- # systemctl start fail2ban
- # systemctl enable fail2ban
现在,将 SSH 监狱配置写入/etc/fail2ban/jail.d/sshd.conf
:
- [sshd]
- enabled = true
- port = 31337
- filter = sshd
- logpath = /var/log/auth.log
- maxretry = 3
- findtime = 60
- bantime = 1800
这配置fail2ban
为在 处查看 SSH 身份验证日志/var/log/auth.log
,如果一个 IP 地址在 60 秒内 3 次身份验证失败,则它们将被阻止 1800 秒(30 分钟)。随意根据自己的喜好调整这些值。
最后,重新启动fail2ban
守护进程以应用新的 jail 配置:
systemctl restart fail2ban
现在,您可以通过 SSH 连接到跳转主机,然后启动另一个 SSH 连接到您的目的地:
- zander@mypc:~$ ssh -p31337 lowpriv@jumphost
- ...
- lowpriv@jumphost:~$ ssh root@secretserver
- ...
- root@secretserver:~#
但是,我们可以对使用跳转主机进行一些改进。
上述身份验证工作流程缓慢且效率低下,需要额外的凭据才能驻留在跳转主机上,并且不适合自动化。SSH 有许多非常酷的特性,其中之一就是代理转发。使用以下 SSH 配置,我们可以使用一个命令自动通过跳转主机代理到我们的最终目的地:
- Host jump
- HostName jumphost
- User lowpriv
- Port 31337
- IdentityFile ~/.ssh/id_ed25519
-
- Host secret
- HostName secretserver
- User root
- IdentityFile ~/.ssh/id_ed25519
- ProxyJump jump
- zander@mypc:~$ ssh secret
- ...
- root@secretserver:~#
但是,这有几个注意事项
secretserver
中包含您的本地公钥。authorized_keys
上面的配置使用了起点的认证,而不是跳转主机上的密钥对跳转主机的另一个有价值的用例是允许从本地机器访问内部资源。这也可以使用 SSH 本地端口转发,它可以在连接时在命令行或 SSH 配置文件中进行配置。
以下是如何在运行时进行配置(使用上述 SSH 配置中的 jumphost):
ssh -L 8080:myhost.com:80 jump
现在,您可以像在跳转主机上一样连接localhost:8080
和访问。myhostcom:80
警告:默认情况下,-L 8080:myhost.com:80
建立一个侦听0.0.0.0:8080
器,允许您网络上的任何人通过端口 8080 连接到您的系统并转发到远程系统。强烈建议配置 with-L 127.0.0.1:8080:myhost.com:80
以限制转发服务的暴露。
您也可以在您的 SSH 配置中进行配置(这与 相同-L 127.0.0.1:8080:myhost.com:80
):
- Host jump
- HostName jumphost
- User lowpriv
- Port 31337
- IdentityFile ~/.ssh/id_ed25519
- LocalForward 127.0.0.1:8080 myhost.com:80
这对于访问内部网站和 RDP 服务器特别有用。
一旦你测试了远程系统的连接,就应该设置防火墙规则来限制仅从跳转主机访问 SSH 守护程序,否则几乎不会增加安全性。
您可以使用以下方法执行此操作iptables
(确保替换jump-ip-here
为您的实际跳转主机 IP):
- # iptables -A INPUT -p tcp --dport 22 -s jump-ip-here -j ACCEPT
- # iptables -A INPUT -p tcp --dport 22 -j DROP
在测试以确保这些规则正确删除外部连接并允许来自跳转主机的连接后,通过执行以下操作确保规则将在重新启动后持续存在(安装命令将在不同的发行版上有所不同):
- # apt install iptables-persistent netfilter-persistent
- # iptables-save > /etc/iptables/rules.v4
- # systemctl restart netfilter-persistent
- # systemctl enable netfilter-persistent
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。