无法通过ssh创建具有密码的用户[关闭]


13

我试图通过ssh(具有root权限)使用密码创建用户:

ssh root@123.45.6.7 useradd -p $(openssl passwd -1 1234) newuser

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

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

ssh root@123.45.6.7 "useradd -p $(openssl passwd -1 1234) newuser"

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

password=$(openssl passwd -1 1234)
ssh root@123.45.6.7 "useradd -p $password newuser"

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


在命令行上传递密码不是一个好主意,因为其他用户可能会看到命令行参数。请参阅heemayl的答案。除此之外,这听起来像是XY问题。您实际上想实现什么?没有人知道(或应该知道)的帐户密码有什么意义?如果要创建一个不接受通过密码登录的帐户,则根本不设置密码,这将使基于密码的登录禁用为Ubuntu的默认策略。
David Foerster

Answers:


22

这是一个经典的报价问题。

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

解决方案:在本地外壳程序上useradd使用的命令周围用单引号引起来,ssh以防止在本地环境上进行命令替换和变量扩展,让扩展发生在远程非登录,非交互式外壳程序上:

ssh root@123.45.6.7 'useradd -p "$(openssl passwd -1 1234)" newuser'

请注意引用。

安全问题:

  • root应该禁用SSH 登录,如果必须将其启用,则仅应允许基于密钥的身份验证

  • MD5已经坏掉了,没有盐就可以进行简单的Rainbow表攻击(甚至不需要蛮力/字典攻击);openssl passwd确实会产生随机盐。无论如何,您应该真正考虑将SHA-2与盐腌一起使用

  • 作为参数传递给命令的密码对于(远程)系统中的其他进程可能是可见的。这取决于您procfs的安装方式(请hidepid参阅参考资料),以及该命令是否正在重写自身(这种情况大概不会)


1
就像魅力一样,感谢您提供的其他信息!
amigcamel

1
md5crypt密码哈希确实有盐...
ilkkachu

@ilkkachu MD5不是安全的哈希。如果您有兴趣,请在Information Security上进行搜索。确实,您应该使用复合算法或加密库,但是SHA-2明显优于MD5。
wizzwizz4

1
@ wizzwizz4是的,众所周知,它不会更改此答案中信息不正确的事实。:)
hobbs

2
@ wizzwizz4,在Linux中受支持并标记有标识符的密码哈希(md5cryptcrypt(3)$1$普通的MD5哈希算法不同,其方式与$5$$6$ 哈希也不是普通的SHA-256和SHA-512 。基于MD5的方法具有固定的迭代次数,这是最大的问题。
ilkkachu

7

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

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

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

echo "newuser:newpass" | ssh root@123.45.6.7 'useradd newuser; chpasswd' 

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.