Swift51.com
麦子学院 头像
麦子学院  2016-11-21 16:04

Linux中的进程权限问题和现象详解

回复:0  查看:2460  

linux下,关于文件权限,大部分人接触比较多,也比较熟悉了解.但是对进程权限一般知之甚少。本文总结一下linux系统下进程权限问题和现象,希望可以帮助大家更好的学习linux进程相关知识

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

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

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

  另外,本文主要讨论useridgroupid规则基本一样,例如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)。

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

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

  int main(int argc, char *argv[]){

  while(1)sleep(1);

  }

  $>g++ main.cpp -o a.out

  $>ll

  -rwxr-xr-x. 1 test1test 6780 Sep 16 15:32 a.out

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

  $>sutest1

  $>./a.out &

  $>ps -ax -o ruid -o euid -o suid -o fuid -o pid -o fname | grep a.out

  502 502 502 502 3192 a.out

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

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

  $sutest2

  503 503 503 503 3234 a.out

  再用root用户执行

  0 0 0 0 3257 a.out

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

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

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

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

  int main(int argc, char *argv[]){

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

  while(1)sleep(1);

  }

  $>ll

  -rwxr-xr-x. 1 test1test 6780 Sep 16 15:32 a.out

  使用root用户执行

  $>./a.out

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

  503 503 503 503 3592 a.out

  把代码中setuid改成seteuid函数,会把euidfuid改成test2用户

  0 503 0 503 3614 a.out

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

  0 0 0 503 3636 a.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用户执行,得到都是一样的结果

  0 503 0 503 3614 a.out

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

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

  这点应该是总所周知的特点,本文就不举例子演示。2seteuid 会同时改变euidfuid都为设置的euid值。3root用户可以通过调用setxxuid 来改变权限用户。非root用户是无法改变和转让权限用户。

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

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

  三、标志位影响的是 euidsuid,和 fuid

  int main(int argc, char *argv[]){

  while(1)sleep(1);

  }

  $>g++ main.cpp

  $>ll

  -rwxr-xr-x. 1 test1test 6780 Sep 16 18:18 a.out

  $>chmod u+s a.out

  $>ll

  -rwsr-xr-x. 1 test1test 6780 Sep 16 18:18 a.out

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

  0 502 502 502 4133 a.out

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

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

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

 

文章来源:伯乐在线