查看源代码 SSH 应用程序

ssh 应用程序实现了安全外壳 (SSH) 协议,并提供了 SSH 文件传输协议 (SFTP) 客户端和服务器。

描述

ssh 应用程序是 Erlang 中 SSH 协议的实现。ssh 提供了 API 函数,用于编写自定义的 SSH 客户端和服务器,以及通过 SSH 使 Erlang shell 可用。还包括 SFTP 客户端 ssh_sftp 和服务器 ssh_sftpd

依赖关系

ssh 应用程序使用 public_keycrypto 应用程序来处理公钥和加密。因此,必须加载这些应用程序,ssh 应用程序才能工作。调用 ssh:start/0 将在启动 ssh 本身之前,执行必要的 application:start/1,2 调用。

配置

SSH 应用程序使用配置参数。 设置它们的位置在 config 用户指南 中描述,SSH 的详细信息在 SSH 中的配置 中。

还使用来自 OpenSSH 的一些特殊配置文件

  • known_hosts
  • authorized_keys
  • authorized_keys2
  • id_dsa (支持但默认禁用)
  • id_rsa (支持 SHA1 签名/验证,但在 OTP-24 中默认禁用)
  • id_ecdsa
  • id_ed25519
  • id_ed448
  • ssh_host_dsa_key (支持但默认禁用)
  • ssh_host_rsa_key (支持 SHA1 签名/验证,但在 OTP-24 中默认禁用)
  • ssh_host_ecdsa_key
  • ssh_host_ed25519_key
  • ssh_host_ed448_key

默认情况下,ssh~/.ssh 中查找 id_*known_hostsauthorized_keys,在 /etc/ssh 中查找 ssh_host_*_key 文件。 这些位置可以通过选项 user_dirsystem_dir 进行更改。 有关在何处设置它们的更多信息,请参阅 SSH 中的配置

还可以通过实现行为 ssh_client_key_apissh_server_key_api 的回调模块来自定义公钥处理。

另请参阅 ssh_file 中的默认回调模块文档。

可以使用 preferred_algorithmsmodify_algorithms 选项启用禁用的公钥算法。 有关说明,请参阅 在 SSH 中配置算法 中的 示例 9

公钥

id_* 是用户的私钥文件。 请注意,公钥是私钥的一部分,因此 ssh 应用程序不使用 id_*.pub 文件。 这些文件是为了方便用户在需要传达用户的公钥时使用。

有关详细信息,请参阅 ssh_file

已知主机

known_hosts 文件包含已批准的服务器及其公钥的列表。 列出服务器后,无需用户交互即可验证它。

有关详细信息,请参阅 ssh_file

授权密钥

authorized_key 文件跟踪用户授权的公钥。 此文件最常见的用途是让用户无需输入密码即可登录,Erlang ssh 守护程序支持此功能。

有关详细信息,请参阅 ssh_file

主机密钥

支持 RSA、DSA(如果启用)、ECDSA、ED25519 和 ED448 主机密钥,并且预计在名为 ssh_host_rsa_keyssh_host_dsa_keyssh_host_ecdsa_keyssh_host_ed25519_keyssh_host_ed448_key 的文件中找到它们。

有关详细信息,请参阅 ssh_file

错误记录器和事件处理程序

ssh 应用程序使用默认的 OTP 错误记录器来记录意外错误或打印有关特殊事件的信息。

支持的规范和标准

支持的 SSH 版本为 2.0。

算法

实际算法集可能因机器上安装的 OpenSSL 加密库而异。 有关特定安装的列表,请使用命令 ssh:default_algorithms/0。 用户可以在服务器端和客户端覆盖默认的算法配置。 请参阅 ssh:daemon/1,2,3ssh:connect/3,4 函数中的选项 preferred_algorithmsmodify_algorithms

支持的算法是(按默认顺序)

密钥交换算法

  • curve25519-sha256
  • [email protected]
  • curve448-sha512
  • ecdh-sha2-nistp521
  • ecdh-sha2-nistp384
  • ecdh-sha2-nistp256
  • diffie-hellman-group-exchange-sha256
  • diffie-hellman-group16-sha512
  • diffie-hellman-group18-sha512
  • diffie-hellman-group14-sha256

以下不安全的 SHA1 算法现在默认禁用

  • (diffie-hellman-group14-sha1)
  • (diffie-hellman-group-exchange-sha1)
  • (diffie-hellman-group1-sha1)

可以使用 preferred_algorithmsmodify_algorithms 选项启用它们。 例如,使用选项值 {modify_algorithms, [{append, [{kex,['diffie-hellman-group1-sha1']}]}]}

公钥算法

  • ssh-ed25519
  • ssh-ed448
  • ecdsa-sha2-nistp521
  • ecdsa-sha2-nistp384
  • ecdsa-sha2-nistp256
  • rsa-sha2-512
  • rsa-sha2-256

以下不安全的 SHA1 算法受支持但默认禁用

  • (ssh-dss)
  • (ssh-rsa)

可以使用 preferred_algorithmsmodify_algorithms 选项启用禁用的公钥算法。 有关说明,请参阅 在 SSH 中配置算法 中的 示例 9

MAC 算法

以下不安全的 SHA1 算法默认禁用

  • (hmac-sha1-96)

可以使用 preferred_algorithmsmodify_algorithms 选项启用它。 例如,使用选项值 {modify_algorithms, [{append, [{mac,['hmac-sha1-96']}]}]}

加密算法(密码)

以下不安全的算法默认禁用

  • (AEAD_AES_128_GCM)
  • (AEAD_AES_256_GCM)

有关 AEAD_AES_*_GCM 的更多信息,请参阅 rfc 5647 的进一步说明 中的文本。

按照事实上的互联网标准,当协商密码 [email protected] 时,选择密码和 mac 算法 AEAD_AES_128_GCM。当协商密码 [email protected] 时,选择密码和 mac 算法 AEAD_AES_256_GCM。

压缩算法

Unicode 支持

如果模拟器和底层操作系统支持,则支持 Unicode 文件名。 有关此主题的信息,请参阅 Kernel 中的 file 手册页。

shell 和 cli 都支持 unicode。

RFC

支持以下 RFC

  • RFC 4251,安全外壳 (SSH) 协议体系结构。

    例外

    • 9.4.6 基于主机的身份验证
    • 9.5.2 代理转发
    • 9.5.3 X11 转发
  • RFC 4252,安全外壳 (SSH) 身份验证协议。

    例外

    • 9. 基于主机的身份验证:“hostbased”
  • RFC 4253,安全外壳 (SSH) 传输层协议。

    例外

    • 8.1. diffie-hellman-group1-sha1
    • 6.6. 公钥算法
      • ssh-dss
      • ssh-rsa

    它们默认禁用,因为它们现在被认为是不安全的,但可以使用 preferred_algorithmsmodify_algorithms 选项启用它们。 有关说明,请参阅 在 SSH 中配置算法 中的 示例 8 (diffie-hellman-group1-sha1) 和 示例 9 (ssh-dss)。

  • RFC 4254,安全外壳 (SSH) 连接协议。

    例外

    • 6.3. X11 转发
    • 7. TCP/IP 端口转发
  • RFC 4256,安全外壳协议 (SSH) 的通用消息交换身份验证。

    例外

    • num-prompts > 1
    • 密码更改
    • userid-password 以外的其他标识方法
  • RFC 4419,安全外壳 (SSH) 传输层协议的 Diffie-Hellman 组交换。

    例外

    • 4.1. diffie-hellman-group-exchange-sha1

    它默认禁用,因为现在被认为是不安全的,但可以使用 preferred_algorithmsmodify_algorithms 选项启用它。

  • RFC 4716,安全外壳 (SSH) 公钥文件格式。

  • RFC 5647,安全外壳传输层协议的 AES Galois 计数器模式。

    密码和 mac 算法的同步选择存在歧义。 OpenSSH 通过实现的密码 [email protected][email protected] 解决了这个问题。 如果需要显式密码和 mac AEAD_AES_128_GCM 或 AEAD_AES_256_GCM,可以使用选项 preferred_algorithmsmodify_algorithms 启用它们。

    警告

    如果客户端或服务器不是 Erlang/OTP,则用户有责任在启用它们之前检查其他实现是否与 Erlang/OTP SSH 对 AEAD_AES_*_GCM 的解释相同。 aes*[email protected] 变体始终可以安全使用,因为它们没有歧义。

    第 5.1 节中的第二段解析为

    1. 如果协商的密码是 AEAD_AES_128_GCM,则 mac 算法设置为 AEAD_AES_128_GCM。
    2. 如果协商的密码是 AEAD_AES_256_GCM,则 mac 算法设置为 AEAD_AES_256_GCM。
    3. 如果 mac 算法是 AEAD_AES_128_GCM,则密码设置为 AEAD_AES_128_GCM。
    4. 如果 mac 算法是 AEAD_AES_256_GCM,则密码设置为 AEAD_AES_256_GCM。

    应用从顶部按顺序读取时匹配的第一个规则

  • RFC 5656,安全外壳传输层中的椭圆曲线算法集成。

    例外

    • 5. ECMQV 密钥交换
    • 6.4. ECMQV 密钥交换和验证方法名称
    • 7.2. ECMQV 消息编号
    • 10.2. 推荐曲线
  • RFC 6668,安全外壳(SSH)传输层协议的 SHA-2 数据完整性验证

    注释:定义了 hmac-sha2-256 和 hmac-sha2-512

  • Draft-ietf-curdle-ssh-kex-sha2 (工作中),安全外壳(SSH)密钥交换(KEX)方法更新和建议。

    偏差

    • diffie-hellman-group1-sha1
    • diffie-hellman-group-exchange-sha1
    • diffie-hellman-group14-sha1

    默认情况下不启用,因为它们现在被认为是不安全的,但仍然支持,并且可以使用 preferred_algorithmsmodify_algorithms 选项启用。

  • RFC 8332,安全外壳(SSH)协议中带有 SHA-256 和 SHA-512 的 RSA 密钥的使用。

  • RFC 8308,安全外壳(SSH)协议中的扩展协商。

    已实现:

    • 扩展协商机制
    • 扩展 server-sig-algs
  • 使用 Curve25519 和 Curve448 的安全外壳(SSH)密钥交换方法

  • RFC 8709,用于安全外壳(SSH)协议的 Ed25519 和 Ed448 公钥算法

另请参阅

应用