【问题标题】:SSH forced command parametersSSH强制命令参数
【发布时间】:2024-01-22 21:59:01
【问题描述】:

我正在尝试编写一个脚本,在成功 ssh 登录后验证用户权限。

我通过 SSH 强制命令执行此操作。我想传递脚本参数(例如它正在验证的用户),但我不确定该怎么做。

有什么帮助吗?

【问题讨论】:

  • 什么是“SSH 强制命令”?你能告诉我们你正在尝试使用的命令吗?看不到的代码很难调试。

标签: ssh ssh-keys openssh


【解决方案1】:

您可以在 sshd 配置文件中设置 ForcedCommand,或者更好地在相应用户的 authorized_keys 文件中设置。

ssh 执行将环境变量 SSH_ORIGINAL_COMMAND 设置为发送到服务器的完整命令行,然后执行ForcedCommand

编写使用此环境变量来提供参数的脚本具有安全隐患,因为攻击者可能会添加例如; rm -rf / 在命令行末尾。然后首先运行ForcedCommand,然后运行rm -rf /

This article 描述了一个脚本,可用于一般锁定允许的命令行。它还包含相关信息的链接。

机制如下:

  1. 将脚本(仅)作为ForcedCommand
  2. 添加允许的“真实”命令作为参数
  3. 在相应用户帐户的主目录中添加规则文件 (.onlyrules),将允许的参数限制为实际命令。

唯一的脚本读取 SSH_ORIGINAL_COMMAND 检查命令是否 a) 允许(在参数列表中) b) 在用户 PATH 上,然后检查参数是否通过规则(在我们的例子中是简单的 sed(1) 脚本.

一个示例设置:

ForcedCommand /usr/local/bin/only ls

authorized_keys:

command="/usr/local/bin/only ls" ssh-rsa AAAA...

.onlyrules

\:^ls /tmp$:{p;q}

这将只允许将命令ls /tmp 发送到远程主机。

【讨论】:

    【解决方案2】:

    这是我自己想出来的。您可以通过设置环境变量并在强制命令脚本中读取它们来将参数传递给强制命令脚本。

    【讨论】:

    【解决方案3】:

    SSH 不允许通过参数(甚至通过管道)传递密码,这是设计使然,甚至在man 页面中也有描述。通过 ssh 自动登录的唯一方法是通过文件身份验证。

    我认为您可以尝试将用户提供的密码与 /etc/shadow 中的值进行比较。这应该可以解决问题:)

    【讨论】:

    • 我不一定要尝试将密码作为参数传递,但我想知道如何或将什么作为参数传递给强制命令脚本。
    • 有一个名为forced_command 的ssh 选项,您可以在登录时强制ssh 运行。