如何允许非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.