我希望能够从外部通过SSH连接到我的Ubuntu 10.04办公室PC。因此,我正在考虑在PC上启动SSH守护程序。我应注意哪些安全问题,可能的故障,特定的配置设置等?
万一重要:这本质上只供我自己使用,我认为不会有其他人在使用它;它是在Windows 7 / Vista / XP环境下的Ubuntu 10.04 PC。
我希望能够从外部通过SSH连接到我的Ubuntu 10.04办公室PC。因此,我正在考虑在PC上启动SSH守护程序。我应注意哪些安全问题,可能的故障,特定的配置设置等?
万一重要:这本质上只供我自己使用,我认为不会有其他人在使用它;它是在Windows 7 / Vista / XP环境下的Ubuntu 10.04 PC。
Answers:
最大的问题是人们通过SSH以计算机管理员的身份登录。如果您有容易猜到的密码,可以通过蛮力完成。
您可以采取几种安全措施,以下是设置SSH服务器时我经常采取的一些措施以及其他一些措施。
请使用强度高的密码,该密码至少(例如)由10个大写和小写字母,数字和其他字符组成。
将用户监禁到其主目录。被监禁的用户将无法访问/编辑其主目录之外的文件。因此,您的用户将无法访问/编辑关键系统文件。可以在网上找到许多有关如何监禁用户的教程。他们大多数使用JailKit。可以在此处找到此类教程的示例。或者,您也可以使用OpenSSH服务器的本机ChrootDirectory
指令。可以在此处找到有关此教程的示例。
安装Fail2Ban。Fail2Ban是用于检查身份验证日志中错误条目的程序。当达到某个限制时,它将为该IP添加防火墙块一段预设的时间。在网上也找到了一些有关如何使用SSH设置Fail2Ban的在线教程,一个例子就是这个。Fail2Ban主页也包含一些不错而完整的HOWTO。
禁用通过SSH的root登录。该用户几乎可以访问系统上的每个文件,因此建议禁用其外壳程序登录。在最新版本的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进行SSH,请查看此链接以获取PuTTY方法。)设置基于密钥的身份验证后,可以通过编辑文件禁用密码身份验证/etc/ssh/sshd_config
。✝ 查找以下行,并确保其前面没有#。
#PasswordAuthentication no
可选地,如@ 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
来代替。
您只能允许特定的主机,使用/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发行版。
sudo service ssh restart
在Ubuntu上。
sudo restart ssh
。
一些提示:
主要的风险是忘记您正在运行ssh服务器,并在帐户中输入了弱密码。有一些攻击者可以系统地尝试使用通用帐户名(例如webmaster
和bob
)和弱密码。您可以通过禁止密码登录(PasswordAuthentication no
输入sshd_config
,并UsePAM No
在ssh的PAM设置中放置或禁用密码验证)来消除这种风险。中间措施是将ssh登录限制为AllowUsers
或AllowGroups
中的用户白名单sshd_config
。
请注意,允许密码登录本身并不是安全问题。弱密码和监听密码是问题所在,而在ssh服务器中允许密码认证是一个使能因素。为了防止密码监听,请不要在您不完全信任的机器上键入密码(但是,如果您确实信任一台机器,则最好在其上安装私钥,然后就不需要密码身份验证)。
在计算机上使用ssh客户端的最低要求是,您相信不会主动劫持ssh通信(如果在客户端计算机上运行,则可能会发生中间人攻击-您认为您在原始ssh客户端中键入命令,但该客户端实际上是在如实地传输您的身份验证数据,但之后还会在通信中插入特洛伊木马。这是一个比相信没有密码窥探器(通常通过键盘记录器执行,但是还有其他自动化程度较低的方法,例如肩膀冲浪)要弱的要求。如果您确实有最小的信任,但仍然害怕窥探者,则可以使用一次性密码(OpenSSH通过其PAM支持来支持它们)。
当然,与其他任何与您控制范围之外的计算机(不仅是网络服务器,还包括客户端)进行交互的程序一样,您必须紧跟安全更新。