查看源代码 术语
通用信息
以下解释可能会引起混淆的术语。
术语“用户”
“用户”是一个每个人都能直观理解的术语。但是,不同的理解可能会导致混淆。
这个术语在 OpenSSH 和 Erlang/OTP 中的 SSH 中的使用方式不同。原因是不同的环境和用例,这些差异并非显而易见。
本章旨在解释这些差异,并给出 Erlang/OTP 如何处理“用户”的理由。
在 OpenSSH 中
许多人都在 Linux 机器(或类似机器)上使用命令 'ssh' 来远程登录到另一台机器。输入
ssh host
以登录到名为 host
的机器。该命令会提示您在远程 host
上输入密码,然后您可以根据您的 *用户名* 在远程 host
上的权限进行读取、写入和执行。还有使用预先分发的密钥或证书的更强版本,但这现在只是身份验证过程中的细节。
您可以以用户 anotheruser
的身份登录,使用
ssh anotheruser@host
然后,如果正确授权,您将被允许以 anotheruser
的身份在 host
上操作。
那么 *“您的用户名具有权限”* 是什么意思?在 UNIX/Linux 等环境中,它正是那个环境所指的含义:*用户* 可以根据操作系统规则读取、写入和执行程序。此外,用户还有一个主目录 ($HOME
) 以及一个包含 ssh 特定文件的 $HOME/.ssh/
目录。
SSH 密码身份验证
当 SSH 尝试登录到主机时,ssh 协议会传递用户名(作为字符串)和密码。远程 ssh 服务器会检查是否存在这样一个用户定义,并且提供的密码是否可以接受。
如果是这样,则用户被授权。
SSH 公钥身份验证
这是一种更强大的方法,其中 ssh 协议会携带用户名、用户的公钥和一些我们可以忽略的加密信息。
远程主机上的 ssh 服务器会检查
- 该 *用户* 是否有主目录,
- 该主目录是否包含一个 .ssh/ 目录,并且
- 该 .ssh/ 目录是否包含刚刚在
authorized_keys
文件中收到的公钥
如果是这样,则用户被授权。
UNIX/Linux 等系统上的 SSH 服务器在成功身份验证后
在成功进行传入身份验证后,一个新的进程以刚刚验证身份的用户身份运行。
下一步是根据 ssh 请求启动服务。如果请求的是 shell,则会启动一个新的 shell,该 shell 处理从客户端(即“您”)到达的 OS 命令。
如果是 sftp 请求,则会以用户的权限启动 sftp 服务器。因此,如果该用户被允许,它可以读取、写入或删除文件。
在 Erlang/OTP SSH 中
对于 Erlang/OTP SSH 服务器,情况有所不同。服务器在 Erlang 模拟器中的 Erlang 进程中执行,而该模拟器又在 OS 进程中执行。模拟器不会尝试在通过 SSH 协议进行身份验证时更改其用户。因此,远程用户名仅用于 Erlang/OTP SSH 应用程序中的身份验证目的。
Erlang SSH 中的密码身份验证
Erlang/OTP SSH 服务器按以下顺序检查用户名和密码
- 如果定义了
pwdfun
,则会调用该函数,并且返回的布尔值是身份验证结果。 - 否则,如果定义了
user_passwords
选项,并且用户名和密码匹配,则身份验证成功。 - 否则,如果定义了
password
选项并且与密码匹配,则身份验证成功。请注意,不建议在非测试代码中使用此选项。
Erlang SSH 中的公钥身份验证
客户端发送的用户名、公钥和加密数据(签名)按以下方式使用(为了清晰起见,省略了一些步骤)
- 使用选项
key_cb
选择回调模块。 - 回调模块用于检查提供的公钥是否是用户的预存储公钥之一。对于默认的回调模块,将在以下顺序中找到的目录中搜索文件
authorized_keys
和authorized_keys2
- 如果定义了
user_dir_fun
选项,则会调用该函数,并使用返回的目录, - 否则,如果定义了
user_dir
选项,则使用该目录, - 否则,使用执行 Erlang 模拟器的 OS 进程的用户的 home 目录中的子目录
.ssh
。
如果找不到提供的公钥,则身份验证失败。
- 最后,如果找到提供的公钥,则使用公钥检查客户端提供的签名。
Erlang/OTP SSH 服务器在成功身份验证后
在成功进行身份验证后,*Erlang 进程* 将处理来自远程 ssh 客户端的服务请求。该进程的权限是运行 Erlang 模拟器的 OS 进程的用户权限。
如果 shell 服务请求到达服务器,则会在服务器的模拟器中打开一个 *Erlang shell*。该 shell 中的权限独立于刚刚验证身份的用户。
如果是 sftp 请求,则会以 Erlang 模拟器的 OS 进程的用户的权限启动一个 sftp 服务器。因此,使用 sftp,经过身份验证的用户不会影响权限。
因此,在身份验证之后,用户名不再使用,并且没有任何影响。