我希望允许用户运行任何脚本集合,并将输出写入指定的目录,但不允许用该用户的任何其他脚本或命令写入指定的目录。
目的是将指定的目录rsync同步到系统之外,但仅限于批准的脚本。 用户可以不受限制地运行其他脚本,但是除了批准的脚本之外,不能将输出导出到环境之外。
试图解决这个问题
我已经尝试设置两个用户的“正常”和“限制”的输出目录和“限制”所拥有的批准的脚本,所以“正常”运行脚本作为“限制”,允许输出到限制目录,这个工程,但是没有任何东西可以阻止'正常'运行一个未经validation的脚本作为'受限制',允许输出到'受限'的目录,这是我想要阻止的。
以下是你可以做的事情:
您将需要两个用户“正常”和“受限制”,但不要将受限用户的密码交给普通用户。 然后打电话:
visudo
并添加所有你想让普通用户作为受限用户执行的脚本,如下所示:
normal ALL=(restricted) NOPASSWD: scriptDir/script.sh
然后让用户正常调用脚本,如:
su -c scriptDir/script.sh restricted
通过这种方式,您可以控制您想让用户正常执行的脚本受限制
通过安装实用程序(getfacl和setfacl)来设置ACL – 访问控制列表。
您可以设置每个用户的ACL,但是将一个应该具有相同权限的用户放在一个组中的文件系统的一部分中,并为该组设置ACL,通常会更容易。 例如,如果组html-writers中的用户应该对/ var / www / html下的树具有读写权限
你可以使用setfacl:
setfacl -m group:html-writerrs u:username:rwx myfolder
这为特定用户设置权限,而不更改目录的所有权。
听起来像你正在试图解决一个问题,使用不允许你做你想做的工具。 如果您依赖于ACL或Unix权限,则有关该目录的权限取决于正在尝试更改它们的用户。 所以无论你如何剪切它,如果用户可以写入目录,除了你希望创build的文件以外,还可以创build文件。
但是,如果用户不能写入目录,但希望脚本能够运行,则必须以可以运行的用户身份运行该脚本。 这可以通过2种方式完成,如果您必须使用脚本,那么您可以使用sudo,如@Wissam Al-Roujoulah所述。 如果您可以将预期行为转换为二进制文件而不是脚本,那么您可以使用setuid对其进行configuration,以便组中的任何成员都可以运行该二进制文件,但该二进制文件将以不同的用户身份运行。
脚本中的sudo问题与您无法在脚本上使用setuid的原因相同。 对于有人使用shellvariables来破坏脚本的行为简直太容易了,所以谨慎行事。
我通过编写一个运行系统命令的非常基本的.c文件(如脚本)解决了我自己版本的问题,然后使用编译后的二进制文件setuid来允许用户使用它。 在我的情况下,我想清除来自不同位置的caching文件夹,二进制文件需要以root身份运行,但我希望非特权用户能够运行它。
我已经把文件剪掉了很多,因为我的原始文件包含了在不同位置清除多种不同types的caching的选项,但是你明白了。 我还包括了我用来审计日志的代码,因为它显示了如何将信息放入系统日志,如果你想使用它而不是文件。
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <string.h> #include <syslog.h> int has_root_euid() { if (geteuid()==0) { return 1; } return 0; } int main (int argc, char * argv[]) { int retval; uid_t uid; uid = getuid(); openlog (argv[0], LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); syslog (LOG_NOTICE, "UID %d ran clearcache", uid); closelog(); if (!has_root_euid()) { printf("Insufficient permissions to clear WSDL cache.\n"); } else { printf("Clearing WSDL cache: rm -f /tmp/wsdl*\n"); setuid(0); retval = system("rm -f /tmp/wsdl*"); setuid(uid); printf("System returns (%d). \n", retval); } return 0; }