AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题

问题[suid](server)

Martin Hope
Jazz
Asked: 2012-06-13 08:40:20 +0800 CST

如何在 shell 脚本上使用 SetUID 以非 root 用户身份运行?

  • 5

我们公司的服务器运行的是 Ubuntu 12.04 (Precise) 和 Apache 2。我们安装了自定义的内部 Web 应用程序。我有一个 bash 脚本,它可以将对该应用程序的任何更新从源代码管理提取到服务器。系统上只有一个用户(脚本文件的所有者)拥有连接到源代码管理所需的 SSH 密钥,但我希望系统上的任何用户都能够运行此脚本来更新应用程序。

我做了一些研究,看起来这正是设计 setuid 位的目的,这样系统上的任何用户都可以运行脚本,并且脚本将以脚本所有者的用户 ID 运行. 然而,现代发行版似乎忽略了脚本的 setuid 位,因为如果执行 root 拥有的脚本会带来安全风险。

我想我可以通过将它变成一个 perl 脚本来暂时解决这个问题,但是从 Precise 开始,也不再有 suid-perl 包了。看起来这已被弃用。

我发现一些网站建议通过将用户添加到 sudoers 文件来解决这个问题,但是我的脚本不需要 root 权限来运行,并且它不会对文件系统的任何部分进行任何更改,除了网站,所以我宁愿不授予任何人 sudoer 特权。该脚本只需要脚本所有者的权限才能正常运行。

那么,使用(不同的、非 root、非 sudo)用户的 UID 执行脚本的首选现代方法是什么?

linux scripting ubuntu setuid suid
  • 1 个回答
  • 6274 Views
Martin Hope
Isaac Sutherland
Asked: 2012-05-12 20:07:11 +0800 CST

当用户通过 SUID 位提升为 root 时,smbd 不会启动或停止

  • 1

在 Ubuntu 12.04 下,我编写了以下 C 程序来帮助我在运行自动备份时关闭服务器的 apache2 和 samba 服务。请注意,在 Makefile 中我设置了 SUID 位,这样程序在由低级用户运行时将具有 root 权限tmv。

服务.c:

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

void usage(char * arg0) {
    printf("Usage: %s start|stop\n", arg0);
    exit(1);
}

int main(int argc, char ** argv) {
    fprintf(stderr, "Running as: ");
    system("whoami");
    if (argc != 2) usage(argv[0]);
    if (!strcmp(argv[1], "stop")) {
        printf("Before running rsync, we need to shut down apache2 and smbd.\n");
        system("service apache2 stop");
        system("service smbd stop");
    } else if (!strcmp(argv[1], "start")) {
        printf("After running rsync, we need to start apache2 and smbd.\n");
        system("service apache2 start");
        system("service smbd start");
    } else {
        usage(argv[0]);
    }
    return 0;
}

生成文件:

all: services.c
    gcc -o services services.c
    chown root:tmv services
    chmod u+s services      # allow elevation to root
    chmod o-rx services     # only user tmv should execute

这是我得到的:

tmv@patience:~$ ./services start
Running as: root
After running rsync, we need to start apache2 and smbd.
 * Starting web server apache2                                           [ OK ] 
start: Unable to connect to system bus: Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory

以 root 身份运行工作正常:

# ./services start
Running as: root
After running rsync, we need to start apache2 and smbd.
 * Starting web server apache2                                           [ OK ] 
smbd start/running, process 8515

任何想法为什么我./services在以用户身份运行时无法按预期工作tmv?是不是也需要配置一些环境变量?

backup samba suid
  • 1 个回答
  • 165 Views
Martin Hope
Wadih M.
Asked: 2009-07-23 18:43:50 +0800 CST

以其他用户身份运行 shell 脚本

  • 55

以不同用户身份运行 shell 脚本的好方法是什么。我正在使用 Debian etch,并且我知道我想模拟哪个用户。

如果我手动操作,我会这样做:

su postgres
./backup_db.sh /tmp/test
exit

由于我想自动化该过程,因此我需要一种将 backup_db.sh 作为 postgres 运行的方法(继承环境等)

谢谢!

linux scripting debian shell suid
  • 8 个回答
  • 251127 Views
Martin Hope
Tom Ritter
Asked: 2009-05-15 19:25:47 +0800 CST

无法在 Shell 脚本上设置 UID

  • 15

谁能帮我找出这里发生了什么?我有一些规则设置跟踪数据包计数。当我以 root 身份运行以下脚本时:

#!/bin/bash
iptables -t mangle -xnvL

我得到了我期望的输出:

//snip
233203 199929802 MARK  //blah blah blah
//snip

但是,我想将它作为 cacti 的一部分运行,它作为 apache 运行。现在 apache 无法运行 iptables,这就是我有脚本的原因。我将其设置为 SUID root:

-rwsr-sr-x 1 root root   37 May 14 23:06 iptables_packet_report.sh

但后来我得到这个输出:

server # sudo -u apache ./iptables_packet_report.sh
iptables v1.4.2: can't initialize iptables table `mangle': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

显然我的内核很好,而且我以非 root 身份运行它的事实搞砸了,但我不明白为什么。我用 [演示]( http://en.wikipedia.org/wiki/Setuid#Demonstration仔细检查了 SUID并确认它正在工作。

server # sudo -u apache ./printid
Real UID  = 81
Effective UID = 0
Real GID  = 81
Effective GID = 0

我的最终目标是在作为 apache 运行时获得 iptables -t mangle -xnvL 的输出,这样我就可以使用 cacti 很好地绘制所有图形。

linux iptables suid
  • 3 个回答
  • 7032 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve