SSH守护程序可能存在哪些安全问题?


14

我希望能够从外部通过SSH连接到我的Ubuntu 10.04办公室PC。因此,我正在考虑在PC上启动SSH守护程序。我应注意哪些安全问题,可能的故障,特定的配置设置等?

万一重要:这本质上只供我自己使用,我认为不会有其他人在使用它;它是在Windows 7 / Vista / XP环境下的Ubuntu 10.04 PC。


1
您可能还需要考虑安装OpenVPN,并为您的ssh连接在PC中创建VPN隧道。这样一来,您就无需向世界开放ssh端口。
Linker3000

@ Linker3000谢谢!我想一想-即使前段时间我在VPN方面经历了不愉快的经历。
ev-br

@Zhenya如果您不使用空格“ @”和用户名,则他们将收到您回复他们的通知。;)所以当我使用@Zhenya时,您会收到评论,但当我使用@ Zhenya时,您不会收到评论
BloodPhilia 2011年

@Zhenya现在您再做一次XD
BloodPhilia,2011年

@Linker,您能否详细说明为什么OpenVPN比SSH更安全?
Arjan

Answers:


20

最大的问题是人们通过SSH以计算机管理员的身份登录。如果您有容易猜到的密码,可以通过蛮力完成。

您可以采取几种安全措施,以下是设置SSH服务器时我经常采取的一些措施以及其他一些措施。

  1. 请使用强度高的密码,该密码至少(例如)由10个大写和小写字母,数字和其他字符组成。

  2. 将用户监禁到其主目录。被监禁的用户将无法访问/编辑其主目录之外的文件。因此,您的用户将无法访问/编辑关键系统文件。可以在网上找到许多有关如何监禁用户的教程。他们大多数使用JailKit。可以在此处找到此类教程的示例。或者,您也可以使用OpenSSH服务器的本机ChrootDirectory指令。可以在此处找到有关此教程的示例。

  3. 安装Fail2Ban。Fail2Ban是用于检查身份验证日志中错误条目的程序。当达到某个限制时,它将为该IP添加防火墙块一段预设的时间。在网上也找到了一些有关如何使用SSH设置Fail2Ban的在线教程,一个例子就是这个。Fail2Ban主页也包含一些不错而完整的HOWTO。

  4. 禁用通过SSH的root登录。该用户几乎可以访问系统上的每个文件,因此建议禁用其外壳程序登录。在最新版本的Ubuntu中,root用户会自动被禁用,但是无论如何禁用SSH访问都不会受到损害。这是通过编辑文件来完成的/etc/ssh/sshd_config查找下一行,并确保其前面没有#。

    #PermitRootLogin no
    
  5. 使用非标准端口(例如22),这可以通过路由器中的端口转发(例如16121-> 22而不是22-> 22)或通过使SSH守护进程在其他端口上侦听来完成。这将使您的SSH服务更不容易被恶意用户检测到。这是通过编辑文件来完成的/etc/ssh/sshd_config查找下一行,并将22更改为所需的任何端口。不要忘记以后在路由器中转发正确的端口。

    Port 22
    
  6. 请勿使用密码登录。除密码外,SSH还允许使用私钥登录。这意味着密钥存储在您的计算机上,您可以在该计算机上访问SSH计算机的SSH。尝试连接时,SSH客户端使用密钥登录服务器,而不是通过密码身份验证。身份验证密钥在密码上比密码要强得多,因此很难破解。还有一些在线教程在网上找到关于如何建立基于密钥的认证与SSH,一个例子是这一个。(如果您使用PuTTY从Windows使用SSH进行SSH,请查看此链接以获取PuTTY方法。)设置基于密钥的身份验证后,可以通过编辑文件禁用密码身份验证/etc/ssh/sshd_config 查找以下行,并确保其前面没有#。

    #PasswordAuthentication no
    
  7. 可选地,如@ Linker3000在他的评论中提到的,您可以设置到您想通过SSH访问的PC 的VPN隧道,然后禁止SSH服务器上的非本地网络访问。这样,没有VPN连接的外部设备将无法访问您的SSH服务器。可以通过拒绝所有主机,然后仅允许本地网络IP登录来完成。这是通过编辑/etc/hosts.deny并添加以下内容来完成的:

    sshd: ALL
    

    /etc/hosts.allow添加以下内容:

    sshd: 192.168.1.*
    

    IP与您的本地网络之一匹配。*是通配符,因此192.168.1.将接受所有以开头的IP地址。如果这样做不起作用,则您的发行版可能会使用ssh而不是sshd。在这种情况下,你应该尝试ssh: 192.168.1.*ssh: ALL来代替。

  8. 您只能允许特定的主机,使用/etc/hosts.allow和进行相同的操作,/etc/hosts.deny如6中所述,但是在/etc/hosts.allow添加以下行时,每个主机都应允许以空格分隔:

    sshd: {IP OF HOST TO ALLOW 1} {IP OF HOST TO ALLOW 2} {IP OF HOST TO ALLOW 3} {ETC.}
    
  9. 仅允许特定用户访问您的SSH服务器。这是通过编辑文件来完成的/etc/ssh/sshd_config查找下一行,并确保其前面没有#。如果不存在,请创建它。例如,如果只想允许john,tom和mary,请添加/编辑以下行:

    AllowUsers john tom mary
    

    例如,您也可以拒绝特定用户,如果您想拒绝对john,tom和mary的访问,请添加/编辑以下行:

    DenyUsers john tom mary
    
  10. 仅允许协议SSH2用于传入连接。SSH协议有两种版本。SSH1受安全性问题的影响,因此建议使用SSH 2。这可以通过编辑文件来强制执行/etc/ssh/sshd_config查找下一行,并确保其前面没有#。如果不存在,请创建它。

    Protocol 2,1
    

    删除,1,所以该行将

    Protocol 2
    
  11. 不允许没有设置密码的用户登录。这可以通过编辑文件来强制执行/etc/ssh/sshd_config查找下一行,并确保其前面没有#。如果不存在,请创建它。

    PermitEmptyPasswords no
    
  12. 并且尽管很简单,也许无需多说,但在多种情况下被证明是至关重要的,但仍应使软件保持最新。定期更新您已安装的软件包/软件。


=编辑完SSH配置文件后,不要忘记重启守护程序以应用更改。通过执行以下命令重新启动守护程序:

sudo /etc/init.d/ssh restart

要么

sudo /etc/init.d/sshd restart

取决于您使用的Linux发行版。


2
sudo service ssh restart在Ubuntu上。
ulidtko 2011年

@ulidtko这个问题与一个更一般的问题合并,因此我使我的回答更加笼统并适合于不同的发行版本。这几乎适用于所有发行版,但是您是对的。
BloodPhilia 2011年

@BloodPhilia非常感谢您提供如此详细且易于访问的答案!还有两点关于您的观点的问题:1.禁止用户限制权限的好处是什么?说,以“用户”身份登录,我只能对/ home以外的内容进行读取访问,而没有写或执行访问权限(我想是Ubuntu的默认设置)。比监狱更好/更糟吗?2.身份验证日志通常位于哪里?我希望能够偶尔/通过grep手动检查它们。
ev-br

@BloodPhilia 4.如果我使sshd侦听服务器上的非标准端口,例如1234,那么从客户端上的linux命令行连接到该服务器的方式是什么?我的意思是,标准ssh命令是否需要某种开关?
ev-

1
@ulidtko:有了Upstart ,sudo restart ssh
Hello71 2011年

7

一些提示:

  1. 使用基于密钥的身份验证,它比密码更安全
  2. 仅SSH 2
  3. 禁用root登录
  4. 对于偏执狂,请从标准端口22更改端口
  5. 为了方便起见,请使用工具将您的IP映射到DNS名称,例如Dyndns或类似名称。您可以使用相同的IP花费很长时间,但是一次旅行并需要它,就会发现您得到了一个新的IP。
  6. 当然,仅允许防火墙通过SSH所需的端口(端口22,如果您选择,则为非标准端口)。

1
关于5:如果您在家中的一台机器上有一个电子邮件帐户,则可以设置一个cron作业,以定期将消息从家用机发送到该地址。您的家庭IP将在标题中。不如DNS方便,但可用。
garyjohn

您也可以联系您的ISP并询问静态IP地址的价格。这是迄今为止最简单的解决方案,但通常比动态DNS还要昂贵
SteenSchütt

2

主要的风险是忘记您正在运行ssh服务器,并在帐户中输入了弱密码。有一些攻击者可以系统地尝试使用通用帐户名(例如webmasterbob)和弱密码。您可以通过禁止密码登录(PasswordAuthentication no输入sshd_config,并UsePAM No在ssh的PAM设置中放置或禁用密码验证)来消除这种风险。中间措施是将ssh登录限制为AllowUsersAllowGroups中的用户白名单sshd_config

请注意,允许密码登录本身并不是安全问题。弱密码和监听密码是问题所在,而在ssh服务器中允许密码认证是一个使能因素。为了防止密码监听,请不要在您不完全信任的机器上键入密码(但是,如果您确实信任一台机器,则最好在其上安装私钥,然后就不需要密码身份验证)。

在计算机上使用ssh客户端的最低要求是,您相信不会主动劫持ssh通信(如果在客户端计算机上运行,​​则可能会发生中间人攻击-您认为您在原始ssh客户端中键入命令,但该客户端实际上是在如实地传输您的身份验证数据,但之后还会在通信中插入特洛伊木马。这是一个比相信没有密码窥探器(通常通过键盘记录器执行,但是还有其他自动化程度较低的方法,例如肩膀冲浪)要弱的要求。如果您确实有最小的信任,但仍然害怕窥探者,则可以使用一次性密码(OpenSSH通过其PAM支持来支持它们)。

当然,与其他任何与您控制范围之外的计算机(不仅是网络服务器,还包括客户端)进行交互的程序一样,您必须紧跟安全更新。


2

我想到了三件事:

  1. 如果您打开默认端口22,则很快它将被检测到,并且您的PC会受到暴力攻击的打击。我建议您将sshd配置为侦听其他端口或在防火墙上进行端口映射。虽然这不是灵丹妙药,但可以确保至少节省相同的CPU周期。

    端口12345

  2. 明确禁用密码身份验证,仅使用密钥。任何密钥都会比您能记住的最复杂的密码更好。

    密码验证否

  3. 即使Ubuntu默认情况下禁用了root用户,也要显式禁用root登录

    许可RootLogin no

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.