OpenSSH/客户端配置文件
客户端配置文件可以是每个用户或系统范围的,前者优先于后者,并且 shell 中的运行时参数会覆盖两者。在这些配置文件中,每行允许一个参数。语法是参数名称后跟其值或值。空行和以井号 (#) 开头的行将被忽略。等号 (=) 可以用作参数名称与其值之间的空格。值区分大小写,但参数名称不区分大小写。使用第一个分配的值。对于密钥文件,格式不同。
对于任何类型的文件,都没有替代品来阅读实际系统中涉及的相关手册页,特别是因为它们与正在使用的特定版本匹配。
系统范围的客户端文件为该系统上所有 OpenSSH 客户端用户的客户端实用程序设置默认配置。在大多数情况下,这些默认值可以被用户在本地配置文件中自己的默认设置覆盖。在许多情况下,两者都可以通过在运行时指定各种选项或参数来覆盖。优先级如下
- 通过 shell 的运行时参数
- 用户自己的配置
- 系统范围的配置
使用第一个获得的值。用户自己的配置文件和系统范围的配置文件也可以使用从 OpenSSH 7.3 开始的 Include 指令指向要包含的附加配置文件。Include 指令可以在配置文件中的任何位置指定,即使在 Match 或 Host 块中。在嵌套配置时应谨慎。
此文件定义了该系统上所有用户使用的客户端实用程序的所有默认设置。它必须可供所有用户读取。配置选项在 ssh_config(5) 中有详细说明。
以下是连接到 arc.example.org 的快捷方式。
Host arc
Port 2022
HostName arc.example.org
User fred
IdentityFile ~/.ssh/id_rsa_arc
有了这个配置,只需输入 ssh arc
即可,其余信息会自动填写。
这包含系统范围的已知主机密钥列表,用于验证远程主机的身份,从而阻止假冒或窃听。此文件应由系统管理员准备,其中包含所有必要主机的公钥。它应该是世界可读的。
有关更多说明,请参阅下面的 ~/.ssh/known_hosts,或参阅 sshd(8) 以了解有关此文件格式的更多详细信息。
此文件位于服务器上,当用户登录时,ssh(1) 在服务器上执行此文件中的程序,就在启动用户的 shell 或指定程序之前。它不是以 root 身份运行,而是以登录用户的身份运行。有关更多信息,请参阅 sshd(8) 手册页中的“SSHRC”部分。如果它发送任何内容到 stdout,这些内容会干扰 SFTP 会话等。因此,如果产生任何输出,则应将其发送到 stderr 或其他日志文件。
用户可以覆盖系统范围的默认客户端设置并选择自己的默认设置。对于重复进行相同更改的情况,建议将其添加到用户的本地配置中。
这些文件位于客户端机器上。
用户的配置文件,在适用情况下会覆盖全局客户端配置文件 /etc/ssh/ssh_config 中的设置。配置选项在 ssh_config(5) 中有详细说明。
此文件不能以任何方式被其他用户访问。设置严格的权限:用户可读/写,其他用户不可访问。如果该用户是该组中唯一的成员,则它可以是组可写的。
该文件通常名为 ~/.ssh/config。但是,可以使用 -F 选项在运行时指定不同的配置文件。旨在应用于所有主机的通用选项可以通过匹配所有主机来设置,应在配置文件的末尾完成。第一个匹配优先,因此更具体的定义必须放在前面,更通用的覆盖必须放在文件的末尾。
Host server1
ServerAliveInterval 200
HostName 203.0.113.76
Host *
ExitOnForwardFailure yes
Protocol 2
ServerAliveInterval 400
作为运行时参数提供的选项将覆盖甚至配置文件中的选项。但是,并非所有选项都可以由用户设置或覆盖。那些可能无法设置或覆盖的选项将被忽略。
此文件特定于用户帐户,包含已知远程主机的密钥。通常,这些密钥是在第一次连接时从主机收集的,但也可以手动添加。与存储在全局文件/etc/ssh/ssh_known_hosts中的密钥一样,这些密钥用于验证远程主机的身份,从而防止冒充或中间人攻击。在每次后续连接中,密钥将与远程服务器提供的密钥进行比较。如果匹配,连接将继续。如果匹配失败,ssh(1)将显示错误消息并失败。如果该远程主机根本没有列出任何密钥,则将显示密钥的指纹,并可以选择自动将密钥添加到文件中。此文件可以手动创建和编辑,但如果不存在,则会由ssh(1)在第一次连接到远程主机时自动创建。
~/.ssh/known_hosts文件可以使用哈希或明文主机名。即使使用哈希名称,也可以使用ssh-keygen(1)和-F选项进行搜索。
$ ssh-keygen -F server3.example.com
将搜索的默认文件为~/.ssh/known_hosts,如果找到,则会打印密钥。可以使用-f选项搜索不同的文件。如果必须从文件中删除密钥,-R选项的工作原理类似于按主机搜索,然后在找到它时将其删除,即使主机名被哈希处理也是如此。
$ ssh-keygen -R server4.example.com -f ~/.ssh/known_hosts
删除密钥后,它将被追加到文件~/.ssh/known_hosts.old,以备将来需要。同样,请参阅sshd(8)手册页以了解这些known_host文件的格式。
如果使用-F或-R使用非默认文件,则必须使用-f指定包含路径的文件名。但是,如果要使用默认文件,则-f是可选的。
如果使用全局文件/etc/ssh/ssh_known_hosts,则系统管理员应准备该文件以包含所有必要主机的公共主机密钥,并且该文件应该是全世界可读的。
手动将公共密钥添加到 ~/.ssh/known_hosts
[edit | edit source]手动将公共主机密钥添加到known_hosts只是为每个密钥添加一条不间断的行。如何获取密钥并不重要,只要它完整、有效且保证是真实的密钥,而不是假冒的。实用程序ssh-keyscan(1)可以获取密钥,ssh-keygen(1)可用于显示指纹以进行验证。有关验证方法的示例,请参阅有关 公钥身份验证的食谱章节。同样,相应的系统范围文件是/etc/ssh/ssh_known_hosts
关于 known_hosts 文件的内容
[edit | edit source]known_hosts文件用于验证其他系统的身份。 ssh(1)可以自动将密钥添加到用户的文件中,但也可以手动添加。该文件包含用户连接到的所有主机的公共密钥列表。它还可以包含用户计划登录但尚未出现在系统范围的已知主机密钥列表中的主机的公共密钥。通常,在第一次连接到主机时,ssh(1)会将远程主机的公共密钥添加到用户的known_hosts文件中,但此行为可以调整。
格式是每行一个公共密钥或证书。每行包含主机名、位数、指数和模数。行的开头是主机名或代表主机名的哈希值。可选的注释可以跟随在行的末尾。如果使用 SSH 证书而不是 SSH 密钥,则它们可以被可选的标记前置,以指示证书颁发机构。这些字段由空格分隔。如果主机有多个名称或服务器池中的多台机器使用相同的密钥,则可以在主机名字段中使用逗号分隔的主机列表。以下是两个用于具有基本主机名的主机的示例
anoncvs.fr.openbsd.org,93.184.34.123 ssh-rsa AAAA...njvPw== anoncvs.eu.openbsd.org ssh-rsa AAAAB3Nz...cTqGvaDhgtAhw==
非标准端口可以通过用方括号括起主机名并跟随冒号和端口号来指示。以下是三个引用侦听非标准端口上的 SSH 的主机的示例
[ssh.example.org]:2222 ssh-rsa AAAAB3Nz...AKy2R2OE= [127.0.0.2]:4922 ssh-rsa AAAAB4mV...1d6j= [anga.funkfeuer.at]:2022,[78.41.115.130]:2022 ssh-rsa AAAAB...fgTHaojQ==
主机名模式可以使用“*”和“?”作为通配符以及“!”来表示否定。
每行最多允许一个可选标记。如果存在,它必须是@cert-authority或@revoked。前者表示该密钥是证书颁发机构密钥,后者表示该密钥已吊销,不能使用。
请参阅sshd(8)以了解有关此文件格式的更多详细信息,以及ssh-keygen(1)以了解如何管理密钥。
服务器端客户端文件
[edit | edit source]这些客户端文件驻留在服务器上。默认情况下,它们保存在用户的目录中。但是,如果需要,可以将服务器配置为在其他位置查找它们。
~/.ssh/authorized_keys
[edit | edit source]authorized_keys是该帐户可用于登录的公共 ECDSA、RSA 和 ED25519 密钥的每行一个密钥的注册表。该文件的内容并不高度敏感,但推荐的权限是用户可读写,而其他用户无法访问。与往常一样,整个密钥(包括选项和注释)必须位于单个不间断的行上。
ssh-rsa AAAAB3NzaC1yc2EAAA...41Ev521Ei2hvz7S2QNr1zAiVaOFy5Lwc8Lo+Jk=
以哈希(#)开头的行将被忽略,可以用作注释。空格将密钥的字段分隔开,这些字段按顺序为可选的登录选项列表、密钥类型(通常为 ssh-rsa 或更高级的 ecdsa-sha2-nistp256)、以 base64 编码的密钥本身以及可选的注释。
如果密钥后面跟着注释,则注释不需要用引号括起来。它不会影响密钥的功能或工作方式。这是一个带注释的密钥,注释是使用-C选项ssh-keygen(1)生成的
ssh-rsa AAAAB3NzaC1yc2EAAA...zAiVaOFy5Lwc8Lo+Jk= Fred @ Project FOOBAR
密钥可以前置一个逗号分隔的选项列表,以影响成功登录后发生的事情。第一个密钥强制会话自动启动tinyfugue,第二个强制设置 PATH 环境变量
command="/usr/bin/tinyfugue" ssh-rsa AAAAB3NzaC1yc2EAAA...OFy5Lwc8Lo+Jk= environment="PATH=/bin:/usr/bin/:/opt/gtm/bin" ssh-rsa AAAAB3N...4Y2t1j=
authorized_keys的格式在sshd(8)手册页中有所描述。不再需要的旧密钥应从文件中删除。服务器可以为authorized_keys指定多个位置。有关详细信息,请参见下一节服务器端客户端密钥登录选项。
~/.ssh/authorized_principals
[edit | edit source]默认情况下,此文件不存在。如果在sshd_config(5)中指定了它,则它包含一个名称列表,可以在授权证书时代替用户名。此选项对于角色帐户、分离的帐户命名空间以及证书中的“user@realm”样式命名策略很有用。主体也可以在authorized_keys中指定。
~/.ssh/environment
[edit | edit source]如果服务器配置为接受用户提供的、自动更改环境变量作为登录过程的一部分,则可以在此文件中设置这些更改。
如果服务器、环境文件和授权密钥都尝试更改相同的变量,则文件environment优先于密钥可能包含的内容。任何一个都将覆盖可能由ssh(1)使用SendEnv传递的任何环境变量。
存储在authorized_keys中的身份验证密钥也可以用来设置变量。另请参阅sshd_config(5)手册页中的AcceptEnv和PermitUserEnvironment指令。
~/.ssh/rc
[edit | edit source]这是一个脚本,由sh(1)在启动用户的 shell 或命令之前执行。如果使用ForceCommand,则不会运行它。在读取环境变量后,将运行该脚本。如果用户的rc脚本存在,则相应的全局文件/etc/ssh/sshrc将不会运行。
本地帐户公共/私钥对
[edit | edit source]用户可能在文件系统中存储各种 ECDSA、Ed25519 和 RSA 密钥。从 8.2 版本开始,两种新的密钥类型 ECDSA-SK 和 Ed25519-SK 以及相应的证书类型可用于与 FIDO/U2F 令牌绑定的密钥。虽然各个帐户可以在任何目录中维护自己的身份验证密钥或证书列表,以验证远程主机的身份,但最常见的位置是 ~/.ssh/ 目录。密钥的命名约定只是一个约定,但建议遵循。公钥通常与私钥具有相同的名称,但会在名称末尾添加 .pub。如果公钥和私钥的名称不匹配,则可能会出现问题。如果存在多个密钥对,则 ssh-keygen(1) 在生成密钥时可以使用 -f 选项生成一个有用的名称,以及 -C 选项,该选项会在密钥对中嵌入相关注释。
用户、程序和脚本可以使用存储在系统中的私钥进行身份验证,甚至可以使用从智能卡中获取的私钥进行身份验证,前提是相应的公钥存储在远程系统上的 authorized_keys 中。authorized_keys 文件不是高度敏感的,但建议的权限是用户可读写,其他人无法访问。然而,私钥非常敏感,不应被其他帐户读取或查看。它们绝不应离开客户端,并且绝不应放在服务器上。有关更多讨论和示例,请参见关于 公钥身份验证 的章节。
密钥之前可以是一个以逗号分隔的选项列表。整个密钥必须位于单行上,且不能断行。除双引号内允许空格外,其他地方不允许空格。密钥本身之后的所有文本都被视为注释。authorized_keys 文件是一个每行一个密钥的注册表,其中包含可用于登录特定帐户的公钥 RSA、Ed25519、ECDSA、Ed25519-SK 和 ECDSA-SK 密钥。有关更多讨论,请参见上面关于 authorized_keys 文件的部分。
DSA 被认为已弃用。DSA 密钥的时代已经过去,它们不再被认为是安全的,应该用更好的密钥替换。
还可以使用 ~/.shosts、~/.rhosts、~/.ssh/environment 和 ~/.ssh/rc 文件,对每个帐户进行 基于主机的身份验证配置。
公钥:~/.ssh/id_ecdsa.pub ~/.ssh/id_ed25519.pub ~/.ssh/id_rsa.pub ~/.ssh/id_ecdsa-sk.pub ~/.ssh/id_ed25519-sk.pub ~/.ssh/id_ecdsa-sk_rk.pub ~/.ssh/id_ed25519-sk_rk.pub
[edit | edit source]这些只是公钥的默认名称。再次说明,为密钥提供更有意义的名称是个好主意。*-sk.pub 密钥是与硬件安全令牌绑定的密钥,*-sk_rk.pub 密钥是从存储在硬件安全令牌中的驻留密钥生成的密钥。
公钥主要用于远程服务器上的基于密钥的身份验证。公钥不敏感,可以被任何人读取,不像私钥,但不需要被读取。如果丢失,可以在没有注释和限制选项的情况下从私钥重新生成公钥。因此,虽然保留公钥的备份很有用,但与私钥不同,它不是必需的。
私钥:~/.ssh/id_ecdsa ~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/id_ecdsa-sk ~/.ssh/id_ed25519-sk ~/.ssh/id_ecdsa-sk_rk ~/.ssh/id_ed25519-sk_rk
[edit | edit source]这些只是私钥的默认名称。私钥始终被视为敏感数据,仅应由用户读取,其他人无法访问。换句话说,它们使用模式 0600。它们所在的目录也应具有模式 0700 或 0500。如果其他用户可以访问私钥文件,则 ssh(1) 会忽略它。
在生成密钥时可以指定密码短语,该密码短语将用于使用 AES128 加密此文件的敏感部分。在 5.3 版本之前,使用 3DES 密码加密密码短语。使用 3DES 的旧密钥在修改时会使用 AES128 为其提供新的密码短语。
存储在硬件令牌中的作为驻留密钥的私钥可以使用 ssh-keygen(1)(使用 -K 选项)提取,并自动用于生成其对应的公钥。此类密钥默认情况下将被命名为 id_ecdsa-sk_rk 或 id_ed25519-sk_rk(取决于密钥类型),但文件名可以在提取后更改。可以为从令牌提取到文件的私钥分配密码短语。
虽然可以从私钥生成公钥,但如果丢失了私钥,则无法从公钥重新生成新的私钥。如果忘记当前密码短语,也无法设置新的密码短语。丢失了就丢失了,不像公钥,它可以从现有私钥重新生成。如果丢失或忘记了私钥,则必须生成和部署全新的密钥对。
旧文件
[edit | edit source]这些文件可能会出现在非常旧或过时的系统上,但不会出现在最新的系统上。
~/.shosts
[edit | edit source]~/.rhosts
[edit | edit source].rhosts 是 rsh 的遗留产物,包含一个允许登录的本地受信任主机用户对列表。与条目匹配的登录请求会获得访问权限。
另请参见受信任主机用户对的全局列表 /etc/hosts.equiv
rhosts 可用作基于主机身份验证的一部分。否则建议不要使用 rhosts 进行身份验证,有很多方法会导致 .rhosts 文件配置错误。
旧 DSA 密钥 ~/.ssh/id_dsa ~/.ssh/id_dsa.pub
[edit | edit source]可能还会发现已弃用的 DSA 密钥,其名称为 id_dsa 和 id_dsa.pub,但无论名称如何,应跟踪其任何使用情况。OpenSSH 7.0 中停止了对服务器和客户端的 DSA 的支持。如果发现 DSA 密钥,应删除该对,并用更好的密钥类型替换。
旧 SSH1 协议密钥 ~/.ssh/identity ~/.ssh/identity.pub
[edit | edit source]identity 和 identity.pub 文件用于 SSH 协议版本 1,因此已弃用。如果发现它们,应调查它们的使用情况,如果有,以及原因。然后,在解决任何剩余的使用情况后,应删除它们,并用更新的密钥类型替换。
映射客户端选项和配置指令
[edit | edit source]SSH 客户端的许多运行时选项都有相应的配置指令,反之亦然。以下是简要概述。它不能代替熟悉相关的手册页 ssh(1) 和 ssh_config(5),它们是有关此问题的相关、权威、最新的资源。
指令 | 选项 | 描述 |
---|---|---|
AddressFamily | -4 / -6 | 仅限于 IPv4 或 IPv6 的连接。 |
ForwardAgent | -A / -a | 转发或阻止来自身份验证代理的转发。 |
BindInterface | -B | 将传出连接绑定到此网络接口。 |
BindAddress | -b | 将传出连接绑定到此网络地址。 |
Compression | -C | 指定是否使用 gzip(1) 压缩数据。 |
Ciphers | -c | 指定要使用的密码。 |
DynamicForward | -D | 指定要转发的本地端口,例如 SOCKS5。 |
EscapeChar | -e | 为 PTY 会话指定转义字符。 |
ForkAfterAuthentication | -f | 在命令执行之前将客户端放入后台。 |
GatewayPorts | -g | 是否允许其他主机连接到本地转发的端口。 |
PKCS11Provider | -I | 指定共享 PKCS#11 库的路径。 |
IdentityFile | -i | 指定要用于身份验证的特定证书或私钥。 |
ProxyJump | -J | 先通过此主机或这些主机连接到目标。 |
GSSAPIAuthentication | -K / -k | 启用或禁用通用安全服务应用程序编程接口 (GSSAPI) 身份验证。 |
LocalForward | -L | 指定要转发到指定远程系统的本地端口或套接字。 |
User | -l | 指定要尝试的远程系统上的帐户。 |
ControlMaster | -M | 允许通过单个 TCP 连接多路复用 SSH 会话。 |
MACs | -m | 指定要尝试的消息身份验证代码 (MAC) 算法。 |
SessionType | -N / -s | 调用指定的子系统,甚至完全阻止任何命令执行。 |
StdinNull | -n | 阻止从stdin读取。 |
Tag | -P | 在Match中使用的标签。 |
Port | -p | 连接到远程系统上的此端口。 |
LogLevel | -q / -v | 调整客户端日志消息的详细程度。 |
RemoteForward | -R | 指定要转发到指定本地系统的远程端口或套接字。 |
ControlPath | -S | 指定用于在此连接上进行多路复用的控制套接字。 |
RequestTTY | -T / -t | 禁止或请求会话的伪终端。 |
ForwardX11 | -X / -x | 启用或禁止 X11 转发。 |
从 8.7 版开始,-f、-N 和 -n 选项在 ssh_config(5) 中也有相应的客户端配置指令。
服务器端客户端密钥登录选项
[edit | edit source]本地用户授权密钥文件中可用于的登录选项可能会被服务器自身的设置覆盖或阻止。但是,在该限制内,可以使用以下选项。
cert-authority
指定列出的密钥是认证机构 (CA),受信任验证用于用户认证的已签署证书。证书可以对类似于密钥选项的访问限制进行编码。如果同时存在证书限制和密钥限制,则应用两者中最严格的联合。
command="program"
指定在使用密钥进行身份验证时要执行的程序及其选项。这是一种强制程序将密钥限制为单个特定操作(例如远程备份)的好方法。但是,除非在其他地方明确禁用,否则 TCP 和 X11 转发仍然允许。
如果客户端请求,程序将在 PTY 上运行,否则默认情况下将不带 TTY 运行。默认情况下,不带 TTY 运行,提供 8 位干净通道。如果默认值已更改,请指定 no-pty 以获得 8 位干净通道。如果不允许任何程序,则使用空字符串 "" 以防止任何程序运行。
no-pty,command="" ssh-rsa AAAAB3NzaC1yc2EAAA...OFy5Lwc8Lo+Jk=
如果只允许一个程序,并带有一些特定选项,则可以明确拼写出来。
restrict,command="/usr/bin/svnserve -t --tunnel-user=fred" ssh-ed25519 AAAAC3NzaC1lZDI1NT...skSUlrRPoLyUq
程序选项中提供的引号必须使用反斜杠 ('\') 转义。
command="sh -c \"mysqldump db1 -u fred1 -p\"" ssh-rsa AAAAB3NzaC1yc...Lwc8OFy5Lo+kU=
此选项适用于执行 shell、其他程序或子系统。因此,当存在 command 时,用户指定的任何其他程序都会被忽略。但是,客户端最初指定的程序仍然可用作环境变量 SSH_ORIGINAL_COMMAND。这可以在多选 case 语句中的脚本中使用,例如,允许帐户从有限范围的动作中进行选择。
environment="NAME=value"
使用此密钥登录时设置环境变量的值。它会覆盖变量的默认值(如果存在)。此选项可以重复以设置最多 1024 个独立名称的多个变量。重复情况下,第一个匹配项获胜。此选项仅在 SSH 服务器的配置中设置了 PermitUserEnvironment 选项时才允许。默认情况下,它处于禁用状态。当启用 UseLogin 时,此选项过去会自动禁用,但 UseLogin 已被弃用。
expiry-time="timespec"
设置日期或日期时间,可以是 YYYYMMDD 日期或 YYYYMMDDHHMM[SS],在此日期或日期时间之后,不允许使用密钥进行身份验证。否则,密钥将被视为无限期有效。使用系统时区。
from="pattern-list"
除了密钥之外,还需要远程主机的规范名称或其 IP 地址。地址和主机名可以使用逗号分隔的模式列表进行列出,有关模式的更多信息,请参阅 ssh_config(5) 中的 PATTERNS,或者使用 CIDR 地址/掩码长度表示法。
no-agent-forwarding / agent-forwarding
此选项禁止身份验证代理在使用密钥进行身份验证时转发密钥。或者,即使之前通过 restrict 选项禁用了代理转发,它也允许代理转发。
no-port-forwarding / port-forwarding
禁止 TCP 转发,并且当使用此密钥进行身份验证时,客户端的任何端口转发请求都会返回错误。或者,覆盖 restrict 选项并允许端口转发。另请参见 permitopen。
no-pty / pty
禁止 TTY 分配,任何分配 PTY 的请求都会失败。或者,允许 TTY 分配,即使之前通过 restrict 选项禁用了 TTY 分配。
no-touch-required
使用 -O no-touch-required 创建的 FIDO 密钥可以使用此方法,该方法使客户端跳过用户存在检查。
no-user-rc / user-rc
在 authorized_keys 中使用 no-user-rc 选项禁用 ~/.ssh/rc 的执行。或者,使用 user-rc 覆盖 restrict 选项。
no-X11-forwarding / x11-forwarding
当使用此密钥进行身份验证时,阻止 X11 转发,并且转发 X11 的请求将返回错误。或者,覆盖 restrict 选项并允许 X11 转发。
permitlisten="[host:]port"
permitopen="host:port"
permitlisten 设置将远程端口转发 (ssh -R
) 限制为仅指定的端口,以及可选的主机。相反,permitopen 将本地端口转发 (ssh -L
) 限制为仅指定的主机和端口。可以使用备用语法指定 IPv6 地址:host/port。可以使用多个 permitopen 或 permitlisten 选项,并且必须用逗号分隔。对指定的主机名不执行模式匹配,它们必须是文字主机名或 IP 地址。可以与 agent-forwarding 结合使用。
principals="name1[,name2,...]"
指定在授权通过 sshd_config(5) 中描述的 TrustedCAKeys 选项信任的证书时,可以用来代替用户名的一系列名称。
restrict
一次性禁用所有选项,例如 TTY 分配、端口转发、代理转发、user-rc 和 X11 转发。然后可以逐个明确地允许特定选项。
tunnel="n"
在服务器上选择特定的 tun(4) 设备。否则,当请求隧道设备但不带此选项时,将使用下一个可用的设备。
verify-required
要求使用 FIDO 密钥进行用户验证,例如使用 PIN。
管理密钥
[edit | edit source]在使用密钥时,有一些基本的、希望是常识性的操作应该执行,以防止出现问题。两种最有效的方法是为密钥文件使用有意义的名称,并嵌入注释。-f 选项用于 ssh-keygen(1) 允许设置自定义名称。-C 选项允许在公钥和私钥中嵌入注释。在私钥中嵌入注释,可以使用 -y 选项自动重新生成替换的公钥。 如果更换公钥。
除此之外,管理密钥还有三个主要的经验法则。
- 密钥应使用强口令。如果需要自动登录,则应首先将密钥加载到代理中,并从代理中使用。有关如何开始,请参见 ssh-add(1)。它使用 ssh-agent(1),许多系统都已安装此程序,有些系统默认情况下运行此程序。
- 密钥应始终存储在受保护的位置,即使是在客户端。这对私钥尤其重要。私钥不应授予除其所有者以外的任何用户或组的读取权限。它们还应保存在只有所有者可以访问的目录中,以限制曝光。
- 应从服务器中删除旧的和未使用的密钥。特别是,应删除没有已知有效用途的密钥,并且不允许它们累积。在公钥中使用注释字段进行注释,有助于消除随着时间的推移而导致的关于用途和所有者的混淆。沿着这些思路,密钥应定期轮换。轮换意味着生成新的密钥对并删除旧的密钥对。这提供了一个机会删除旧的和未使用的密钥。这也提供了一个机会来审查访问需求,无论是否需要访问以及访问的级别。
遵循最小特权原则可以限制事故或滥用的可能性。如果密钥仅用于运行特定应用程序或脚本,则其登录选项应限制为仅所需的内容。有关密钥登录选项,请参见 sshd(8) 中的“AUTHORIZED_KEYS 文件格式”部分。对于 root 级别访问,请务必记住适当地配置 /etc/sudoers 或 /etc/doas.conf。可以向特定应用程序授予访问权限,甚至将该应用程序限制为特定选项。
密钥的一个主要缺点是它们永远不会过期,原则上无限期有效。相反,证书可以分配有效期,并设置截止日期,在此日期之后,它们将不再可用。