我希望能够从外部通过 SSH 连接到我的 Ubuntu 10.04 办公室 PC。因此,我考虑在 PC 上启动一个 SSH 守护进程。我应该注意哪些安全问题、可能的故障、特定的配置设置等?
以防万一:这基本上只供我自己使用,我认为不会有其他人使用它;这是一台主要在 Windows 7/Vista/XP 环境中的 Ubuntu 10.04 PC。
答案1
最令人担心的是有人通过 SSH 以计算机管理员身份登录。如果您的密码很容易猜到,则可以通过暴力破解来实现。
您可以采取多种安全措施,下面是我在设置 SSH 服务器时始终采取的一些措施以及一些额外的措施。
使用强密码,至少包含(比如说) 10 个大小写字母、数字和其他字符。
将用户限制在其主目录中。被限制的用户将无法访问/编辑其主目录之外的文件。因此,您的用户将无法访问/编辑关键系统文件。网上有很多关于如何限制用户的教程。大多数教程使用监狱工具。可以找到此类教程的示例这里。或者,您也可以使用 OpenSSH 服务器的本机
ChrootDirectory
指令。可以找到有关此内容的教程示例这里。安装失败禁止。Fail2Ban 是一个检查身份验证日志中是否存在错误条目的程序。当达到某个限制时,它会在预设的时间内为该特定 IP 添加防火墙阻止。网上还有几个关于如何使用 SSH 设置 Fail2Ban 的在线教程,例如这个。Fail2Ban 主页也包含一些精彩且完整的 HOWTO。
通过 SSH 禁用 root 登录。这是可以访问系统上几乎所有文件的用户,因此建议禁用其 shell 登录。在最新版本的 Ubuntu 中,root 用户会自动被禁用,但无论如何禁用其 SSH 访问权限也无妨。这可以通过编辑文件来完成
/etc/ssh/sshd_config
。✝查找以下行并确保其前面没有 #。#PermitRootLogin no
使用非标准端口(例如不是 22)这可以通过路由器中的端口转发(例如 16121 -> 22 而不是 22 -> 22)或让 SSH 守护进程监听不同的端口来实现。这将使您的 SSH 服务更不容易被恶意用户检测到。这可以通过编辑文件来实现
/etc/ssh/sshd_config
。✝查找以下行并将 22 更改为您想要的任何端口。之后不要忘记在路由器中转发正确的端口。Port 22
不要使用密码登录。除了密码之外,SSH 还允许使用私钥登录。这意味着密钥存储在您访问 SSH 计算机的 SSH 的计算机上。尝试连接时,SSH 客户端使用密钥登录服务器,而不是通过密码验证。身份验证密钥的加密性比密码强得多,因此不容易破解。网上还有几篇关于如何使用 SSH 设置基于密钥的身份验证的在线教程,例如这个. (如果你使用 PuTTY 从 Windows 进行 SSH,请检查此链接了解 PuTTY 操作方法。)设置基于密钥的身份验证后,您可以通过编辑文件来禁用密码身份验证。✝
/etc/ssh/sshd_config
查找以下行并确保其前面没有 #。#PasswordAuthentication no
或者,正如@Linker3000在他的评论中提到的那样,你可以设置一个VPN 隧道到您想要通过 SSH 访问的 PC,然后禁止 SSH 服务器上的非本地网络访问。这样,没有 VPN 连接的外部设备将无法访问您的 SSH 服务器。这可以通过拒绝所有主机然后仅允许本地网络 IP 登录来实现。这可以通过编辑
/etc/hosts.deny
并添加以下内容来实现:sshd: ALL
并
/etc/hosts.allow
补充以下内容:sshd: 192.168.1.*
其中 IP 与您的本地网络相匹配。
*
是通配符,因此所有以 开头的 IP 地址192.168.1.
都将被接受。 如果这不起作用,您的发行版可能会使用ssh
而不是sshd
。 在这种情况下,您应该尝试ssh: 192.168.1.*
使用ssh: ALL
。您只能允许特定的主机,对和执行相同的操作,
/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.}
仅允许特定用户访问您的 SSH 服务器。这可以通过编辑文件来完成
/etc/ssh/sshd_config
。✝查找以下行并确保其前面没有 #。如果不存在,请创建它。例如,如果您只想允许 john、tom 和 mary,请添加/编辑此行:AllowUsers john tom mary
您还可以拒绝特定用户,例如,如果您想拒绝 john、tom 和 mary 访问,请添加/编辑此行:
DenyUsers john tom mary
仅允许使用 SSH2 协议进行传入连接。SSH 协议有两个版本。SSH1 存在安全问题,因此建议使用 SSH 2。可以通过编辑文件来强制执行此操作
/etc/ssh/sshd_config
。✝查找以下行并确保其前面没有 #。如果不存在,请创建它。Protocol 2,1
删除 ,1,这样该行将是
Protocol 2
不允许未设置密码的用户登录。可以通过编辑文件来强制执行
/etc/ssh/sshd_config
。✝查找以下行并确保其前面没有 #。如果不存在,请创建它。PermitEmptyPasswords no
尽管很简单,也许不用多说,但在很多情况下却被证明是至关重要的,那就是保持软件更新。定期更新您安装的软件包/软件。
✝ = 编辑 SSH 配置文件后,不要忘记重新启动守护程序以应用更改。通过执行以下命令重新启动守护程序:
sudo /etc/init.d/ssh restart
或者
sudo /etc/init.d/sshd restart
取决于您使用的 Linux 发行版。
答案2
一些提示:
- 使用基于密钥的身份验证,比密码更安全
- 仅限 SSH 2
- 禁用 Root 登录
- 对于偏执狂来说,将端口从标准端口 22 更改
- 为方便起见,请使用工具将您的 IP 映射到 DNS 名称,例如 Dyndns 或类似名称。您可以长时间使用同一个 IP,但当您旅行并需要它时,您会发现您已获得一个新的 IP。
- 当然,只允许 SSH 所需的端口(端口 22,或者您选择的非标准端口)通过防火墙。
答案3
主要风险是忘记您正在运行 ssh 服务器,并在帐户上设置了弱密码。有些攻击者会系统地尝试常见的帐户名(如webmaster
和)和弱密码。您可以通过禁止密码登录(输入,并在 ssh 的 PAM 设置中输入或禁用密码验证)bob
来消除此风险。一种中间措施是将 ssh 登录限制为具有或的用户白名单。PasswordAuthentication no
sshd_config
UsePAM No
AllowUsers
AllowGroups
sshd_config
请注意,允许密码登录本身并不是一个安全问题。弱密码和密码被窥探才是问题所在,而允许在 ssh 服务器中进行密码验证则是一个促成因素。为了防止密码窥探,切勿在您不完全信任的机器上输入密码(但如果您确实信任某台机器,那么您也可以在其上安装私钥,这样就不需要密码验证了)。
在计算机上使用 ssh 客户端的最低要求是您相信不会发生对 ssh 通信的主动劫持(如果在客户端计算机上运行中间人攻击,则可能会发生中间人攻击 - 您认为自己正在向原始 ssh 客户端输入命令,但客户端实际上正在如实地传输您的身份验证数据,但之后还会在通信中插入特洛伊木马)。这个要求比相信不会有密码窥探者(通常通过键盘记录器执行,但也有其他自动化程度较低的方法,如肩窥)要弱。如果您确实具有最低限度的信任但仍担心窥探者,则可以使用一次性密码(OpenSSH 通过其 PAM 支持支持它们)。
当然,与任何其他与您控制之外的机器(不仅是网络服务器,还有客户端)交互的程序一样,您必须跟上安全更新。
答案4
我想到三件事:
如果您打开默认端口 22,那么很快就会被检测到,您的 PC 将遭受暴力攻击。我建议您将 sshd 配置为监听其他端口或在防火墙上进行端口映射。虽然这不是灵丹妙药,但至少可以为您节省相同的 CPU 周期。
端口 12345
明确禁用密码验证并仅使用密钥。任何密钥都比您能记住的最复杂的密码要好。
密码验证否
尽管 Ubuntu 默认禁用 root 用户,但明确禁用 root 登录
PermitRootLogin 否