编写 samba 密码但安全的脚本

编写 samba 密码但安全的脚本

我想在 samba 用户和密码上编写添加脚本。

我见过与这里类似的解决方案

将密码通过管道传送到 smbpasswd

echo -ne "$PASS\n$PASS\n" | smbpasswd -a -s $LOGIN

但所有看到脚本的人都可以看到密码。我如何使用哈希值并将其作为密码?

答案1

如果您的 smb.conf 包含passdb backend = tdbsam您可以在已设置的系统上导出带有加密密码的文件,请使用:

sudo pdbedit -e smbpasswd:/tmp/smbpasswd

这将创建/tmp/smbpasswd包含用户名和哈希值的文件。它是一个文本文件,您可以轻松查看并可能删除包含您不感兴趣的用户的行。

可以使用以下命令重新导入用户:

sudo pdbedit -i smbpasswd:/tmp/smbpasswd -e tdbsam:/var/lib/samba/private/passdb.tdb

中的用户/tmp/smbpasswd将被添加到 samba 用户数据库中,或者如果已存在则被覆盖。

/var/lib/samba/private/passdb.tdb是 Ubuntu 中 samba 用户数据库文件的位置。

答案2

您的脚本必须能够访问密码。您不能使用密码的哈希值:如果您这样做,哈希值将密码,因为这意味着任何拥有哈希值的人都可以登录。

您应该将密码放在单独的文件中,并从脚本中读取它。请注意准确地重现密码(例如,不要使用,echo -e "$PASS"因为这会解释反斜杠转义)。

IFS= read -r password </somewhere/private/file.password
printf '%s\n%s\n' "$password" "$password" | smbpasswd -a -s "$LOGIN"

或者

IFS= read -r password </somewhere/private/file.password
smbpasswd -a -s "$LOGIN" <<EOF
$password
$password
EOF

当命令运行时,传递给外部命令的参数对其他进程是可见的,因此如果printf是 shell 中的外部命令,请不要使用第一个解决方案。目前大多数 shellprintf都内置了;使用type命令查看,或者这里的文档形式。

确保包含密码的文件只能由应执行脚本的用户读取。当然,以该用户身份运行的任何命令都可以读取该脚本;如果这是不可取的,那么您需要以不同的用户身份运行脚本(或使用其他一些隔离机制,但单独的用户是最容易设置的)。

相关内容