从非 root 用户执行 root 所需的脚本
Posted
技术标签:
【中文标题】从非 root 用户执行 root 所需的脚本【英文标题】:Executing root-required script from non-root user 【发布时间】:2016-07-29 13:48:53 【问题描述】:我正在使用 Apache CGI mod 来允许通过 HTTP(S) 请求执行 python 脚本。问题是我要执行的脚本 backup.py 在某一时刻执行了一个子进程调用,其中 mysqldump 命令被传送到 sudo -我。问题是 CGI“用户”www-data 没有 root 访问权限,而且我当然不想在一般情况下给它,只是为了这个特定的任务。如何让 www-data 只在 sudo -i 下执行 mysqldump 命令?
【问题讨论】:
【参考方案1】:提升特定脚本权限的一种方法是使用 sudoers 文件。
创建一个文件,其中包含您不想以 root 权限执行的脚本,比如/path/to/script.sh
。
然后,使用sudo visudo
编辑sudoers
文件,并添加以下行:
www-data ALL = (root) NOPASSWD: /path/to/script.sh
根据需要设置用户名和路径。
【讨论】:
这很接近,但是有细微差别!因为脚本包含子进程调用,所以它们不会继承 sudo 访问权限。这意味着我使用您的解决方案,但没有授予脚本的 root 访问权限,而是仅授予它需要的子进程的 root 访问权限。这可以防止有人稍后修改脚本文件并滥用该 root 访问权限(无论如何,它都可以通过 Web 访问)。所以:%www-data ALL = (root) NOPASSWD: /bin/bash, /usr/bin/python @EschersEnigma:但是,您可以访问 any bash 或 python 脚本,而不仅仅是您创建的那个。最好将需要 root 访问权限的命令隔离到单独的脚本,并为此授予权限。顺便说一句,我认为子进程通常应该从其父进程继承权限,不确定为什么需要专门添加它们。也许你用bash script.sh
而不是path/to/script.sh
来调用它?
它是由 CGI 调用的,所以我什至无法告诉你 CGI 是用 bash 还是 path 运行它。至于另一个问题,可能会有改进,但我不知道我会如何指定。以上是关于从非 root 用户执行 root 所需的脚本的主要内容,如果未能解决你的问题,请参考以下文章
linux下权限问题,如何让无root管理员权限的用户执行需root权限执行的脚本文件
linux下权限问题,如何让无root管理员权限的用户执行需root权限执行的脚本文件
Cron,以root身份执行bash脚本,但一部分(Python脚本)以用户身份执行