Apache下root权限运行CGI

原创 2015年11月18日 23:01:48

问题场景

Apache默认是以daemon用户(或者其他other用户)和daemon用户组启动的,所以其worker进程也是daemon权限的,这样,worker进程fork的CGI进程,以及CGI再fork的子进程,都是daemon权限的。如果想在CGI或者CGI子进程中操作一些需要root权限的文件或者命令,就会报权限错误。
Apache其实也可以通过root权限来启动,需要在编译时加入特定选项,而且配置中的User和Group都修改成root,但是Apache强烈建议不要这么做,应该是出于安全考虑。
那么怎么解决非root用户启动的Apache的CGI进程可以访问需要root权限才能访问的资源呢?

解决方法

声明:本方法根据网上一些方法整理而来,经验证有效。

  • 在root权限下编写并编译你的CGI;
  • 在你的CGI开始的时候添加如下代码:
...
uid_t uid = getuid();//获取当前进程的user id
uid_t euid = geteuid();//获取当前进程的effective user id
//euid应该为0,即root权限
printf("befor setreuid uid: %u, euid: %u\n", uid, euid);
if (setreuid(euid, uid)) {//交换有效用户ID和实际用户ID
     perror("setreuid");
     return -1;//出错的话还是尽早返回吧,否则后面也会报权限错误
}
//此时的uid应该为0,拥有了root权限
printf("after setreuid uid: %u, euid: %u\n", getuid(), geteuid());
...
  • 对编译出来的二进制CGI文件加s权限,并拷贝到Apache的CGI执行目录;
chmod +s your_program.cgi
  • 这样应该就可以了。(不行的话还有别的办法)

简单测试

  • 首先,假设有一个需要root权限才能执行的文件
    root权限可执行a.out
  • 在root权限下编写需要访问a.out的程序test_v1.cpp
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    uid_t uid ,euid;

    uid = getuid();
    euid = geteuid();

    printf("my uid :%u\n", uid);
    printf("my euid :%u\n", euid);

    system("/home/guest/a.out");
    return 0;
}
  • root权限编译,guest权限运行
    test_v1

    可以看到当前uid和euid都是other权限的,访问a.out时权限受限

  • 在root权限对文件test_v1加s权限后,guest权限再次执行
    这里写图片描述
    这里写图片描述

    可以看到,此时的euid已经变成root权限的了,但是还是无法访问a.out

  • 修改test_v1代码,修改后test_v2.cpp如下
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    uid_t uid ,euid;

    uid = getuid();
    euid = geteuid();

    printf("my uid :%u\n", uid);
    printf("my euid :%u\n", euid);
    if(setreuid(euid, uid))//交换有效用户ID和实际用户ID
        perror("setreuid");
    printf("after uid :%u\n", getuid());
    printf("after euid :%u\n", geteuid());

    system("/home/polli/test/a.out");
    return 0;
}
  • 在root权限编译test_v2, 并加s权限,guest权限执行test_v2
    这里写图片描述

    可以看到交换权限后,uid变为root权限,可以正常执行a.out

参考链接

  1. 《在apache中运行root权限的CGI脚本》
  2. 《setuid seteuid setreuid 三个函数讲解》
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

修改apache的httpd服务为root权限

修改apache的httpd服务为root权限。

apache 2.4 配置webdav的用户权限

听说 apple 公司最新的 Lion 系统已经用 webdav 取代 ftp 了,看来很有潜力。 apache 2.4.1 默认安装目录在/usr/local/apache2/。 一、httpd...

配置apache支持cgi

最近在搭建gitweb,需要apache支持perl(支持cgi功能) 网上找了很多方法,很多都失败了,最后总结了一条配置成功的方法: 一、首先已经安装上了apache服务器 二、编辑/etc/apa...

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

Radon变换理论介绍与matlab实现--经验交流

本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...

CT图像重建技术

由于csdn贴图不方便,并且不能上传附件,我把原文上传到了资源空间CT图像重建技术 1.引言 计算机层析成像(Computed Tomography,CT)是通过对物体进行不同角度的射线投影测量而...

Matlab绘图-很详细,很全面

Matlab绘图强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数。此外,Ma...

linux查找目录下的所有文件中是否含有某个字符串

查找目录下的所有文件中是否含有某个字符串  find .|xargs grep -ri "IBM"  查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名  find .|xargs g...

Radon变换入门matlab CT原理

http://hi.baidu.com/hi9394/blog/item/0d492b8bfd714700c8fc7aa9.html 简介 图像投影,就是说将图像在某一方向上做线性积分(或理解为累...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Apache下root权限运行CGI
举报原因:
原因补充:

(最多只允许输入30个字)