我试图找出是否可以由其他用户或登录用户以外的方式执行 Bash 脚本sudo -u otherusername
。
我有一个带有行的脚本:echo $USER
。
echo $SUDO_USER
这应该始终向我显示执行该脚本的用户。
从本次问答我收集到某些用户可以使用sudo
,因此变量SUDO_USER
or${SUDO_USER:-$USER}
可以显示哪个用户执行了 Bash 脚本,无论是由登录用户调用还是由使用sudo
.
除了使用登录用户或使用sudo
.那么除了上面提到的方法之外,还有另一种执行脚本的方法吗?命令是否echo $USER
会echo ${SUDO_USER:-$USER}
显示“原始”用户名?
换句话说,是否可以在执行脚本时$USER
隐藏您的用户名?$SUDO_USER
我在互联网上搜索它,但没有找到任何答案,使用的搜索关键字:“bash调用脚本混淆用户名”。
也许答案是否定的,但因为一切皆有可能......某种黑客或欺骗也许是可能的......
答案1
您可以使用sudo
任何用户身份运行命令(只要您有权sudo
访问):
$ cat ~/scripts/foo.sh
#!/bin/bash
echo $USER
$ ~/scripts/foo.sh
terdon
terdon@tpad ~ $ sudo -u bib ~/scripts/foo.sh
bib
因此,只需使用目标用户的用户名sudo -u USERNAME
运行脚本即可。USERNAME
该SUDO_USER
变量具有运行该命令的用户的用户名sudo
,但该USER
变量将是目标用户:
$ cat ~/scripts/foo.sh
#!/bin/bash
echo "sudo command was run by $SUDO_USER but I am actually $USER"
$ sudo -u bib ~/scripts/foo.sh
sudo command was run by terdon but I am actually bib
答案2
我按照提问来回答这个问题。但请注意,这个问题的措辞方式让我认为您不了解系统是如何工作的,并且不小心使用这个答案可能会导致系统不安全。
从上面的链接中,我了解到某些用户可以使用 SUDO,因此变量 SUDO_USER 或 ${SUDO_USER:-$USER} 可以显示哪个用户执行了 Bash 脚本,无论是由登录用户调用还是由使用 SUDO 的用户调用。
关于 sudo 的部分是正确的,关于不使用 sudo 的部分则不是。如果您有 sudoers 规则,例如
@staff ALL = (priya) /usr/local/bin/myprogram
然后在运行时myprogram
,可以确信如果程序是通过此 sudo 规则调用的,则该SUDO_USER
变量将设置为调用的用户sudo myprogram
。推论是,如果SUDO_USER
未设置,则运行者myprogram
可以通过其他方式访问myprogram
正在运行的用户帐户。
因此,如果myprogram
应该代表另一个用户执行某些操作,并且priya
非管理员访问帐户的唯一方法是通过此规则,则myprogram
可以代表 指示的用户安全地访问 priya 的资源SUDO_USER
。
如果myprogram
在没有提升权限的情况下运行,那么运行它的任何人都可以选择运行方式。他们可以设置他们喜欢的任何环境变量。该USER
变量是一种约定,与安全性无关。但无论如何,如果myprogram
在没有提升权限的情况下运行,它可以信任(USER
如果它愿意)。安全需要提升权限。如果您想将可执行程序作为黑匣子发送并检查只有某些用户可以运行它,那么忘记吧:这是不可能的,任何声称不这样做的人都是在卖万金油。
换句话说,执行脚本时是否可以对 $USER 或 $SUDO_USER 隐藏您的用户名?
这不是同一个问题!正如我上面所解释的,设置USER
和SUDO_USER
运行脚本时绝对是微不足道的。有一种情况并非如此,即用户运行 sudo 并告诉它运行脚本(而不是直接运行脚本)。只有在这种情况下,假设默认 sudo 配置,USER
才能保证是运行脚本的用户并且SUDO_USER
保证是调用 sudo 的用户。
请注意,如果发生的情况是 sudo 规则调用program1,而program1又调用program2,则program2只有在信任program1不会更改这些变量时才能信任这些变量。
除了使用登录用户或使用 SUDO 之外,我想不出其他执行 Bash 脚本的方法。
调用程序的任何其他服务。一个很常见的就是计划任务。通常,用户登录并编辑 crontab;但此后,cron 作业将在用户无需“登录”(即位于计算机前或输入凭据的情况下)的情况下运行。用户被“登录”,因为 cron 算作登录(这是一个术语问题)。
还有其他方法可以使用不同的帐户调用程序,例如苏(这需要目标帐户的凭据)和执行程序(通常需要目标帐户的凭据,但可以使用更复杂的策略)。或者程序可以在某种命名空间或容器内运行(种类太多,无法在此列出)。
在Linux下,还有一个概念“登录ID”。该值应该在用户登录时设置,并且在用户更改为另一个帐户时不会更改。例如,su -
或sudo -i
遵循用户登录的正常流程(设置限制、调用.profile
等),但它们不会更改 loginuid。您可以从/proc/self/loginuid
或使用以下命令检索loginuidlogname
命令。这主要是为了审计。请注意,默认情况下,root能更改登录ID。另请注意,loginuid 是每个进程的概念,没有单个登录用户的全局概念。