这是我的脚本:
script.sh:
sudo cat /etc/passwd-
如果我在sudo会话中(例如我几分钟前用sudo运行了另一个命令),现在运行
script.sh
该脚本将获得sudo访问权限。 但是,如果我运行cat /etc/passwd-/,我将收到权限被拒绝错误。
作为一个用户,我不希望script.sh能够如此简单地获得超级用户权限(例如,没有我使用sudo script.sh访问超级用户权限)。
这是预期的行为吗?
它是可配置的吗?
我认为这种行为完全类似于sudo su,e,g可能会让超级用户访问您在该会话中运行的任何脚本,但更糟糕的是,因为您可能甚至不知道它,并且不知道何时 结束(至少没有手动检查)
您的会话已缓存凭据。 当您自己运行脚本时,它们仍然被缓存。 在单独的会话中运行脚本以避免这种情况,并且您也可以调整缓存长度(也限制您可以使用sudo而不是"所有内容"执行的操作)。
如果所有脚本都可以请求凭据,那么使用sudo与超级用户会话有什么关系? 在缓存凭据时,您是否会创建一个特殊用户来运行非sudo脚本?
sudo比简单地允许用户成为超级用户更加可配置; 将用户限制为仅使用或不使用密码的某些特权命令。
像su会话那样处理你运行sudo的会话,你会更安全(不要从那里做其他事情,限制访问范围等)。 您可以强制使缓存等过期。查看sudo配置。 你可以用它做很多事情。
您可以使用此更改日志缓存凭据的方式。
Is this expected behaviour ?
是的,确实这是一种预期的行为。用户对sudo的缓存凭据负责。
Is it configurable ?
是的,它是可配置的。
我认为您的安全问题是有效的。如果脚本是使用显式sudo命令编写的,则在之前(在某个超时时间内)运行sudo命令的终端中运行script.sh将为脚本提供超级用户权限。
通过运行sudo,可以避免任何脚本在以sudo身份运行时不提示输入密码:
sudo -k script.sh
无论以前的sudo命令或会话如何,它都会要求输入密码。
And to run script.sh without sudo i.e with just script.sh and still prompt
for password for the sudo command/s:
您可以永久更改超时值(sudo维护会话的持续时间):
运行sudo visudo
然后换行:
Defaults env_reset
至
Defaults env_reset,timestamp_timeout=0
保存并退出(ctrl + X然后Y)
这将确保sudo每次运行时都要求输入密码。
或者如果您不想永久更改它并希望您的脚本至少提示一次密码(同时维护会话),那么您可以像这样更改脚本:
sudo -k first-command-with-sudo
sudo second-command
sudo third
and so on
无论以前的sudo命令或会话如何,此脚本都将至少提示输入一次密码。
如果你不知道(或无法访问)脚本script.sh的内容(它内部可以有sudo命令)
并且您希望确保任何sudo命令肯定会提示输入密码至少一次,然后在运行脚本之前运行sudo -K(大写K)。
现在如果你运行script.sh并且它包含一个sudo命令,它肯定会提示输入密码。