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


12

我需要允许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上工作的解决方案感兴趣。

Answers:


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

1
照原样,这与sudoers的问题相同。您需要引用该变量,否则它将在空格处分割。
— kyrias 2015年

这行不通;setuid不适合shell脚本使用(在Linux上)。
— 马丁·

它所做的只是使用sudo执行脚本。它与“ hello world”脚本没有什么不同。如果root可以运行该脚本,则它将起作用。
— Baazigar

0

根据SUID

您提出的解决方案可以创建使用sudo调用systemctl的脚本。使脚本归root拥有。提供SUIDroot权限,并向数据库管理员组(dba)授予读取和执行权限。
请注意不要向该组或其他人提供写权限,因为那样他们可能会更改脚本并使其执行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 35 Aug 2 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只要执行脚本,执行脚本的用户就可以成为root用户。
5.因此sudo不会停止输入密码。

无论如何,在具有多个用户的系统中,请格外小心,SUID因为它可能会留出滥用权限的空间。


您在脚本中缺少shebang,即使SUID在默认情况下,该脚本也无法使用。
— 1月Tojnar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.