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

ev-*_*-br 15 linux security ssh ubuntu

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

以防万一:这基本上仅供我自己使用,我认为不会有其他人使用它;它是一台 Ubuntu 10.04 PC,主要运行在 Windows 7/Vista/XP 环境中。

Pyl*_*lsa 21

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

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

  1. 使用强密码,至少包含(例如)10 个大小写字母、数字和其他字符。

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

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

  4. 通过 SSH 禁用 root 登录。这是可以访问系统上几乎所有文件的用户,因此建议禁用其 shell 登录。在最新版本的 Ubuntu 中,root 用户被自动禁用,但无论如何禁用其 SSH 访问也无妨。这是通过编辑文件来完成的/etc/ssh/sshd_config查找以下行并确保其前面没有#。

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

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

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

    sshd: ALL
    
    Run Code Online (Sandbox Code Playgroud)

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

    sshd: 192.168.1.*
    
    Run Code Online (Sandbox Code Playgroud)

    IP与您的本地网络之一匹配的地方。*是通配符,因此所有以 开头的 IP 地址192.168.1.都将被接受。如果这不起作用,你的发行版可能使用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.}
    
    Run Code Online (Sandbox Code Playgroud)
  9. 只允许特定用户访问您的 SSH 服务器。这是通过编辑文件来完成的/etc/ssh/sshd_config查找以下行并确保其前面没有#。如果它不存在,请创建它。例如,如果您只想允许 john、tom 和 mary,请添加/编辑以下行:

    AllowUsers john tom mary
    
    Run Code Online (Sandbox Code Playgroud)

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

    DenyUsers john tom mary
    
    Run Code Online (Sandbox Code Playgroud)
  10. 只允许传入连接使用协议 SSH2。SSH 协议有两个版本。SSH1 存在安全问题,因此建议使用 SSH 2。这可以通过编辑文件来强制执行/etc/ssh/sshd_config查找以下行并确保其前面没有#。如果它不存在,请创建它。

    Protocol 2,1
    
    Run Code Online (Sandbox Code Playgroud)

    删除 ,1 所以该行将是

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

    PermitEmptyPasswords no
    
    Run Code Online (Sandbox Code Playgroud)
  12. 虽然很简单,也许不用说,但在多种情况下证明是至关重要的,但请让您的软件保持最新状态。定期更新您安装的软件包/软件。


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

sudo /etc/init.d/ssh restart
Run Code Online (Sandbox Code Playgroud)

或者

sudo /etc/init.d/sshd restart
Run Code Online (Sandbox Code Playgroud)

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

  • Ubuntu 上的“sudo service ssh restart”。 (2认同)

Bri*_*an 7

一些提示:

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