如何强化 SSH 服务器?

Las*_*sen 134 ssh security

我可以/应该采取什么措施来确保我的 SSH 服务器周围的安全是绝对不可渗透的?

这将从一开始就是社区维基,所以让我们看看人们如何保护他们的服务器。

Asa*_*ers 111

使用公钥/私钥对而不是密码进行身份验证。

  1. 为每台需要访问服务器的计算机生成一个受密码保护的 SSH 密钥:

    ssh-keygen

  2. 允许来自允许的计算机的公钥 SSH 访问:

    ~/.ssh/id_rsa.pub每台计算机上的内容复制到~/.ssh/authorized_keys服务器上的单独行中,或者ssh-copy-id [server IP address]在您授予访问权限的每台计算机上运行(您必须在提示符下输入服务器密码)。

  3. 禁用密码 SSH 访问:

    打开/etc/ssh/sshd_config,找到显示的那一行#PasswordAuthentication yes,然后将其更改为PasswordAuthentication no. 重新启动 SSH 服务器守护程序以应用更改 ( sudo service ssh restart)。

现在,通过 SSH 连接到服务器的唯一可能方法是使用与~/.ssh/authorized_keys. 使用这种方法,不关心暴力攻击,因为即使他们猜到了我的密码,它也会被拒绝。使用当今的技术,暴力破解公钥/私钥对是不可能的。

  • 这就是为什么我说“不可能”。没有人拥有这么快这么小的电脑这么长时间。“想象一下,一台沙粒大小的计算机可以针对一些加密数据测试密钥。还可以想象一下,它可以在光线穿过密钥所需的时间内测试密钥。然后考虑这些计算机的集群, “太多了,如果你用它们覆盖地球,它们将覆盖整个地球到 1 米的高度。计算机集群平均可以在 1000 年内破解一个 128 位的密钥。” (9认同)
  • “通常访问权限授予个人而不是计算机,为连接到服务器的每台潜在客户端计算机创建密钥是不合理的”有很多选项,我认为描述如何安全地将私钥传输到每个客户端似乎超出了这个问题的范围. 我没有提供所有选项,只是一个我认为人们可以理解的简单选项。“......应该在个人基础上使用,而不是按照描述的分布式方式使用”这似乎与您之前的陈述相矛盾,我没有将任何内容描述为分布式。 (7认同)
  • -1:通常访问是授予个人而非计算机的,为连接到服务器的每个潜在客户端计算机创建密钥是不合理的。根据您的建议,您的最后一条语句不正确,并且因为您没有建议为可以访问/破坏任何客户端系统的私钥设置密码短语,因此会自动授予对 SSH 服务器的访问权限。建议使用 SSH 密钥身份验证,但私钥必须得到适当保护,并且应该单独使用,而不是像描述的​​那样以分布式方式使用。 (5认同)
  • “不可能”可能有点过头了。 (5认同)

Mar*_*son 74

我会建议:

  • 使用fail2ban防止暴力登录尝试。

  • 禁用通过 SSH 以 root 身份登录。这意味着攻击者必须弄清楚用户名和密码,这使得攻击变得更加困难。

    添加PermitRootLogin no到您的/etc/ssh/sshd_config.

  • 限制可以通过 SSH 连接到服务器的用户。按组或仅特定用户。

    添加AllowGroups group1 group2AllowUsers user1 user2限制谁可以通过 SSH 连接到服务器。

  • **在重新启动 sshd 之前始终验证**您的 `sshd` 配置是否正确,以避免将自己锁定在机器之外。有关详细信息,请参阅 [此博客](https://www.cyberciti.biz/tips/checking-openssh-sshd-configuration-syntax-errors.html) - 只需在配置更改后运行 `sshd -T`,然后重新启动主`sshd`。此外,当您进行配置更改时,**在机器上打开 SSH 会话**,并且在您验证上述配置之前不要关闭它,并且可能已经完成了测试 SSH 登录。 (4认同)
  • **AllowUsers** 和 **AllowGroups** 不接受逗号 **,** 作为分隔符。确保您不要远程尝试此操作。错误地执行此操作,我一直被锁定在我的 NAS 之外。 (2认同)

小智 26

其他答案提供了安全性,但您可以做一件事,让您的日志更安静,并降低您被锁定在帐户之外的可能性:

将服务器从端口 22 移动到另一个端口。在您的网关或服务器上。

它不会提高安全性,但确实意味着所有随机的 Internet 扫描程序都不会弄乱您的日志文件。

  • 这不是关于通过默默无闻的安全性(尽管默默无闻会产生边际的积极影响)。这是关于减少无休止的蛮力尝试的背景噪音。如果您的访问失败日志充满自动攻击,您将无法有效地审核它们;考虑到攻击者的数量以及分布式(僵尸网络)和节流攻击的普遍性,fail2ban 并没有充分减少数量。在一个不寻常的端口上使用 ssh,你*知道*你在日志中看到的攻击来自对你的盒子感兴趣的真正的攻击者。我强烈推荐它。 (34认同)

Rob*_*sak 23

使用HOTPTOTP启用两因素身份验证。这从 13.10 开始可用。

这包括在此处的另一个答案中使用公钥身份验证而不是密码身份验证,但还要求用户证明除了他的私钥之外,他还持有他的第二个因素设备。

概括:

  1. sudo apt-get install libpam-google-authenticator

  2. 让每个用户运行该google-authenticator命令,该命令会生成~/.google-authenticator并帮助他们配置他们的两个因素设备(例如 Google Authenticator Android 应用程序)。

  3. 编辑/etc/ssh/sshd_config和设置:

    ChallengeResponseAuthentication yes
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive
    
    Run Code Online (Sandbox Code Playgroud)
  4. 运行sudo service ssh reload以获取对 的更改/etc/ssh/sshd_config

  5. 编辑/etc/pam.d/sshd并替换该行:

    @include common-auth
    
    Run Code Online (Sandbox Code Playgroud)

    和:

    auth required pam_google_authenticator.so
    
    Run Code Online (Sandbox Code Playgroud)

关于不同配置选项的更多详细信息是我去年的博客文章:Better two factor ssh authentication on Ubuntu


Las*_*sen 21

使 sshd 阻止未能提供正确登录信息的客户端 IP“ DenyHØsts ”可以非常有效地完成这项工作。我在我所有的 Linux 机器上都安装了这个,这些机器可以通过某种方式从外部访问。

这将确保对 SSHD 的强制攻击不会有效,但请记住 (!) 这样,如果您忘记密码,您最终可能会锁定自己。这可能是您无权访问的远程服务器上的问题。

  • 在禁止 IP 地址之前,是否有一些选项,例如 10 次失败的登录尝试? (2认同)

mpo*_*llo 20

这是一件简单的事情:安装ufw(“简单的防火墙”)并使用它来限制传入连接的速率。

在命令提示符下,键入:

$ sudo ufw limit OpenSSH 
Run Code Online (Sandbox Code Playgroud)

如果未安装ufw,请执行此操作并重试:

$ sudo aptitude install ufw 
Run Code Online (Sandbox Code Playgroud)

许多攻击者会尝试使用您的 SSH 服务器来暴力破解密码。这将每 30 秒只允许来自同一 IP 地址的 6 个连接。

  • @Mark - 好点子,但这听起来不像是一个写得不好的 SFTP 客户端吗?当他们可以打开更多 SSH 通道时,为什么他们会继续重新连接到 SSH 端口? (2认同)

qbi*_*qbi 12

如果我想要一些额外的安全性或需要访问某个公司网络深处的 SSH 服务器,我会使用匿名软件Tor设置一个隐藏服务

  1. 安装 Tor 并设置 SSH 服务器本身。
  2. 确保 sshd 只在localhost.
  3. 打开/etc/tor/torrc。设置HiddenServiceDir /var/lib/tor/sshHiddenServicePort 22 127.0.0.1:22
  4. 看看var/lib/tor/ssh/hostname。有一个像d6frsudqtx123vxf.onion. 这是隐藏服务的地址。
  5. 打开$HOME/.ssh/config并添加一些行:

    Host myhost
    HostName d6frsudqtx123vxf.onion
    ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
    
    Run Code Online (Sandbox Code Playgroud)

此外,我需要在本地主机上使用 Tor。如果已安装,我可以进入ssh myhost并且 SSH 通过 Tor 打开连接。另一端的 SSH 服务器仅在 localhost 上打开其端口。所以没有人可以通过“普通互联网”连接它。

  • 高级默默无闻的安全性,但非常有趣。 (10认同)

Huy*_*ens 8

有一篇关于这个主题的 Debian 管理文章。它涵盖了基本的 SSH 服务器配置和防火墙规则。这也可能对强化 SSH 服务器感兴趣。

请参阅那里的文章:保持 SSH 访问安全

  • 有点晚了,但是请在回答问题时复制链接中的重要部分,以便如果链接失效,信息仍然存在。 (3认同)

Tho*_*ard 6

我的 SSH 强化方法是……复杂的。以下项目是关于我如何做的,从我网络的最边缘到服务器本身。

  1. 使用已知的服务扫描程序和阻止列表中的签名通过 IDS/IPS 对流量进行边界级过滤。 我通过我的边界防火墙使用 Snort 实现了这一点(这是我的方法,一个 pfSense 设备)。有时,我无法做到这一点,例如使用我的 VPS。

  2. SSH 端口的防火墙/网络过滤。 我明确只允许某些系统访问我的 SSH 服务器。这要么通过我网络边界的 pfSense 防火墙完成,要么通过明确配置的每个服务器上的防火墙完成。但是,在某些情况下我不能这样做(几乎从来没有这种情况,除非在防火墙无助于测试的私人渗透测试或安全测试实验室环境中)。

  3. 结合我的 pfSense 或边界防火墙对内部网络进行 NAT 转换并与 Internet 和系统分离,VPN-Only Access to Servers。必须通过 VPN 进入我的网络才能访问服务器,因为没有面向 Internet 的端口。这绝对不适用于我所有的 VPS,但结合 #2,我可以通过 VPN 连接到该服务器,让一个 VPS 作为“网关”,然后允许它的 IP 连接到其他盒子。这样,我确切地知道什么可以或不可以 SSH - 我的一个盒子就是 VPN。(或者,在 pfSense 后面的家庭网络中,我的 VPN 连接,而我是唯一可以访问 VPN 的人)。

  4. 在#3 不可行的情况下,fail2ban 配置为在 4 次失败尝试后阻止并阻止 IP 一个小时或更长时间是一个不错的保护,可以防止人们不断使用暴力破解进行攻击 - 只需使用 fail2ban 自动在防火墙处阻止它们,然后就可以了。配置fail2ban虽然很痛苦......

  5. 通过更改 SSH 端口进行端口混淆。 然而,如果没有任何额外的安全措施这也不是一个好主意——“通过默默无闻来实现安全”的口头禅已经在许多情况下遭到反驳和争议。我已经与 IDS/IPS 和网络过滤一起完成了这项工作,但它本身仍然是一件非常糟糕的事情。

  6. 强制性双因素身份验证,通过Duo Security 的双因素身份验证解决方案 我的每一台 SSH 服务器上都配置了 Duo,因此为了进入,会出现 2FA 提示,我必须确认每次访问。(这是最终有用的功能 - 因为即使有人知道我的密码或闯入,他们也无法通过 Duo PAM 插件)。这是我的 SSH 服务器免受未经授权访问的最大保护之一 - 每个用户登录必须绑定到 Duo 中的配置用户,并且由于我有一个限制集,新用户不能在系统中注册。

我用两美分来保护 SSH。或者,至少,我对方法的看法。