【问题标题】:Run "systemctl restart ___" from setuid root program without asking for root password?从 setuid root 程序运行“systemctl restart ___”而不询问 root 密码?
【发布时间】:2020-03-30 17:36:39
【问题描述】:

我正在为运行 Linux (CentOS 8) 的网络设备进行开发,对于 VGA 控制台上的一些非常基本的配置,我们设置了一个锁定的用户帐户。我们提供了几个 suid root 程序,它们可以设置 IP 地址和配置 NTP。 (所有其他设置都是通过 Apache 和一些网页完成的。)

我们需要从这些程序中执行的一些操作是重启 NetworkManager.service、重启 chronyd.service、关机和重启。 poweroff 和 reboot 都很好,但重新启动服务却不行。相反,我们得到了这个:

Restarting ntp service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ====
Authentication is required to restart 'chronyd.service'.
Authenticating as: root
Password: 

我猜 systemctl 正在尝试对身份验证进行智能处理,并且能够检测到运行它的用户不是 root,即使它具有 root 权限。有什么方法可以更改用户 ID,以便 systemctl 事情是它的根调用它?

作为参考,我已将完整源代码附加到下面的 suid 根程序之一。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void print_usage()
{
    printf("Usage: safeguard <option>\n");
    printf("Options:\n");
    printf("  poweroff\n");
    printf("  reboot\n");
    printf("  ntp       [restarts NTP service]\n");
    printf("  net       [restarts NetworkManager service]\n");
}

int main(int argc, char *argv[])
{
    if (argc < 2) {
        print_usage();
        return 0;
    }

    if (0==strcmp(argv[1], "poweroff")) {
        printf("Executing poweroff\n");
        system("poweroff");
        return 0;
    } else if (0==strcmp(argv[1], "reboot")) {
        printf("Executing reboot\n");
        system("reboot");
        return 0;
    } else if (0==strcmp(argv[1], "ntp")) {
        printf("Restarting ntp service\n");
        system("systemctl restart chronyd.service");
        return 0;
    } else if (0==strcmp(argv[1], "net")) {
        printf("Restarting NetworkManager service\n");
        system("systemctl restart NetworkManager.service");
        return 0;
    }

    print_usage();
    return 0;
}

【问题讨论】:

    标签: systemctl suid


    【解决方案1】:

    我想通了。我必须添加以下代码才能将“真实用户 ID”更改为与“有效用户 ID”相同。

    uid_t uid, euid, suid;
    getresuid(&uid, &euid, &suid);
    setresuid(euid, euid, suid);
    

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多