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
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 连接持续运行的会话。连接断开后,可以重新连接并附加到原有会话,从中断处继续工作,而不会丢失正在运行的进程或命令输出。












暂无评论内容