问题描述
我可以/应该采取哪些措施来确保我的SSH服务器周围的安全绝对不可渗透?
这将从一开始就是社区wiki,让我们看看人们如何保护他们的服务器。
最佳解决方案
使用公钥/私钥对进行身份验证而不是密码。
-
为需要访问服务器的每台计算机生成一个passphrase-protected SSH密钥:
ssh-keygen
-
允许从允许的计算机进行public-key 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
中的行匹配的密钥。使用这种方法,我不在乎暴力攻击,因为即使他们猜测我的密码,它也会被拒绝。 Brute-forcing a public/private key pair is impossible采用当今的技术。
次佳解决方案
我会建议:
-
使用fail2ban来防止蛮力登录尝试。
-
禁用通过SSH以root身份登录。这意味着攻击者必须弄清楚用户名和密码使得攻击变得更加困难。将
PermitRootLogin no
添加到您的/etc/ssh/sshd_config
。 -
限制可以通过SSH访问服务器的用户。无论是按组或只是特定的用户。添加
AllowGroups group1 group2
或AllowUsers user1 user2
以限制谁可以通过SSH连接到服务器。
第三种解决方案
其他答案提供了安全性,但有一件事可以使您的日志更加安静,并使其不太可能会被锁定在您的帐户之外:
将服务器从端口22移到另一个端口。无论是在您的网关,还是在服务器上。
它不会增加安全性,但确实意味着所有随机互联网扫描仪都不会让日志文件变得混乱。
第四种方案
使sshd块客户端IP无法提供正确的登录信息“DenyHØsts”可以非常有效地完成这项工作。我已经将这个安装在我的所有Linux机器上,这些机器可以从伟大的外部以某种方式到达。
这将确保SSHD上的force-attacks不会有效,但请记住(!)这种方式,如果忘记了密码,最终可以锁定自己。这可能是您无法访问的远程服务器上的问题。
第五种方案
使用HOTP或TOTP启用双因素身份验证。这是从13.10起。
这包括使用通过密码验证的公钥验证,就像在这里的另一个答案一样,但也要求用户证明除了他的私钥之外他还持有他的second-factor-device。
概要:
-
sudo apt-get install libpam-google-authenticator
-
让每个用户运行
google-authenticator
命令,该命令生成~/.google-authenticator
并帮助他们配置他们的双因素设备(例如Google Authenticator Android应用程序)。 -
编辑
/etc/ssh/sshd_config
并设置:ChallengeResponseAuthentication yes PasswordAuthentication no AuthenticationMethods publickey,keyboard-interactive
-
运行
sudo service ssh reload
以获取对/etc/ssh/sshd_config
的更改。 -
编辑
/etc/pam.d/sshd
并替换该行:@include common-auth
有:
auth required pam_google_authenticator.so
有关不同配置选项的更多详细信息,请参见去年的博客文章:Better two factor ssh authentication on Ubuntu。
第六种方案
这是一件容易的事情:安装ufw(“uncomplicated firewall”)并使用它来限制传入连接。
在命令提示符下键入:
$ sudo ufw limit OpenSSH
如果未安装ufw,请执行此操作并重试:
$ sudo aptitude install ufw
许多攻击者会尝试使用您的SSH服务器来获取brute-force密码。这将只允许从相同的IP地址每隔30秒连接6个连接。
第七种方案
如果我想要一些额外的安全性或需要访问某些企业网络内部的SSH服务器,我使用匿名化软件Tor来设置hidden service。
-
安装Tor并设置SSH服务器本身。
-
确保sshd只听
localhost
。 -
打开
/etc/tor/torrc
。设置HiddenServiceDir /var/lib/tor/ssh
和HiddenServicePort 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服务器仅在本地主机上打开其端口。所以没有人可以通过”normal internet”连接它。
第八种方案
有关于这个主题的Debian管理文章。它涵盖了基本的SSH服务器配置以及防火墙规则。这对增强SSH服务器也很有用。
看到那里的文章:Keeping SSH access secure。
第九种方案
我对SSH强化的方法很复杂。以下是我如何做到的,从我的网络的edge-most边框到服务器本身。
-
Border-level通过具有已知服务扫描器和阻止列表中的签名的IDS /IPS过滤流量。我通过我的边界防火墙实现了这一点(这是我的方法,一个pfSense设备)。有时候,我不能这样做,比如我的VPS。
-
防火墙/网络过滤SSH端口。我明确地只允许某些系统进入我的SSH服务器。这可以通过网络边界处的pfSense防火墙或明确配置的每台服务器上的防火墙来完成。但有些情况下我无法做到这一点(除非在私人pen-testing或安全测试实验室环境中,防火墙无法帮助测试),但情况几乎从未如此。
-
结合我的pfSense或边界防火墙NAT-ing将内部网络与Internet及系统分离,VPN-Only访问服务器。得到我的网络到服务器的VPN,因为没有Internet-facing端口。这绝对不适用于我所有的VPS,但是与#2一起,我可以通过VPN连入一台VPS作为’gateway’,然后允许其IP到其他机箱。这样,我确切地知道什么可以或不可以SSH在 – 我的一个盒子是VPN。 (或者,在我的家庭网络背后,pfSense,我的VPN连接,并且我是唯一一个拥有VPN访问权限的人)。
-
在#3不可行的情况下,fail2ban被配置为在4次失败尝试后阻止并阻止IP达一小时或更长时间,这对于经常使用bruteforcing进行攻击的人来说是一种体面的保护措施 – 只需在fail2ban和meh自动阻止防火墙。配置fail2ban虽然很痛苦……
-
通过更改SSH端口进行端口混淆。但是,如果没有任何额外的安全措施,这也不是一个好主意 – 在许多情况下,“通过朦胧安全”的口号已被驳斥和争议。我已经与IDS /IPS和网络过滤一起完成了这项工作,但它仍然是一件非常糟糕的事情。
-
MANDATORY Two-Factor认证,通过Duo Security’s Two-Factor Authentication solutions。我的每台SSH服务器上都配置了Duo,这样即使进入2FA提示,我也必须确认每个访问。 (这是最终有用的功能 – 因为即使有人拥有我的密码或中断,他们也无法通过Duo PAM插件)。这是我的SSH服务器防止未经授权访问的最大保护之一 – 每个用户登录都必须与Duo中的配置用户绑定,并且由于我有限制性设置,因此系统中无法注册新用户。
我的two-cents保护SSH。或者,至少,我对待方法的想法。