如何强化SSH服务器?

可以/应该采取哪些措施来确保SSH服务器周围的安全性绝对不可渗透?

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

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

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

    ssh-keygen

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

    将每台计算机上~/.ssh/id_rsa.pub的内容复制到服务器上~/.ssh/id_rsa.pub的各行中,或者在您授予访问权限的每台计算机上运行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中的行匹配的键。 使用这种方法, 不关心暴力攻击,因为即使他们猜测我的密码,它也会被拒绝。 使用当今的技术, 强制使用公钥/私钥对是不可能的。

我会建议:

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

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

    PermitRootLogin no添加到/etc/ssh/sshd_config

  • 限制可以SSH到服务器的用户。 由组或只是特定用户。

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

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

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

它不会增加安全性,但确实意味着所有随机互联网扫描程序都不会使您的日志文件混乱。

使sshd块客户端IP无法提供正确的登录信息“ DenyHØsts ”可以非常有效地完成这项工作。 我已经在我的所有Linux机器上安装了这些机箱,这些机箱可以通过外部设备进行访问。

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

使用HOTP或TOTP启用双因素身份validation。 从13.10开始提供。

这包括使用密码认证的公钥认证,如此处的另一个答案,但也要求用户certificate他除了他的私钥之外还拥有他的第二因素设备。

摘要:

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

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

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

     ChallengeResponseAuthentication yes PasswordAuthentication no AuthenticationMethods publickey,keyboard-interactive 
  4. 运行sudo service ssh reload以获取对/etc/ssh/sshd_config更改。

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

     @include common-auth 

    有:

     auth required pam_google_authenticator.so 

关于不同配置选项的更多细节是我去年的博客文章: 在Ubuntu上更好的双因素ssh身份validation 。

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

从命令提示符处,键入:

 $ sudo ufw limit OpenSSH 

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

 $ sudo aptitude install ufw 

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

如果我想要一些额外的安全性或需要访问某些公司网络内部的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 

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

有一个关于这个主题的Debian Administration文章。 它包括基本的SSH服务器配置和防火墙规则。 这对于强化SSH服务器也是有意义的。

请参阅文章: 保持SSH访问安全 。

我的SSH强化方法是……复杂的。 以下项目就我的工作方式而言,从我网络的最边缘到服务器本身。

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

  2. SSH端口的防火墙/网络过滤。 我明确地只允许某些系统进入我的SSH服务器。 这可以通过我网络边界的pfSense防火墙或明确配置的每台服务器上的防火墙完成。 有些情况下我无法做到这一点(几乎从来没有这种情况,除非在私有笔测试或安全测试实验室环境中防火墙无法帮助测试)。

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

  4. 在#3不可行的情况下, fail2ban,配置为在4次尝试失败后阻止并阻止IP一小时或更长时间,这是对人们不断用强制攻击进行攻击的好方法 – 只需使用fail2ban自动阻止防火墙,以及meh。 配置fail2ban虽然很痛苦……

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

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

我保证SSH的两分钱。 或者,至少,我对方法的看法。

您可能想要从RedHat结帐FreeOTP应用,而不是使用Google身份validation器。 有时在更新应用时,他们会将您锁定! 😉

如果您想使用其他硬件令牌,如Yubikey或eToken PASS或NG,或者如果您有许多用户或许多服务器,您可能需要使用开源双因素身份validation后端。

最近我写了一个关于这个的howto 。

我最近写了一篇关于这样做的小教程。 基本上,您需要使用PKI,我的教程还展示了如何使用双因素身份validation以获得更高的安全性。 即使你不使用这些东西,也有一些关于通过删除弱密码套件和其他基础知识来保护服务器的花絮。 https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/

对于大量用户/证书,请考虑LDAP集成。 大型组织使用LDAP作为存储在徽章或密钥卡上的用户凭证和证书的存储库,无论证书是用于身份validation还是签名电子邮件。 示例包括openLDAP,openDJ,Active Directory,Oracle通用目录,IBM Directory Server,snareWorks ……

还可以在LDAP中管理计算机和组,从而提供中央凭证管理。 这样可以帮助办公桌一站式处理大量人群。

这是centOS集成的链接: http : //itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html

您还可以使用geoIP数据库根据原始国家/地区进行阻止。

基本上如果你住在美国,那么俄罗斯没有理由连接你的SSH,这样他们就会被自动阻止。

该脚本可在此处找到: https : //www.axllent.org/docs/view/ssh-geoip/

你也可以添加iptables命令(我为我的飞溅做了)来自动丢弃这些IP的所有流量。