介绍
OpenSSH 是一个强大的工具集合,用于远程控制联网计算机和在联网计算机之间传输数据。您还将了解一些可能使用 OpenSSH 服务器应用程序进行的配置设置以及如何在您的 Ubuntu 系统上更改它们。
OpenSSH 是安全外壳 (SSH) 协议系列工具的免费可用版本,用于远程控制计算机或在计算机之间传输文件。用于完成这些功能的传统工具,例如 telnet 或 rcp,是不安全的,并且在使用时以明文形式传输用户密码。OpenSSH 提供了一个服务器守护进程和客户端工具来促进安全、加密的远程控制和文件传输操作,有效地替代了传统工具。
OpenSSH 服务器组件 sshd 持续侦听来自任何客户端工具的客户端连接。当发生连接请求时,sshd 会根据客户端工具连接的类型设置正确的连接。例如,如果远程计算机与 ssh 客户端应用程序连接,则 OpenSSH 服务器在身份验证后建立远程控制会话。如果远程用户使用 scp 连接到 OpenSSH 服务器,则 OpenSSH 服务器守护程序会在身份验证后在服务器和客户端之间启动文件的安全副本。OpenSSH 可以使用多种身份验证方法,包括普通密码、公钥和 Kerberos 票证。
安装
OpenSSH 客户端和服务器应用程序的安装很简单。要在 Ubuntu 系统上安装 OpenSSH 客户端应用程序,请在终端提示符下使用以下命令:
sudo apt install openssh-client
要安装 OpenSSH 服务器应用程序和相关支持文件,请在终端提示符下使用以下命令:
sudo apt install openssh-server
配置
您可以通过编辑文件来配置 OpenSSH 服务器应用程序 sshd 的默认行为/etc/ssh/sshd_config
。有关此文件中使用的配置指令的信息,您可以使用在终端提示符下发出的以下命令查看相应的手册页:
man sshd_config
sshd 配置文件中有许多指令控制诸如通信设置和身份验证模式等内容。以下是可以通过编辑/etc/ssh/sshd_config
文件更改的配置指令示例。
建议:
在编辑配置文件之前,您应该制作原始文件的副本并保护它不被写入,以便您将原始设置作为参考并在必要时重新使用。
/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 服务器可能意味着无法访问服务器,请在更改配置后和重新启动服务器之前检查配置:
sudo sshd -t -f /etc/ssh/sshd_config
以下是您可以更改的配置指令示例:
- 要将 OpenSSH 设置为侦听 TCP 端口 2222 而不是默认的 TCP 端口 22,请将 Port 指令更改为:
Port 2222
- 要让您的 OpenSSH 服务器将
/etc/issue.net
文件内容显示为登录前横幅,只需在/etc/ssh/sshd_config
文件中添加或修改以下行:
Banner /etc/issue.net
对/etc/ssh/sshd_config
文件进行更改后,保存文件,然后在终端提示符下使用以下命令重新启动 sshd 服务器应用程序以使更改生效:
sudo systemctl restart sshd.service
警告
sshd 的许多其他配置指令可用于更改服务器应用程序的行为以满足您的需要。但是,请注意,如果您访问服务器的唯一方法是 ssh,并且您在通过该
/etc/ssh/sshd_config
文件配置 sshd 时出错,您可能会发现在重新启动服务器时您被锁定在服务器之外。此外,如果提供了不正确的配置指令,sshd 服务器可能会拒绝启动,因此在远程服务器上编辑此文件时要格外小心。
SSH 密钥
SSH 允许在不需要密码的情况下在两台主机之间进行身份验证。SSH 密钥认证使用私钥和公钥。
要生成密钥,请从终端提示输入:
ssh-keygen -t rsa
这将使用RSA 算法生成密钥。在撰写本文时,生成的密钥将有 3072 位。您可以使用该-b
选项修改位数。例如,要生成 4096 位的密钥,您可以执行以下操作:
ssh-keygen -t rsa -b 4096
在此过程中,系统将提示您输入密码。当提示创建密钥时,只需按 Enter键即可。
默认情况下,公共密钥保存到文件中~/.ssh/id_rsa.pub
,同时~/.ssh/id_rsa
是私人密钥。现在将id_rsa.pub
文件复制到远程主机并~/.ssh/authorized_keys
通过输入将其附加到:
ssh-copy-id username@remotehost
最后,仔细检查authorized_keys
文件的权限,只有经过身份验证的用户才有读写权限。如果权限不正确,请通过以下方式更改它们:
chmod 600 .ssh/authorized_keys
您现在应该能够通过 SSH 连接到主机而不会被提示输入密码。
从公钥服务器导入密钥
如今,许多用户已经在 Launchpad 或 github 等服务中注册了 ssh 密钥。这些可以通过以下方式轻松导入:
ssh-import-id <username-on-remote-service>
前缀lp:
是隐含的,表示从启动板获取,替代方法gh:
将使工具从 github 获取。
使用 U2F/FIDO 进行两因素身份验证
OpenSSH 8.2添加了对 U2F/FIDO 硬件身份验证设备的支持。这些设备用于在现有的基于密钥的身份验证之上提供额外的安全层,因为需要存在硬件令牌才能完成身份验证。
使用和设置非常简单。唯一的额外步骤是生成可与硬件设备一起使用的新密钥对。为此,可以使用两种密钥类型:ecdsa-sk
和ed25519-sk
。前者具有更广泛的硬件支持,而后者可能需要更新的设备。
一旦生成了密钥对,就可以像通常在 openssh 中使用任何其他类型的密钥一样使用它。唯一的要求是,为了使用私钥,U2F 设备必须存在于主机上。
例如,插入 U2F 设备并生成要使用的密钥对:
$ ssh-keygen -t ecdsa-sk
Generating public/private ecdsa-sk key pair.
You may need to touch your authenticator to authorize key generation. <-- touch device
Enter file in which to save the key (/home/ubuntu/.ssh/id_ecdsa_sk):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ubuntu/.ssh/id_ecdsa_sk
Your public key has been saved in /home/ubuntu/.ssh/id_ecdsa_sk.pub
The key fingerprint is:
SHA256:V9PQ1MqaU8FODXdHqDiH9Mxb8XK3o5aVYDQLVl9IFRo ubuntu@focal
现在只需将公共部分传输到服务器即可~/.ssh/authorized_keys
:
$ ssh -i .ssh/id_ecdsa_sk ubuntu@focal.server
Confirm user presence for key ECDSA-SK SHA256:V9PQ1MqaU8FODXdHqDiH9Mxb8XK3o5aVYDQLVl9IFRo <-- touch device
Welcome to Ubuntu Focal Fossa (GNU/Linux 5.4.0-21-generic x86_64)
(...)
ubuntu@focal.server:~$