当前位置: 首页>>技术教程>>正文


如何加强SSH服务器?

, ,

问题描述

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

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

最佳解决方案

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

  1. 为需要访问服务器的每台计算机生成一个passphrase-protected SSH密钥:ssh-keygen

  2. 允许从允许的计算机进行public-key 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中的行匹配的密钥。使用这种方法,我不在乎暴力攻击,因为即使他们猜测我的密码,它也会被拒绝。 Brute-forcing a public/private key pair is impossible采用当今的技术。

次佳解决方案

我会建议:

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

  • 禁用通过SSH以root身份登录。这意味着攻击者必须弄清楚用户名和密码使得攻击变得更加困难。将PermitRootLogin no添加到您的/etc/ssh/sshd_config

  • 限制可以通过SSH访问服务器的用户。无论是按组或只是特定的用户。添加AllowGroups group1 group2AllowUsers user1 user2以限制谁可以通过SSH连接到服务器。

第三种解决方案

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

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

它不会增加安全性,但确实意味着所有随机互联网扫描仪都不会让日志文件变得混乱。

第四种方案

使sshd块客户端IP无法提供正确的登录信息“DenyHØsts”可以非常有效地完成这项工作。我已经将这个安装在我的所有Linux机器上,这些机器可以从伟大的外部以某种方式到达。

这将确保SSHD上的force-attacks不会有效,但请记住(!)这种方式,如果忘记了密码,最终可以锁定自己。这可能是您无法访问的远程服务器上的问题。

第五种方案

使用HOTPTOTP启用双因素身份验证。这是从13.10起。

这包括使用通过密码验证的公钥验证,就像在这里的另一个答案一样,但也要求用户证明除了他的私钥之外他还持有他的second-factor-device。

概要:

  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
    

有关不同配置选项的更多详细信息,请参见去年的博客文章: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

  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服务器仅在本地主机上打开其端口。所以没有人可以通过”normal internet”连接它。

第八种方案

有关于这个主题的Debian管理文章。它涵盖了基本的SSH服务器配置以及防火墙规则。这对增强SSH服务器也很有用。

看到那里的文章:Keeping SSH access secure

第九种方案

我对SSH强化的方法很复杂。以下是我如何做到的,从我的网络的edge-most边框到服务器本身。

  1. Border-level通过具有已知服务扫描器和阻止列表中的签名的IDS /IPS过滤流量。我通过我的边界防火墙实现了这一点(这是我的方法,一个pfSense设备)。有时候,我不能这样做,比如我的VPS。

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

  3. 结合我的pfSense或边界防火墙NAT-ing将内部网络与Internet及系统分离,VPN-Only访问服务器。得到我的网络到服务器的VPN,因为没有Internet-facing端口。这绝对不适用于我所有的VPS,但是与#2一起,我可以通过VPN连入一台VPS作为’gateway’,然后允许其IP到其他机箱。这样,我确切地知道什么可以或不可以SSH在 – 我的一个盒子是VPN。 (或者,在我的家庭网络背后,pfSense,我的VPN连接,并且我是唯一一个拥有VPN访问权限的人)。

  4. 在#3不可行的情况下,fail2ban被配置为在4次失败尝试后阻止并阻止IP达一小时或更长时间,这对于经常使用bruteforcing进行攻击的人来说是一种体面的保护措施 – 只需在fail2ban和meh自动阻止防火墙。配置fail2ban虽然很痛苦……

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

  6. MANDATORY Two-Factor认证,通过Duo Security’s Two-Factor Authentication solutions。我的每台SSH服务器上都配置了Duo,这样即使进入2FA提示,我也必须确认每个访问。 (这是最终有用的功能 – 因为即使有人拥有我的密码或中断,他们也无法通过Duo PAM插件)。这是我的SSH服务器防止未经授权访问的最大保护之一 – 每个用户登录都必须与Duo中的配置用户绑定,并且由于我有限制性设置,因此系统中无法注册新用户。

我的two-cents保护SSH。或者,至少,我对待方法的想法。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/444.html,未经允许,请勿转载。