如何允许非 root 用户通过实例控制 systemd 服务?

如何允许非 root 用户通过实例控制 systemd 服务?

我需要允许dba组中的用户控制database@服务。答案是这个相关问题就是列出systemctl我想在文件中允许的所有“动词” sudoers,但是,这不适用于我的情况,因为我事先不知道系统中可能存在哪些数据库。例如,如果我列出

%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity

这不包括将来可能存在的实例,并且 dba 将无法

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

不管怎样,我更多地考虑的是包装而不是摆弄特定的系统。

请注意,如图所示另一个相关问题的惊人答案,为此使用 sudo glob 最终是不安全的:

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

确实允许

$ sudo systemctl start database@awsesomeapp unrelatedservice

我怀疑使用sudo并不能解决我的问题(尽管我确实希望我错了)。有没有其他方法可以让非root用户控制systemd服务?

无论如何,我需要在 CentOS 7 系统中执行此操作,并且将来还会在 RHEL7 系统中执行此操作。我也对适用于 Arch Linux 的解决方案感兴趣。

答案1

Sudoers 文件不会那样工作,至少在我看来是这样。 Sudoers 文件旨在提供特定的命令访问权限,而不是指定可以与该命令一起使用的参数。

创建一个以 root 身份运行的脚本并执行以下命令:

/usr/bin/systemctl start database@

让脚本接受一个参数,例如 anotherawesomeapp,以便它执行以下命令:

脚本执行: /usr/bin/systemctl start database@anotherawsesomeapp

授予您的用户使用 /etc/sudoers 运行 script.sh 文件的权限。

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

用户可以像这样运行它:

sh script.sh anotherawsesomeapp

例子:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi

答案2

提出的解决方案基于SUID

您可以创建使用 sudo 调用 systemctl 的上述脚本。使脚本归 root 所有。SUID向数据库管理员(dba)组提供root权限以及读取和执行权限。
请注意不要向组或其他人提供写权限,因为这样他们可能会更改脚本并使其执行 sudo 之前的任何内容!还要确保脚本在输入方面是防弹的。

$ cat >> start_database.sh
sudo /usr/bin/systemctl 启动数据库@$1
(Ctrl+D)

可以通过检查是否确实提供了参数并打印一条Usage:消息来改进此脚本,如果没有...,也因为它是一个脚本,因此SUID适合检查;以避免在参数后面注入其他命令。或者更好地确保仅允许输入您提到的与应用程序相关的字符串之一!
然后您必须确保脚本的权限严格如下:

$ sudo chown root:dba start_database.sh
$ sudo chmod ux,gw,o-rwx start_database.sh
$ sudo chmod u+s,g+rx start_database.sh

然后验证正确的权限:

$ls-la
-rwSr-x--- 1 root dba 8月2日35日19:11 start_database.sh

所以,回顾一下:

1. owner of the script is root
2. 文件can be read and executed by the dba group members
3.no-one else will be able to even read它。
4.SUID将使执行脚本的用户能够成为根只要脚本被执行。
5.所以sudo不会因输入密码而停止。

无论如何,在具有多个用户的系统中,非常小心因为SUID这可能会为权限滥用留下空间。

相关内容