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

评论

绝对不可渗透性需要关闭包装盒。

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

问题可能出在局域网部分...局域网唤醒软件包未路由,因此您必须有权访问局域网内的计算机才能发送WOL软件包...

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

#1 楼

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



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

ssh-keygen


允许从允许的计算机上进行公钥SSH访问:

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


禁用SSH密码访问:

打开/etc/ssh/sshd_config,找到显示以下内容的行#PasswordAuthentication yes,并将其更改为PasswordAuthentication no。重新启动SSH服务器守护程序以应用更改(sudo service ssh restart)。现在,唯一可以通过SSH进入服务器的方法是使用与~/.ssh/authorized_keys中的一行匹配的密钥。使用这种方法,我不在乎暴力攻击,因为即使他们猜测了我的密码,它也会被拒绝。当今的技术不可能强行强制使用公钥/私钥对。

评论


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

–JoãoPinto
2010年8月14日在18:41

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

–艾莎·艾尔斯(Asa Ayers)
2010年8月15日,下午3:17

“不可能”也许有点过分了。

–索比昂·拉文·安德森(ThorbjørnRavn Andersen)
10年8月16日在15:46

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

–艾莎·艾尔斯(Asa Ayers)
10年8月16日在16:22

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

– Maximillian Laumeister
18/12/6在19:37

#2 楼

我建议:


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

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

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


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

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



评论


AllowUsers和AllowGroups不接受逗号作为定界符。确保您不要远程尝试此操作。通过不正确的操作,我一直无法进入NAS。

–无声的噪音
2015年4月21日在19:42



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

– RichVel
17年8月10日在5:47



#3 楼

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

从端口22移动服务器到另一个。无论是在网关还是服务器上。

评论


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

–拉瑟·波尔森
2010年8月15日上午10:19

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

– bobince
2010-10-12在0:19



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

– Andrei C
17年8月2日在13:38

Shodan并未捕获所有的65k端口,因此更改为高端口可能会将其从扫描中删除。另外,如果您移至随机的高端口,则攻击者可能需要进行65K TCP扫描(非常嘈杂)才能找到服务以开始对其进行攻击。从安全性的角度来看,这两者都是胜利,因此,迁移到高端口通常是一个好计划。另一个问题是,通过移至较高的端口,您可以更好地了解有人在攻击您是针对您的系统,而不是一般的背景In​​ternet噪声

–罗里·麦库恩(Rory McCune)
17/12/23在8:51

#4 楼

使用HOTP或TOTP启用两因素身份验证。从13.10开始,这是可用的。

这包括使用公共密钥身份验证而不是密码身份验证,如此处的另一个答案所示,还要求用户证明他除了拥有私钥之外还拥有第二要素设备。摘要:sudo apt-get install libpam-google-authenticator
让每个用户运行google-authenticator命令,该命令生成~/.google-authenticator,并帮助他们配置两个因子设备(例如, Google身份验证器Android应用)。

编辑/etc/ssh/sshd_config并设置: >
编辑sudo service ssh reload并替换以下行:

ChallengeResponseAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive


与:

@include common-auth

/>关于不同配置选项的更多详细信息是我去年的博客文章:在Ubuntu上更好的两因素ssh身份验证。

#5 楼

使未能提供正确登录信息的sshd阻止客户端IP“DenyHØsts”可以非常有效地完成此工作。我已经在所有Linux机器上安装了此工具,可以从外部通过某种方式访问​​它。这样,如果您忘记密码,最终将自己锁定在自己之外。在您无权访问的远程服务器上,这可能是个问题。

评论


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

–sayantankhan
2014年2月26日14:48在

#6 楼

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

在命令提示符下,键入:

$ sudo ufw limit OpenSSH 


如果未安装ufw,请执行此操作并重试: />
$ sudo aptitude install ufw 


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

评论


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

–马克·戴维森
2010年8月15日在9:40

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

– mpontillo
10年8月24日在4:32

#7 楼

如果我想获得一些额外的安全性或需要访问某些公司网络内部的SSH服务器,可以使用匿名软件Tor来设置隐藏服务。
确保sshd仅侦听localhost
打开/etc/tor/torrc。设置HiddenServiceDir /var/lib/tor/sshHiddenServicePort 22 127.0.0.1:22
var/lib/tor/ssh/hostname。有一个类似d6frsudqtx123vxf.onion的名称。这是隐藏服务的地址。

打开$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上打开其端口。因此,没有人可以通过“普通互联网”连接它。

评论


安全性由高级默默无闻提供,但非常有趣。

–约翰内斯
13年8月29日在9:25

#8 楼

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

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

评论


有点晚了,但是请回答问题时,请复制链接中的重要部分,以便如果链接衰减了,信息仍在此处。

–umop aplsdn
2012年8月28日下午4:54

好主意。尽管我经历的时间很少,但参与时间却少得多。我的回答是“社区Wiki”,因此,如果有时间,请随时添加链接信息。

–惠更斯
2012年9月11日19:42

#9 楼

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


通过IDS /具有已知服务扫描程序的IPS和阻止列表中的签名。我可以通过边界防火墙(这是我的方法,pfSense设备)使用Snort实现此目的。有时候,我无法做到这一点,例如使用我的VPS。
防火墙/ SSH端口的网络过滤。我明确只允许某些系统进入我的SSH服务器。这可以通过网络边界处的pfSense防火墙来完成,也可以通过显式配置的每台服务器上的防火墙来完成。但是,在某些情况下我无法做到这一点(除了在钢笔测试或安全测试实验室环境中防火墙无法帮助测试的情况之外,几乎从来没有这种情况。)
与我的pfSense结合使用或边界防火墙,对内部网络进行NAT,并与Internet和系统分开,仅对服务器进行VPN访问。将VPN插入我的网络以到达服务器,因为没有这样的面向Internet的端口。这对于我的所有VPS绝对不是有效的,但是与#2结合使用时,我可以通过VPN连接到该服务器来使一个VPS成为“网关”,然后将其IP分配给其他服务器。这样,我确切地知道可以或不能通过SSH进行的操作-我的一个盒子就是VPN。 (或者,在我的pfSense后面的家庭网络中,我的VPN连接是我的,而且我是唯一可以访问VPN的人。)在无法执行#3的情况下,fail2ban配置为在4次失败尝试后阻止并阻止IP一个小时或更长的时间是一个不错的保护措施,可以防止人们不断用蛮力攻击-只需使用fail2ban和meh自动将它们阻止在防火墙上即可。虽然配置了fail2ban还是很麻烦的...
通过更改SSH端口进行端口混淆。但是,在没有任何其他安全措施的情况下也不是一个好主意-在许多情况下,“通过隐蔽性进行安全保护”的口号已经遭到反驳和质疑。我已经结合IDS / IPS和网络过滤完成了此操作,但单靠它仍然是一件很糟糕的事情。我的每台SSH服务器上都配置了Duo,因此为了进入,2FA提示发生,我必须确认每次访问。 (这是最终的有用功能-因为即使有人知道我的密码或有密码闯入,他们也无法越过Duo PAM插件)。这是我的SSH服务器上最大的保护措施之一,防止未经授权的访问-每个用户登录名都必须绑定到Duo中已配置的用户,并且由于我有严格的设置,因此无法在系统中注册任何新用户。

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

#10 楼

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

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

最近我写了一个howto。

#11 楼

我最近写了一个小教程。基本上,您需要使用PKI,并且我的教程还显示了如何使用双重身份验证来提高安全性。即使您不使用这些东西,也有一些通过删除弱密码套件和其他基础知识来保护服务器安全的窍门。 https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/

#12 楼

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

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

#13 楼

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

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

脚本可以在这里找到:https://www.axllent.org/docs/view/ssh-geoip/

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

评论


有时候,GeoIP数据库可能是错误的-有人问我昨天在莫斯科吗? :)

– Sean
17-10-24在12:19