无法通过 ssh 创建带有密码的用户

无法通过 ssh 创建带有密码的用户

我尝试通过 ssh(具有 root 权限)创建一个带有密码的用户,如下所示:

ssh [email protected] useradd -p $(openssl passwd -1 1234) newuser

通过这样做,我可以成功创建一个名为的帐户newuser,但我无法使用预期的密码登录(即1234

如果我添加双引号则没有什么区别:

ssh [email protected] "useradd -p $(openssl passwd -1 1234) newuser"

然后我想知道我是否可以生成散列密码并将其作为变量保存在本地,但仍然没有运气。

password=$(openssl passwd -1 1234)
ssh [email protected] "useradd -p $password newuser"

我是否遗漏了什么?提前致谢!

答案1

这是一个经典的引用问题。

问题:没有任何引号或双引号,命令替换($())和变量扩展($返回的散列密码中的 sopenssl被视为变量指示符)正在本地环境中完成,而不是在远程 shell 上完成。

解决方案:在本地 shell 上使用单引号括住useradd命令,ssh以防止在本地环境中进行命令替换和变量扩展,而是让扩展在远程非登录、非交互式 shell 上进行:

ssh [email protected] 'useradd -p "$(openssl passwd -1 1234)" newuser'

注意引文。

安全问题:

  • 应禁用SSHroot登录,如果必须启用它,则应仅允许基于密钥的身份验证

  • MD5 已经被破解,如果没有加盐,你就会受到简单的彩虹表攻击(甚至不需要暴力破解/字典攻击);openssl passwd不过确实会产生随机盐。无论如何,你应该考虑使用加盐的 SHA-2

  • 作为命令参数传递的密码可能会被(远程)系统中的其他进程看到;这取决于您的procfs安装方式(查看hidepid),以及命令是否重写自身(在这种情况下大概不会)

答案2

正如@heemayl 所说,MD5 密码哈希算法已经过时,当前系统采用较新的基于 SHA-2 的密码哈希算法,该算法具有可自定义的工作因子。但 OpenSSL 命令行工具似乎不支持这些算法。

实用chpasswd功能但是,将允许您根据系统设置更改用户的密码。

这应该允许您创建新用户并在远程端更改其密码。

echo "newuser:newpass" | ssh [email protected] 'useradd newuser; chpasswd' 

chpasswd从标准输入而不是命令行获取用户名和密码。这实际上是一个优势,因为命令行参数对系统上的所有其他进程都是可见的,因此如果openssl passwd在远程运行,密码将立即对系统上的所有进程可见。

我不确定是否有现成的命令行实用程序用于生成系统crypt(3)函数已知的密码哈希值。Perl 有crypt功能内置,但仍然需要生成适当的盐。

相关内容