查看源代码 术语

通用信息

以下解释可能会引起混淆的术语。

术语“用户”

“用户”是一个每个人都能直观理解的术语。但是,不同的理解可能会导致混淆。

这个术语在 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 服务器按以下顺序检查用户名和密码

  1. 如果定义了 pwdfun,则会调用该函数,并且返回的布尔值是身份验证结果。
  2. 否则,如果定义了 user_passwords 选项,并且用户名和密码匹配,则身份验证成功。
  3. 否则,如果定义了 password 选项并且与密码匹配,则身份验证成功。请注意,不建议在非测试代码中使用此选项。

Erlang SSH 中的公钥身份验证

客户端发送的用户名、公钥和加密数据(签名)按以下方式使用(为了清晰起见,省略了一些步骤)

  1. 使用选项 key_cb 选择回调模块。
  2. 回调模块用于检查提供的公钥是否是用户的预存储公钥之一。对于默认的回调模块,将在以下顺序中找到的目录中搜索文件 authorized_keysauthorized_keys2
  • 如果定义了 user_dir_fun 选项,则会调用该函数,并使用返回的目录,
  • 否则,如果定义了 user_dir 选项,则使用该目录,
  • 否则,使用执行 Erlang 模拟器的 OS 进程的用户的 home 目录中的子目录 .ssh

如果找不到提供的公钥,则身份验证失败。

  1. 最后,如果找到提供的公钥,则使用公钥检查客户端提供的签名。

Erlang/OTP SSH 服务器在成功身份验证后

在成功进行身份验证后,*Erlang 进程* 将处理来自远程 ssh 客户端的服务请求。该进程的权限是运行 Erlang 模拟器的 OS 进程的用户权限。

如果 shell 服务请求到达服务器,则会在服务器的模拟器中打开一个 *Erlang shell*。该 shell 中的权限独立于刚刚验证身份的用户。

如果是 sftp 请求,则会以 Erlang 模拟器的 OS 进程的用户的权限启动一个 sftp 服务器。因此,使用 sftp,经过身份验证的用户不会影响权限。

因此,在身份验证之后,用户名不再使用,并且没有任何影响。