如何加固SSH服务器?


128

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

从一开始这将是社区Wiki,因此让我们看看人们如何保护服务器。


44
绝对不可渗透性要求关闭包装箱。
托尔比约恩Ravn的安徒生

如果您有局域网唤醒怎么办?
重播

问题可能是局域网部分...局域网路由软件包未路由,因此您将必须访问局域网内的计算机才能发送WOL软件包...
LassePoulsen

对于密钥认证,您可以将密码限制为您真正需要的密码。

Answers:


108

使用公用/专用密钥对而非密码进行身份验证。

  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。使用这种方法,不在乎暴力攻击,因为即使他们猜出了我的密码,它也会被拒绝。当今的技术不可能强行强制使用公钥/私钥对


5
-1:通常,访问权限授予单个而非计算机,因此为连接到服务器的每台潜在客户端计算机创建一个密钥是不合理的。根据您的建议,您的最后一个陈述是不正确的,并且由于您不建议为具有访问权限或损害任何客户端系统的私钥设置密码短语,因此会自动授予对SSH服务器的访问权限。建议使用SSH密钥身份验证,但必须正确保护私钥,并且应单独使用私钥,而不是按照所述的分布式方式使用私钥。
若奥·平托

7
“通常授予个人而不是计算机访问权限,为连接到服务器的每台潜在客户端计算机创建密钥是不合理的”,有很多选择,我认为描述如何安全地将私钥转让给每个客户端似乎超出了此问题的范围。 。我并没有提供所有选项,只是我认为人们可以理解的简单选项。“ ...应单独使用,而不是按所述的分布式方式使用”这似乎与您之前的声明相抵触,我没有描述任何分布式的内容。
阿萨·艾尔斯

5
“不可能”可能有点过分了。
托尔比约恩Ravn的安徒生

9
这就是为什么我说“不可能”。没有人拥有如此之短,这么多或那么多时间的计算机。“想像一下这样一台计算机,它可以像沙粒般大小,可以对某些加密数据测试密钥。还要想象一下,它可以在光穿过密钥的时间内测试密钥。然后考虑一堆这些计算机,如此之多,如果您用它们覆盖地球,它们将覆盖整个星球,高度达到1米。计算机集群将平均在1000年内破解128位密钥。”
Asa Ayers 2010年

@ThorbjørnRavnAndersen“不可能”实际上并没有夸大其词,只要您使用一个强键即可。我现在找不到报价,但是使用当前的密钥长度,蛮力攻击是不可行的,“除非计算机由物质以外的东西组成并且占用空间以外的东西”。
Maximillian Laumeister

72

我会建议:

  • 使用fail2ban防止强行登录尝试。

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

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

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

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


2
的AllowUsersAllowGroups不接受一个逗号作为分隔符。确保不要远程尝试此操作。通过不正确地执行此操作,我一直无法进入NAS。
artless噪音

4
始终验证sshd重新启动sshd才能,以避免自己锁定了机器的配置是正确的。有关详细信息,请参见此博客 -仅sshd -T在配置更改后运行,然后重新启动主服务器sshd。另外,在进行配置更改时,请在计算机上打开SSH会话,直到您按照上述说明验证了配置并可能已经进行了测试SSH登录后,才能关闭此会话
RichVel

24

其他答案可以提高安全性,但是您可以做一件事,这将使您的日志更安静,并减少您被锁定帐户的可能性:

将服务器从端口22移至另一端口。要么在您的网关上,要么在服务器上。

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


1
对于那些因晦涩难懂而对安全性充满信心的人(en.wikipedia.org/wiki/Security_through_obscurity),使用另一个端口很有意义。我没有..
LassePoulsen

32
这与通过隐秘性实现安全无关(尽管隐秘性可能会产生边际积极影响)。这是关于减少无休止的暴力尝试的背景噪音。如果访问失败日志充满了自动攻击,则无法对其进行有用的审核;考虑到攻击者的数量以及分布式(僵尸网络)和受限制的攻击的普遍性,fail2ban不能充分减少数据量。在不寻常的端口上使用ssh,您会知道在日志中看到的攻击来自对您的设备感兴趣的真实攻击者。我强烈推荐它。
bobince 2010年

由于您可以查询shodan等互联网服务来获取面向Web的ssh服务器,或者使用nmap和标题捕获使更改默认端口几乎没有意义。我建议不要这样做。
SLow Loris

Shodan并没有抓住所有的65k端口,因此更改为高端口可能会将其从扫描中删除。同样,如果您移至随机的高端口,则攻击者可能需要进行65K TCP扫描(非常嘈杂),才能找到服务来开始对其进行攻击。从安全性的角度来看,这两者都是胜利,因此转移到高端口通常是一个好的计划。另外一个是通过移动到高端口,你可以有一个更好的想法,别人谁是攻击你是专门为反对针对您的系统,只是一般的背景噪音互联网
Rоry麦克卡尼

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
    
  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身份验证


21

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

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


2
在禁止IP地址之前,是否有一些选择,例如10次失败的登录尝试?
sayantankhan 2014年

20

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

在命令提示符下,键入:

$ sudo ufw limit OpenSSH 

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

$ sudo aptitude install ufw 

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


+1使用限制可能会很好。但是应该指出,使用内置的sftp服务器时遇到了问题,因为它也限制了连接。
马克戴维森

2
@Mark-好点,但这听起来不像是写得不好的SFTP客户端吗?当他们可以打开更多SSH通道时,为什么还要继续连接到SSH端口?
mpontillo

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
    

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


10
默默无闻的安全性,但非常有趣。
约翰内斯

8

关于该主题,有一篇Debian Administration文章。它涵盖了基本的SSH服务器配置以及防火墙规则。这对于加固SSH服务器也可能很有用。

请参阅此处的文章:保持SSH访问的安全性


3
有点晚了,但是请回答问题时,请复制链接中的重要部分,这样,如果链接衰减了,信息仍然存在。
umop aplsdn

1
好主意。虽然我经历的时间很少,但参与时间却少得多。我的回答是“社区Wiki”,因此,如果有时间,请随时添加链接信息。
惠更斯岛2012年

6

我的SSH强化方法非常复杂。从我网络的最边缘到服务器本身,以下是关于我的操作方式的项目。

  1. 通过IDS / IPS使用已知服务扫描程序对黑名单中的流量进行边界级别过滤。 我可以通过边界防火墙(这是我的方法,pfSense设备)使用Snort来实现此目的。有时,我无法做到这一点,例如使用VPS。

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

  3. 与我的pfSense或边界防火墙(对内部网络进行NAT转换并与Internet和系统分开)结合使用,仅VPN对服务器的访问。将VPN插入我的网络以到达服务器,因为没有这样的面向Internet的端口。这对于我的所有VPS绝对不是有效的,但是与#2结合使用时,我可以通过将VPN连接到该服务器来使一个VPS成为“网关”,然后将其IP分配给其他服务器。这样,我确切知道可以或不能通过SSH进行的操作-我的一个盒子就是VPN。(或者,在我的pfSense后面的家庭网络中,我的VPN连接是我的,而且我是唯一拥有VPN访问权限的人)。

  4. 在无法执行#3的情况下,fail2ban配置为在4次失败尝试后阻止并阻止IP一小时或更长时间,这可以很好地保护人们免受残酷攻击的威胁-只需使用fail2ban和meh在防火墙处自动阻止em。但是配置fail2ban确实很麻烦。

  5. 通过更改SSH端口进行端口混淆。 但是,在没有任何其他安全措施的情况下也不是一个好主意 -在许多情况下,“通过隐蔽性进行安全”的口号已经遭到驳斥和质疑。我已经结合IDS / IPS和网络过滤完成了此操作,但是仅凭它自己做起来仍然是一件非常可怜的事情。

  6. 通过Duo Security的两要素认证解决方案进行强制两要素认证 我的每台SSH服务器上都配置了Duo,因此,要进入该服务器,都会出现2FA提示,我必须确认每次访问。(这是最终的有用功能-因为即使有人知道我的密码或有密码闯入,他们也无法越过Duo PAM插件)。这是我的SSH服务器上最大的保护措施之一,可以防止未经授权的访问-每个用户登录名都必须绑定到Duo中已配置的用户,并且由于我有严格的设置,因此无法在系统中注册任何新用户。

我花了两分钱来保护SSH。或者至少是我对方法的想法。


1

您可能想从RedHat签出FreeOTP应用程序,而不是使用Google Authenticator。有时,在更新应用程序时,他们会将您拒之门外!;-)

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

最近,我写了一篇关于这件事howto



0

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

也可以在LDAP中管理计算机和组,从而提供集中的凭据管理。这样,服务台就可以拥有一站式服务来应对大量人口。

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


0

您还可以使用geoIP数据库基于原籍国进行屏蔽。

基本上,如果您居住在美国,则没有理由让俄罗斯的某人连接到您的SSH,因此它们将被自动阻止。

可以在以下位置找到该脚本:https : //www.axllent.org/docs/view/ssh-geoip/

您还可以向其中添加iptables命令(我为我的Droplet做过),以自动丢弃所有往返这些IP的流量。


1
有时候,GeoIP数据库可能是错误的-有人问我昨天在莫斯科吗?:)
肖恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.