我正在编写一个 shell 脚本,其中大多数命令不需要 root 权限。该脚本应由管理员运行。但我希望能够“su”到普通用户帐户来执行不需要 root 权限的脚本部分。这将最大限度地减少使用 root 权限执行的操作数量并提高安全性。
有没有 Linux 命令可以做到这一点?
我知道可以通过 su 访问任何用户帐户,但我不想依赖于机器上存在特定用户名的假设。
我考虑过在脚本执行期间创建一个临时帐户,然后在脚本结束时将其删除。但如果我不为该帐户设置密码,攻击者是否能够在帐户短暂的生命周期内使用它?我无法将用户 shell 设置为 /sbin/nologin,因为这显然会阻止在“起诉”该帐户的shell 脚本中执行命令。
感谢您的帮助。
答案1
我个人会颠覆您的策略,以非特权用户身份运行脚本,并使用 sudo 运行需要 root 权限的命令。您需要以 root 身份运行脚本有什么特殊原因吗?
但是,要回答您的问题,您可以使用 -c 标志以用户身份运行特定命令:
su someuser -c "touch /tmp/file"
答案2
我不想依赖于机器上存在特定用户名的假设。
成为超级用户有很多优势... :-)
scriptuser_created=no
scriptuser=myuser
if ! id "$scriptuser" &>/dev/null
adduser --system "$scriptuser"
scriptuser_created=yes
fi
sudo -u "$scriptuser" command1
sudo -u "$scriptuser" command2
sudo -u "$scriptuser" command3
if [ yes = "$scriptuser_created" ]; then
userdel "$scriptuser"
fi
答案3
解决此类问题的传统方法是建立一个永久用户帐户,该帐户具有相应程序所需的访问级别和权限。网络服务(如 apache)通常以自己的用户身份运行,其权限与普通交互式用户不同,且远低于 root 用户。
如果 root 首先运行脚本,他们就不需要向其他用户提供 su 密码,即使该用户有密码。
答案4
#! /bin/bash
# (GPL3+) Alberto Salvia Novella (es20490446e)
execute () {
function="${1}"
command="${2}"
error=$(eval "${command}" 2>&1 >"/dev/null")
if [ ${?} -ne 0 ]; then
echo "${function}: $error"
exit 1
fi
}
executeAsNonAdmin () {
function="${1}"
command="${2}"
eval setPasswordAsker="SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass"
run="runuser ${SUDO_USER} --session-command=\"${setPasswordAsker}\" --command=\"${command}\""
execute "${function}" "${run}"
}
executeAsNonAdmin "" "${@}"