linux中的进程权限是通过,Linux 下进程权限分析

原标题:Linux 下进程权限分析

本文转自Linux爱好者

文章来自:blog.chinaunix.net/uid-27105712-id-3349522.html

在linux下,关于文件权限,大部分人接触比较多,也比较熟悉了解.但是对进程权限一般知之甚少。本文总结一下linux系统下进程权限问题和现象。

需要强调的是,本文是linux系统下讨论,因为linux和unix有很多不同的地方,并且各个不同的unix系统也有很多不同。

先开门见山的列出本文讨论对象:ruid(实际用户id: real userid)、euid(有效用户用户:effective userid), suid(保存用户id:saved userid)、fuid(文件系统用户id)。

除了上面4个,还涉及到一个位 设置用户id位(set user id bit),,即我们通常所说的处rwx之外那个s标志位。

另外,本文主要讨论userid,groupid规则基本一样,例如rgid, egid, sgid, fgid等,本文就不做组id方面的重复讨论了。

首先,查看这几个uid的方法有两种方式:一是ps 命令 (ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname)列出这几个uid;二是查看status文件,(cat /proc/2495/status | grep Uid)。

本文创建5个test用户 test1~test5用来做本文中sample讨论使用,代表常见普通权限用户。

一:文件所有者用户和程序执行者用户是同一用户的情况

intmain(intargc,char*argv[])

{

while(1)sleep(1);

}

$>g++main.cpp-oa.out

$>ll

-rwxr-xr-x.1test1test6780Sep1615:32a.out

文件所有者是test1,我们用test1用户执行a.out程序

$>sutest1

$>./a.out&

$>ps-ax-oruid-oeuid-osuid-ofuid-opid-ofname|grepa.out

5025025025023192a.out

(看到结果是4个uid全是test1;)

现在我们用test2用户执行test1的程序看看结果

$sutest2

5035035035033234a.out

再用root用户执行

00003257a.out

看到这个结果,我们基本可以总结:

在常见情况下。这四个id只受执行用户影响,不受文件owner用户影响。并且四个uid全部等于执行用户的id;

上面是我们碰到最常见最多的情况,所以导致大部分技术人员很少关心这个四个uid的区别和含义。让我们继续看看更多场景

二、出让权限给其它用户。非root用户是无法出让权限给其它用户,只有root用户才能出让。

intmain(intargc,char*argv[])

{

if(setuid(503)<0)perror("setuid error");

while(1)sleep(1);

}

$>ll

-rwxr-xr-x.1test1test6780Sep1615:32a.out

使用root用户执行

$>./a.out

查看状态,所有uid都变成test2用户。

5035035035033592a.out

把代码中setuid改成seteuid函数,会把euid和fuid改成test2用户

050305033614a.out

把代码中setuid改成setfsuid函数,会把fuid改成test2用户

0005033636a.out

当把代码改成下面样子

if(seteuid(503)<0)perror("seteuid error");

if(setfsuid(504)<0)perror("setfsuid error");

while(1)sleep(1);

或者

if(setfsuid(504)<0)perror("setfsuid error");

if(setfeuid(503)<0)perror("seteuid error");

while(1)sleep(1);

用root用户执行,得到都是一样的结果

050305033614a.out

到了这里我来总结一下:1、setuid和seteuid是有区别的,setuid是永久的放弃root用户权限,转让给非root用户后,

无法再restore到root用户,seteuid是临时放弃root用户权限,可以通过seteuid(0),restore到root权限。

这点应该是总所周知的特点,本文就不举例子演示。

2、seteuid会同时改变euid和fuid都为设置的euid值。

3、root用户可以通过调用setxxuid来改变权限用户。非root用户是无法改变和转让权限用户。

权限出让使用最多的场景是类似apache或mysql程序,启动的时候使用root用户启动,设置一些root用户才能操作的系统配置。创建子进程时候通过setuid降级为nobody用户。

继续看一下s权限位对进程权限的影响

三、s 标志位影响的是 euid,suid,和 fuid

intmain(intargc,char*argv[])

{

while(1)sleep(1);

}

$>g++main.cpp

$>ll

-rwxr-xr-x.1test1test6780Sep1618:18a.out

$>chmodu+sa.out

$>ll

-rwsr-xr-x.1test1test6780Sep1618:18a.out

使用root用户执行,查看用户ID为

05025025024133a.out

s权限位使用最经典的案例是passwd命令

下面我们看看他们对文件权限的影响,构建一个ruid,euid,和fuid都不同,看看创建出来的文件所有者是哪个uid

四、影响用户文件权限的是 fuid,不是 euid,该 uid 是 linux 特有的属性,unix 系统是靠 euid 来判定用户权限。

intmain(intargc,char*argv[])

{

if(setfsuid(503)<0)perror("setfsuid error");

FILE *fp=fopen("test.log","a+");

if(fp==NULL)

{

perror("fopen error");

}

else

{

fclose(fp);

}

while(1)sleep(1);

}

使用s权限位,文件所有者为root,执行者为test1,改变fuid为test2,这样就构造出3个uid各部相同,方便观察效果

$>ll

-rws---r-x.1rootroot7397Sep1618:53a.out

运行查看状态,ruid为test1,euid为root,fuid为test2

502005034240a.out

$>ll

-rws---r-x.1rootroot7397Sep1618:53a.out

-rw-rw-r--.1test2test0Sep1618:54test.log

五、权限的继承,当使用 fork 子进程的时候,子进程全部继承父进程四个 uid,和父进程 uid 相同

当使用exec系列函数时候,会把suid置为euid。返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值