it-swarm.cn

如何强化SSH服务器?

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

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

128
LassePoulsen

使sshd块客户端IP无法提供正确的登录信息“ DenyHØsts ”可以非常有效地完成这项工作。我已经在我的所有Linux机器上安装了这些机箱,这些机箱在某种程度上可以通过外部设备访问。

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

21
LassePoulsen

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

  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中的一行匹配的密钥。使用这种方法,I不关心暴力攻击,因为即使他们猜测我的密码,它也会被拒绝。 强制公钥/私钥对是不可能的 使用今天的技术。

108
Asa Ayers

我会建议:

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

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

    PermitRootLogin no添加到/etc/ssh/sshd_config

  • 限制可以SSH到服务器的用户。由组或只是特定用户。

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

72
Mark Davidson

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

将服务器从端口22移动到另一个端口。在您的网关或服务器上。

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

24
Douglas Leeder

使用 HOTPTOTP 启用双因素身份验证。从13.10开始提供。

这包括在密码认证中使用公钥认证,如此处的另一个答案,但也要求用户证明除了他的私钥之外他还拥有他的第二因素设备。

摘要:

  1. Sudo apt-get install libpam-google-authenticator

  2. 让每个用户运行google-authenticator命令,该命令生成~/.google-authenticator并帮助他们配置他们的双因素设备(例如Google Authenticator Android app)。

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

23
Robie Basak

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

从命令提示符,键入:

$ Sudo ufw limit OpenSSH 

如果未安装fw,请执行此操作并重试:

$ Sudo aptitude install ufw 

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

20
mpontillo

如果我想要一些额外的安全性或需要访问某些公司网络内部的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服务器仅在localhost上打开其端口。所以没有人可以通过“普通互联网”连接它。

12
qbi

有一个关于这个主题的Debian Administration文章。它包括基本的SSH服务器配置和防火墙规则。这也可能对加强SSH服务器感兴趣。

请参阅文章: 保持SSH访问安全

8
Huygens

我对SSH强化的方法是......复杂的。以下项目就我的工作方式而言,从我的网络边缘最边界到服务器本身。

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

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

  3. 结合我的pfSense或边界防火墙NAT内部网络并与Internet和系统分离,VPN-Only Access to Servers。有VPN到我的网络到达服务器,因为没有这样的面向互联网的端口。这绝对不适用于我的所有VPS,但与#2结合使用,我可以通过VPN连接到该服务器,将一个VPS作为“网关”,然后允许其IP到其他框。这样,我确切地知道什么可以或不可以SSH - 我的一个盒子就是VPN。 (或者,在我的家庭网络中,在pfSense后面,我的VPN连接,我是唯一一个具有VPN访问权限的人)。

  4. 在#3不可行的地方,fail2ban,配置为在4次尝试失败后阻止并阻止IP一小时或更长时间是一个体面的保护,以防止人们不断使用强制攻击进行攻击 - 只需使用fail2ban自动阻止防火墙,meh。配置fail2ban虽然很痛苦......

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

  6. MANDATORY双因素身份验证,通过 Duo Security的双因素身份验证解决方案我的每个SSH服务器都配置了Duo在它上面,为了甚至进入,2FA提示发生,我必须确认每次访问。 (这是最终有用的功能 - 因为即使有人有我的密码或中断,他们也无法通过Duo PAM插件)。这是我的SSH服务器上未经授权访问的最大保护之一 - 每个用户登录必须绑定到Duo中的已配置用户,并且由于我有一个限制性设置,因此系统中不能注册新用户。

我保证SSH的两分钱。或者,至少,我对方法的看法。

6
Thomas Ward

您可能想要从RedHat结帐FreeOTP应用,而不是使用Google身份验证器。有时在更新应用程序时,他们会将您锁定! ;-)

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

最近我写了一个 关于这个的方法

1
cornelinux

对于大量用户/证书,请考虑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
weller1

您还可以使用geoIP数据库根据原始国家/地区进行阻止。

基本上如果你住在美国,那么俄罗斯没有理由连接到你的SSH,这样他们就会被自动阻止。

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

你也可以添加iptables命令(我为我的飞溅做了),自动丢弃这些IP的所有流量。

0
Michael A Mike

我最近写了一个关于这样做的小教程。基本上,您需要使用PKI,我的教程还演示了如何使用双因素身份验证以获得更高的安全性。即使你不使用这些东西,也有一些关于通过删除弱密码套件和其他基础知识来保护服务器的花絮。 https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/

0
01000101