su 的反义词:不带 root 权限运行命令

su 的反义词:不带 root 权限运行命令

我正在编写一个 shell 脚本,其中大多数命令不需要 root 权限。该脚本应由管理员运行。但我希望能够“su”到普通用户帐户来执行不需要 root 权限的脚本部分。这将最大限度地减少使用 root 权限执行的操作数量并提高安全性。

有没有 Linux 命令可以做到这一点?

我知道可以通过 su 访问任何用户帐户,但我不想依赖于机器上存在特定用户名的假设。

我考虑过在脚本执行期间创建一个临时帐户,然后在脚本结束时将其删除。但如果我不为该帐户设置密码,攻击者是否能够在帐户短暂的生命周期内使用它?我无法将用户 shell 设置为 /sbin/nologin,因为这显然会阻止在“起诉”该帐户的shell 脚本中执行命令

感谢您的帮助。

答案1

我个人会颠覆您的策略,以非特权用户身份运行脚本,并使用 sudo 运行需要 root 权限的命令。您需要以 root 身份运行脚本有什么特殊原因吗?

但是,要回答您的问题,您可以使用 -c 标志以用户身份运行特定命令:

su someuser -c "touch /tmp/file"

参考:http://linux.die.net/man/1/su

答案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 "" "${@}"

相关内容