OpenSSH 服务器¶

OpenSSH 是一组强大的工具,可用于远程控制联网计算机,并在计算机之间传输数据。这里介绍 OpenSSH 服务器应用可用的一些配置设置,以及如何在 Ubuntu 系统上修改它们。

OpenSSH 是安全外壳(SSH)协议工具族的一个免费版本。传统工具,如 telnet 或 rcp,并不安全,使用时会以明文传输用户密码。OpenSSH 提供服务器守护进程和客户端工具,实现安全、加密的远程控制和文件传输,有效替代这些旧工具。

OpenSSH 的服务器组件 sshd 持续监听各类客户端工具发起的连接。收到连接请求时,sshd 会根据客户端工具的类型建立相应连接。例如,远程计算机通过 SSH 客户端连接时,OpenSSH 服务器会在认证后建立远程控制会话。远程用户通过 scp 连接时,服务器守护进程会在认证后启动服务器与客户端之间的安全文件复制。

OpenSSH 支持多种认证方式,包括普通密码、公钥密码学和 Kerberos 票据。

安装 OpenSSH

要在 Ubuntu 系统上安装 OpenSSH 客户端应用,请在终端执行以下命令:

$

sudo apt install openssh-client

要安装 OpenSSH 服务器应用及相关支持文件,请在终端执行以下命令:

$

sudo apt install openssh-server

配置 OpenSSH

要配置 OpenSSH 服务器应用 sshd 的默认行为,可以修改主配置文件 /etc/ssh/sshd_config,或者在 /etc/ssh/sshd_config.d/ 目录中添加模块化配置片段。

重要

默认情况下,Ubuntu 将 Include /etc/ssh/sshd_config.d/*.conf 这一行放在 /etc/ssh/sshd_config 的最顶部。OpenSSH 对大多数指令采用首先设置的值,因此 sshd_config.d/ 内文件定义的设置会覆盖主配置文件中的设置。

使用 sshd_config.d/ 中的片段,能让更新更容易,并将自定义修改与系统默认配置分开。

有关配置指令的信息,请查阅在线 sshd_config(5) 手册页,或在终端运行 man sshd_config。

配置指令示例

来看一个修改配置指令的示例。要让 OpenSSH 服务器在登录前显示 /etc/issue.net 文件的内容作为横幅,可以在 /etc/ssh/sshd_config 或 /etc/ssh/sshd_config.d/ 中的片段文件里添加或修改以下一行:

Banner /etc/issue.net

失去 SSH 服务器可能意味着失去访问服务器的途径。因此,修改配置后、重启服务器前,应检查配置:

$

sudo sshd -t

修改配置后保存文件,然后使用以下命令重启 sshd 服务器应用,使更改生效:

$

sudo systemctl restart ssh.service

禁止通过服务横幅泄露操作系统信息

客户端与 OpenSSH 服务器建立 TCP 连接时,服务器会返回一个横幅,包含主机操作系统及 OpenSSH 版本的信息。

这个横幅会在客户端通过服务认证之前返回:

nc -nv 127.0.0.1 22
Connection to 127.0.0.1 22 port [tcp/*] succeeded!
SSH-2.0-OpenSSH_10.2p1 Ubuntu-2ubuntu1

使用 DebianBanner 配置指令,可以禁止横幅显示操作系统相关信息。将其写入 /etc/ssh/sshd_config,或 /etc/ssh/sshd_config.d/ 中的片段文件:

DebianBanner no

与前面的示例一样,重启 sshd 服务器,并确认横幅不再包含公布操作系统信息的片段:

nc -nv 127.0.0.1 22
Connection to 127.0.0.1 22 port [tcp/*] succeeded!
SSH-2.0-OpenSSH_10.2p1

警告

sshd 还有许多配置指令,可用于调整服务器行为以满足需求。但请注意:如果 SSH 是你访问服务器的唯一方式,配置 sshd 时犯错,重启后可能会将你锁在服务器之外。此外,提供了错误的配置指令时,sshd 服务器可能拒绝启动。因此,在远程服务器上编辑配置时应格外谨慎。

提示

可以用 etckeeper 跟踪 /etc/ 中的更改,其使用的是 git。

另一种做法是,在编辑配置文件前,复制原始 /etc/ssh/sshd_config 文件并禁止写入,以便保留原始设置供参考及必要时复用。可执行以下命令:

$

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original

$

sudo chmod a-w /etc/ssh/sshd_config.original

SSH 密钥

SSH 可以使用密码学密钥代替密码,在两台主机之间进行认证。SSH-key 认证使用一个私钥和一个公钥。

我们推荐 ed25519 椭圆曲线算法(-t ed25519),因为其密钥更短,计算需求也更低。也可以改用 RSA 算法 创建密钥(-t rsa -b 4096,对应 4096 位密钥)。

要生成密钥对,请运行以下命令:

$

ssh-keygen -t ed25519

创建过程中会提示设置密钥口令。使用该密钥时需要输入口令,可以每次输入,也可以使用 ssh-agent(1)。

默认情况下,公钥保存在 ~/.ssh/id_<algorithm>.pub 文件中,~/.ssh/id_<algorithm> 则是私钥。要允许用户通过密钥登录,可以运行以下命令,将 id_ed25519.pub(RSA 则为 id_rsa.pub)的内容追加到 target_machine:~/.ssh/authorized_keys:

$

ssh-copy-id username@target_machine

最后,再次检查 authorized_keys 文件的权限:只有经过认证的用户应拥有写入权限。如果权限不正确,可这样修改:

$

chmod go-w .ssh/authorized_keys

现在应当可以通过 SSH 连接 target_machine,而无需输入密码。

排查问题时,可以查看 target_machine 上 ssh.service 的实时日志:

$

sudo journalctl -fu ssh.service

由于可以拥有多个 SSH-key,可以在 ~/.ssh/config 中配置连接各目标机器时使用哪个密钥,参见 ssh_config(5)。

连接复用

为减少建立连接的时间,连接同一 target_machine 的多个 SSH 会话可以复用同一个 TCP 连接。

在 ~/.ssh/config 中配置以下内容以启用复用:

ControlMaster auto
ControlPath %d/.ssh/ssh_mux_%u@%l_%r@%h:%p

如果希望断开连接后,会话仍可复用 1 秒,可以额外设置:

ControlPersist 1

从公共密钥服务器导入密钥

如今许多用户已在 Launchpad 或 GitHub 等服务注册 SSH 密钥。可以这样导入:

$

ssh-import-id <username-on-remote-service>

默认隐含前缀 lp:,表示从 Launchpad 获取。改用 gh: 则会让工具从 GitHub 获取。

双因素认证

双因素认证可在默认的密钥认证之上增加一层安全保护。可以使用 U2F/FIDO 硬件认证设备添加双因素认证。如果 U2F/FIDO 硬件认证设备不可用,或不适合你的使用场景,也可以使用基于 HMAC/时间的一次性密码(HOTP/TOTP)。

GSSAPI/Kerberos 认证

如果网络使用 Kerberos,可以配置 OpenSSH 使用用户的 Kerberos 票据进行认证,并将票据转发给服务器。参见 使用 GSSAPI/Kerberos 认证的 OpenSSH。

处理不稳定的连接

通过 SSH 在远程系统上工作时,不稳定的网络连接或意外断开会中断工作,并终止正在运行的进程。终端复用器通过让会话在断开连接后继续存在,解决这一问题。

借助 tmux 或 screen 等终端复用器,可以在远程机器上启动一个独立于 SSH 连接持续运行的会话。连接断开后,可以重新连接并附加到原有会话,从中断处继续工作,而不会丢失正在运行的进程或命令输出。

延伸阅读

原文:OpenSSH server。作者/来源:Ubuntu Server 文档贡献者;Canonical,2026年10月2日更新。本文为依据用户明确授权制作的中文翻译;未确认单独公开内容许可证,不将软件许可证视为正文或图片许可。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容