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

ami*_*mel 13 ssh command-line password users

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

ssh root@123.45.6.7 useradd -p $(openssl passwd -1 1234) newuser
Run Code Online (Sandbox Code Playgroud)

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

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

ssh root@123.45.6.7 "useradd -p $(openssl passwd -1 1234) newuser"
Run Code Online (Sandbox Code Playgroud)

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

password=$(openssl passwd -1 1234)
ssh root@123.45.6.7 "useradd -p $password newuser"
Run Code Online (Sandbox Code Playgroud)

有什么我想念的吗?提前致谢!

hee*_*ayl 22

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

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

解决方案:在本地shell上useradd使用的命令用单引号括起来,ssh以防止本地环境中的命令替换和变量扩展,让扩展发生在远程非登录、非交互shell上:

ssh root@123.45.6.7 'useradd -p "$(openssl passwd -1 1234)" newuser'
Run Code Online (Sandbox Code Playgroud)

注意引文。

安全问题:

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

  • MD5 已经坏了,没有盐,你会受到简单的彩虹表攻击(甚至不需要蛮力/字典攻击);openssl passwd不过确实会生成随机盐。无论如何,您真的应该考虑将 SHA-2 与 salt-ing 一起使用

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

  • @wizzwizz4,[`crypt(3)`](http://man7.org/linux/man) 支持的密码哈希 ([md5crypt](http://phk.freebsd.dk/sagas/md5crypt.html)) -pages/man3/crypt.3.html) 在 Linux 中并标有 `$1$` 标识符与普通的 MD5 哈希算法不同,与 `$5$` 和 `$6$` [密码hashes](https://www.akkadia.org/drepper/SHA-crypt.txt) 也不是普通的 SHA-256 和 SHA-512。基于 MD5 的方法具有固定的迭代次数,这是它的最大问题。 (2认同)

ilk*_*chu 7

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

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

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

echo "newuser:newpass" | ssh root@123.45.6.7 'useradd newuser; chpasswd' 
Run Code Online (Sandbox Code Playgroud)

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

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