使用Python作为根用户更新UNIX帐户密码的安全方法



考虑一个UNIX帐户jdoe。我想使用作为root运行的python脚本来更新jdoe的密码。目前,我正在使用:

cmd = 'echo "' + username + ":" + new_pass + '" | chpasswd '
os.system(cmd)

然而,这是一种不安全的方法。如果有人以pass"; rm -rf / #的身份进入new_pass,那将是荒谬的。

有安全可靠的方法吗?

如果您担心不受信任的输入,最好避免使用os.system,因为这会调用shell,而且通常情况下,您不希望shell接近不受信任输入。此外,您通常希望避免将机密放入命令行参数中,因为其他用户可以读取这些机密,尽管由于echo,通常是内置的,因此这并不是严格意义上的问题。

为了安全地做到这一点,您可以使用subprocess.Popen,如下所示:

import subprocess
proc = subprocess.Popen(['chpasswd'], stdin=subprocess.PIPE)
proc.stdin.write(b"username:password")

注意,如果您需要向chpasswd传递额外的参数,您可以通过向数组中添加参数来实现:

proc = subprocess.Popen(['chpasswd', '-c', 'SHA512'], stdin=subprocess.PIPE)

我会修改它,这样输入的密码就会被散列(sha512是现代Linux系统的标准(,然后将散列值传递给cmd。

cmd = 'echo "' + username + ":" + new_pass + '" | chpasswd -e'
os.system(cmd)

注意chpasswd之后的-e

以上建议再提一点:

import crypt
entered_password = 'pass"; rm -rf / #'
new_password = crypt.crypt(entered_password, '$6$' + 'salt1234')

最新更新