如何在LinuxVPS上调整SSH守护程序配置
介绍
SSH 是通过命令行连接到远程 Linux 和类 Unix 服务器的主要方式。 它提供了一个安全连接,您可以使用它来运行命令、与系统交互,甚至通过隧道传输不相关的流量。
大多数用户都知道 如何使用以下命令开始并连接到远程服务器 的基础知识:
ssh用户名@remote_server
但是,在配置 SSH 守护程序时还有更多选项可以帮助提高安全性、管理用户连接等。 我们将讨论您可以使用的一些选项,以对您的 SSH 访问进行更细粒度的控制。
我们将在 Ubuntu 12.04 VPS 实例上演示这些概念,但任何现代 Linux 发行版都应该以类似的方式运行。
探索 SSHD 配置文件
SSH 守护程序本身的主要配置来源在 /etc/ssh/sshd_config
文件中。 请注意,这与指定客户端默认值的 ssh_config
文件不同。
现在使用管理权限打开文件:
sudo nano /etc/ssh/sshd_config
您将看到一个包含很多选项的文件,并且希望(取决于您的发行版)有很多评论。 虽然大多数发行版在建立健全的默认值方面做得相当好,但仍有改进和定制的空间。
让我们回顾一下 Ubuntu 12.04 文件中已经设置的一些选项:
端口和协议
- Port 22:这指定了 SSH 守护程序将在其上查找连接的端口。 默认情况下,大多数客户端和服务器在端口 22 上运行,但将其更改为不同的端口可能会减少恶意用户的“偷渡式”SSH 登录尝试数量。
- Protocol 2:SSH 已经通过了两个协议版本。 除非您特别需要支持只能在协议 1 上运行的客户端,否则建议保持原样。
键和分离
- HostKey /etc/ssh/ssh_host...:这些行指定服务器的主机密钥。 这些密钥用于识别连接客户端的服务器。 如果客户端过去已经与服务器通信,他们可以使用此密钥来验证新连接。
- UsePrivilegeSeparation yes:此选项允许 SSH 生成仅对其任务具有必要权限的子进程。 这是一种安全功能,可在发生安全漏洞的情况下隔离进程。
- KeyRegenerationInterval 和 ServerKeyBits:这些选项会影响为 SSH 协议 1 生成的服务器密钥。 如果您要求您的连接遵守协议 2,则不必担心这一点。
记录和限制
- SyslogFacility 和 LogLevel:这些选项指定如何记录活动。 第一个选项是用于记录消息的设施代码,第二个选项是记录日志级别或详细信息量。
- LoginGraceTime 120:这表示如果没有成功登录,服务器在与客户端断开连接之前等待的秒数。
- PermitRootLogin yes:此选项允许或拒绝使用 root 帐户进行 SSH 的能力。 由于 root 帐户是攻击者知道的存在于服务器机器上的帐户,并且因为它提供对机器的不受限制的访问,所以它通常是一个高度针对性的帐户。 一旦您配置了具有 sudo 权限的常规用户帐户,建议将其设置为“no”。
- StrictModes yes:这告诉 SSH 忽略任何没有正确权限的用户级配置文件。 如果用户将他们的配置文件设置为全球可读,这会产生安全隐患。 在解决此问题之前拒绝访问会更安全。
- IgnoreRhosts 和 RhostsRSAAuthentication:这些指定是否接受 rhost 样式的身份验证。 这是不适用于协议 2 的协议 1 语法。
- HostbasedAuthentication no:这是上面的协议2版本。 基本上,这允许基于连接客户端的主机进行身份验证。 这通常只适用于孤立的环境,因为有可能欺骗源信息。 您可以在
/etc/ssh/shosts.equiv
文件或/etc/hosts.equiv
文件中指定主机信息。 这超出了本指南的范围。 - PermitEmptyPasswords no:此选项在允许密码验证时限制没有密码的帐户的 SSH 访问。 这可能是一个巨大的安全风险,你几乎不应该改变它。
- ChallengeResponseAuthentication:此行启用或禁用可以通过 PAM 配置的质询-响应身份验证类型。 这超出了本指南的范围。
展示
- X11Forwarding yes:这允许您将服务器上应用程序的 X11 图形用户界面转发到客户端计算机。 这意味着您可以在服务器上启动图形程序,并在客户端上与之交互。 客户端必须有可用的 X 窗口系统。 您可以在 OS X 上安装这些,任何桌面 Linux 都将具有此功能。
- X11DisplayOffset 10:这是用于 X11 转发的 sshd 显示编号的偏移量。 此偏移量允许 SSH 生成的 X11 窗口避免与现有 X 服务器发生冲突。
- PrintMotd no:这指定 SSH 守护程序本身不应读取和显示 day 文件的消息。 这有时会由 shell 本身读取,因此您可能还需要修改 shell 首选项文件。
- PrintLastLog yes:这告诉 SSH 守护进程打印关于您最后一次登录的信息。
连接和环境
- TCPKeepAlive yes:这指定是否将 TCP keepalive 消息发送到客户端计算机。 这可以帮助服务器识别何时出现问题并终止连接。 如果禁用此选项,则不会在出现少量网络故障时终止连接,这可能很好,但这也意味着用户可以断开连接并继续锁定资源。
- AcceptEnv LANG LC*_:此选项允许您接受来自客户端计算机的某些环境变量。 在这个特定的实例中,我们接受语言变量,这可以帮助 shell 会话正确地为客户端显示。
- Subsystem sftp /usr/lib/openssh/sftp-server:这配置可以与 SSH 一起使用的外部子系统。 此示例指定 SFTP 服务器和执行它的路径。
- UsePAM yes:这指定 PAM(可插入验证模块)将可用于帮助验证用户。
这会处理我们 Ubuntu 12.04 机器上的默认启用选项。 接下来,我们来谈谈其他一些可能对您设置或修改有帮助的选项。
其他 SSHD 选项
我们可以为 SSH 守护程序设置很多其他选项。 其中一些可能会立即对您有所帮助,而另一些可能仅在特定情况下有用。 我们不会在这里讨论每个选项,但会讨论一些有用的选项。
用户和组过滤
某些选项允许您准确控制哪些用户可以通过 SSH 登录。 这些选项应该被认为是相互排斥的。 例如,AllowUsers
选项意味着所有其他用户都被拒绝访问。
- AllowGroups:此选项允许您指定服务器上组的名称。 只有属于这些组之一的用户才能登录。 这将建立一个应该有权访问的组的白名单。
- AllowUsers:与上面的选项类似,但它指定了允许登录的特定用户。 不在此列表中的任何用户都将无法登录。 这作为用户白名单运行。
- DenyGroups:此选项设置不应允许登录系统的组的黑名单。 属于这些组的用户将不被允许访问。
- DenyUsers:这是用户的黑名单。 它具体指定不应授予哪些用户通过 SSH 登录的权限。
此外,还有一些其他限制性选项可用。 这些可以与上述任何选项结合使用:
- Match:此选项允许对谁可以在什么情况下进行身份验证进行更细粒度的控制。 它指定了在特定用户或组连接时应使用的一组不同选项。 稍后我们将更详细地讨论这一点。
- RevokedKeys:这允许您指定撤销的公钥列表。 这将防止列出的密钥用于登录系统。
其他选项
我们可以使用许多选项来配置 SSH 守护程序将关注的网络流量:
- AddressFamily:此选项指定您将接受来自何种地址的连接。 默认情况下,该值为“any”,但您可以将“inet”用于 IPv4 地址或将“inet6”用于 IPv6 地址。
- ListenAddress:此选项允许您告诉 SSH 守护程序侦听特定地址和端口。 默认情况下,守护程序将侦听为此机器配置的所有地址。
其他可用的选项类型包括用于设置 基于证书的身份验证 、ClientAliveCountMax
和 ClientAliveInterval
等连接限制选项以及 ChrootDirectory
等选项],可用于将登录用户锁定到特定的预配置 chroot 环境。
限制用户登录
我们在上面提到了一些您必须限制对用户和组的访问的工具。 让我们在这里更详细一点。
使用这些的最基本的语法是这样的:
AllowUsers demouser fakeuser madeupuser
如您所见,我们可以在每个指令中指定多个以空格分隔的用户。
我们还可以使用通配符和否定条目。 例如,如果我们想允许除用户“john”以外的所有人登录,我们可以尝试这样的操作:
AllowUsers * !john
使用 DenyUsers
行可能会更好地表达这个特定示例:
DenyUsers john
我们还可以使用 ?
字符来精确匹配一个字符。 例如,我们可以使用:
AllowUsers ?im
这将允许从“tim”、“jim”或“vim”等帐户登录。
然而,我们可以得到更具体的。 在这两种用户规范中,我们都可以使用 user@hostname
形式来限制登录到特定的客户端源位置。 例如,你可以有类似的东西:
AllowUsers demouser@host1.com fakeuser
这将允许“fakeuser”从任何地方登录,但只允许“demouser”从特定主机登录。
我们还可以通过 TCP 包装器在 sshd_config
文件之外逐个主机限制访问。 这是通过 /etc/hosts.allow
和 /etc/hosts.deny
文件配置的。
例如,我们可以通过在 hosts.allow
文件中添加这样的行来专门基于 SSH 流量限制访问:
sshd: .example.com
假设我们在 hosts.deny
文件中有一条如下所示的伴随行:
sshd: ALL
这会将登录限制为仅来自 example.com
或子域的登录。
使用匹配选项添加例外
我们可以通过使用“匹配”选项来进一步控制我们的选项。 匹配选项通过指定一个标准模式来工作,该模式将决定是否应用以下选项。
我们通过使用 Match
选项开始匹配,然后指定标准键值对。 可用的键是“用户”、“组”、“主机”和“地址”。 我们可以用空格分隔条件,用逗号分隔模式(user1,user2)。 我们还可以使用通配符和否定:
Match User !demouser,!fakeuser Group sshusers Host *.example.com
仅当用户不是 demouser
或 fakeuser
,如果用户 是 是组 sshusers
的成员,并且如果他们正在从 example.com
或子域连接。
“地址”标准可以使用 CIDR 网络掩码表示法。
有条件地应用遵循 Match
规范的选项。 这些条件选项的范围是直到文件末尾或直到下一个匹配规范。 因此,建议将您的默认值放在文件的顶部,并将您的异常放在底部。
由于这个条件块,匹配下的选项通常缩进以表明它们仅应用于上述匹配。 例如,上面的条件可能有一个块,如下所示:
Match User !demouser,!fakeuser Group sshusers Host *.example.com AuthorizedKeysFile /sshusers/keys/%u PasswordAuthentication yes X11Forwarding X11DisplayOffset 15
在处理匹配规范时,您只能访问一部分选项。 要查看完整列表,请查看 sshd_config
手册页:
man sshd_config
搜索“匹配”部分以查看可用选项列表。
结论
如您所见,您可以在 SSH 的服务器端调整许多值,这些值会影响用户登录的能力和他们的体验质量。 确保在大规模实施之前仔细测试您的更改,以发现错误并确保您的限制不会意外影响太少或太多的用户。
熟悉您的 /etc/ssh/sshd_config
文件是了解如何仔细控制对服务器的访问的重要的第一步。 这是任何 Linux 系统管理员的一项重要技能。