Asa*_*ers 111
使用公钥/私钥对而不是密码进行身份验证。
为每台需要访问服务器的计算机生成一个受密码保护的 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. 使用这种方法,我不关心暴力攻击,因为即使他们猜到了我的密码,它也会被拒绝。使用当今的技术,暴力破解公钥/私钥对是不可能的。
Mar*_*son 74
我会建议:
使用fail2ban防止暴力登录尝试。
禁用通过 SSH 以 root 身份登录。这意味着攻击者必须弄清楚用户名和密码,这使得攻击变得更加困难。
添加PermitRootLogin no到您的/etc/ssh/sshd_config.
限制可以通过 SSH 连接到服务器的用户。按组或仅特定用户。
添加AllowGroups group1 group2或AllowUsers user1 user2限制谁可以通过 SSH 连接到服务器。
小智 26
其他答案提供了安全性,但您可以做一件事,让您的日志更安静,并降低您被锁定在帐户之外的可能性:
将服务器从端口 22 移动到另一个端口。在您的网关或服务器上。
它不会提高安全性,但确实意味着所有随机的 Internet 扫描程序都不会弄乱您的日志文件。
Rob*_*sak 23
使用HOTP或TOTP启用两因素身份验证。这从 13.10 开始可用。
这包括在此处的另一个答案中使用公钥身份验证而不是密码身份验证,但还要求用户证明除了他的私钥之外,他还持有他的第二个因素设备。
概括:
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
Run Code Online (Sandbox Code Playgroud)运行sudo service ssh reload以获取对 的更改/etc/ssh/sshd_config。
编辑/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。
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 个连接。
qbi*_*qbi 12
如果我想要一些额外的安全性或需要访问某个公司网络深处的 SSH 服务器,我会使用匿名软件Tor设置一个隐藏服务。
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
Run Code Online (Sandbox Code Playgroud)此外,我需要在本地主机上使用 Tor。如果已安装,我可以进入ssh myhost并且 SSH 通过 Tor 打开连接。另一端的 SSH 服务器仅在 localhost 上打开其端口。所以没有人可以通过“普通互联网”连接它。
有一篇关于这个主题的 Debian 管理文章。它涵盖了基本的 SSH 服务器配置和防火墙规则。这也可能对强化 SSH 服务器感兴趣。
请参阅那里的文章:保持 SSH 访问安全。
我的 SSH 强化方法是……复杂的。以下项目是关于我如何做的,从我网络的最边缘到服务器本身。
使用已知的服务扫描程序和阻止列表中的签名通过 IDS/IPS 对流量进行边界级过滤。 我通过我的边界防火墙使用 Snort 实现了这一点(这是我的方法,一个 pfSense 设备)。有时,我无法做到这一点,例如使用我的 VPS。
SSH 端口的防火墙/网络过滤。 我明确只允许某些系统访问我的 SSH 服务器。这要么通过我网络边界的 pfSense 防火墙完成,要么通过明确配置的每个服务器上的防火墙完成。但是,在某些情况下我不能这样做(几乎从来没有这种情况,除非在防火墙无助于测试的私人渗透测试或安全测试实验室环境中)。
结合我的 pfSense 或边界防火墙对内部网络进行 NAT 转换并与 Internet 和系统分离,VPN-Only Access to Servers。必须通过 VPN 进入我的网络才能访问服务器,因为没有面向 Internet 的端口。这绝对不适用于我所有的 VPS,但结合 #2,我可以通过 VPN 连接到该服务器,让一个 VPS 作为“网关”,然后允许它的 IP 连接到其他盒子。这样,我确切地知道什么可以或不可以 SSH - 我的一个盒子就是 VPN。(或者,在 pfSense 后面的家庭网络中,我的 VPN 连接,而我是唯一可以访问 VPN 的人)。
在#3 不可行的情况下,fail2ban 配置为在 4 次失败尝试后阻止并阻止 IP 一个小时或更长时间是一个不错的保护,可以防止人们不断使用暴力破解进行攻击 - 只需使用 fail2ban 自动在防火墙处阻止它们,然后就可以了。配置fail2ban虽然很痛苦......
通过更改 SSH 端口进行端口混淆。 然而,如果没有任何额外的安全措施,这也不是一个好主意——“通过默默无闻来实现安全”的口头禅已经在许多情况下遭到反驳和争议。我已经与 IDS/IPS 和网络过滤一起完成了这项工作,但它本身仍然是一件非常糟糕的事情。
强制性双因素身份验证,通过Duo Security 的双因素身份验证解决方案。 我的每一台 SSH 服务器上都配置了 Duo,因此为了进入,会出现 2FA 提示,我必须确认每次访问。(这是最终有用的功能 - 因为即使有人知道我的密码或闯入,他们也无法通过 Duo PAM 插件)。这是我的 SSH 服务器免受未经授权访问的最大保护之一 - 每个用户登录必须绑定到 Duo 中的配置用户,并且由于我有一个限制集,新用户不能在系统中注册。
我用两美分来保护 SSH。或者,至少,我对方法的看法。