转自http://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讨论使用,代表常见普通权限用户。

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

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

{

while(1)sleep(1);

}

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

$>ll

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

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

$>su test1

$>./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

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

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

$su test2

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 test1 test 6780 Sep 16 15:32 a.out

使用root用户执行

$>./a.out

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

503 503 503 503 3592 a.out

把代码中setuid改成seteuid函数,会把euid和fuid改成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

到了这里我来总结一下: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

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

{

while(1)sleep(1);

}

$>g++ main.cpp

$>ll

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

$>chmod u+s a.out

$>ll

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

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

0 502 502 502 4133 a.out

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

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

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

int main(int argc, 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. 1 root root 7397 Sep 16 18:53 a.out

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

502 0 0 503 4240 a.out

$>ll

-rws---r-x. 1 root root 7397 Sep 16 18:53 a.out

-rw-rw-r--. 1 test2 test 0 Sep 16 18:54 test.log

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

当使用exec系列函数时候,会把suid置为euid。

linux下进程权限分析的更多相关文章

  1. 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)

    在网络课程中,有讲到Socket编程,对于tcp讲解的环节,为了加深理解,自己写了Linux下进程Socket通信,在学习的过程中,又接触到了其它的几种方式.记录一下. 管道通信(匿名,有名) 管道通 ...

  2. 【Linux】Linux下进程间的通信方式

    本文内容: 1.进程通信的目的 2.介绍Linux下进程间的4种通信方式:管道,消息队列,共享内存,信号量 ps:套接字也可以用于进程间的通信,不过是不同物理机器上的进程通信,本章讨论是是同一台物理机 ...

  3. 【Linux下进程机制】从一道面试题谈linux下fork的运行机制

    今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在linux下使用gcc编译: #include "stdio.h" #includ ...

  4. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  5. Linux 下的权限改变与目录配置

    Linux 下的权限改变与目录配置 ./代表本目录的意思. (1):用户与用户组, 1:文件所有者,文件被某一用户所有 2:用户组:    对文件给与一个或者多个用户权限配置 3:其它人: (2):l ...

  6. Linux下的权限管理

    Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功. Linux下文件的权限类型一般包括读,写,执行.对应字母为 r.w.x. Linux下权 ...

  7. 以C语言为例完成简单的网络聊天程序以及关于socket在Linux下系统调用的分析

    套接字是网络编程中的一种通信机制,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程. 端 ...

  8. linux 下进程通讯详解

    linux 下进程通讯方法主要有以下六种: 1.管道 2.信号 3.共享内存 4.消息队列 5.信号量 6.socket

  9. Linux下进程的建立

    Linux下进程的建立 我们都知道,进程就是正在执行的程序.而在Linux中,可以使用一个进程来创建另外一个进程.这样的话,Linux的进程的组织结构其实有点像Linux目录树,是个层次结构的,可以使 ...

随机推荐

  1. 学习下nginx负载均衡--深入理解nginx

    作为代理服务器,一般都需要向上游服务器转发请求.这里的负载均衡是指通过一种策略尽量把请求平均的分发都上游服务器 1.upstream 语法 upstream name {} 配置快: http 栗子( ...

  2. ATI显卡添加自定义分辨率

    run regedit, 浏览到这个键目录下 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video 先导出一个作为备份. 查找 DALNo ...

  3. centos 命令集合

    链接: http://www.cnblogs.com/zitsing/archive/2012/05/02/2479009.html http://www.centoscn.com/CentOS/he ...

  4. python 测试驱动开发的简单例子

    一.需求分析 需求:一个类 MyClass,有两个功能:add, sub 1.先功能设计 # myclass.py class MyClass(object): # 加法 def add(self): ...

  5. [MetaHook] Quake FMOD player demo

    CFMOD.h #ifndef CFMOD_H #define CFMOD_H #include "qfmod.h" struct Sound_t { char *pszName; ...

  6. 分布式中使用Redis实现Session共享(一)

    上一篇介绍了如何使用nginx+iis部署一个简单的分布式系统,文章结尾留下了几个问题,其中一个是"如何解决多站点下Session共享".这篇文章将会介绍如何使用Redis,下一篇 ...

  7. xmind 使用备忘

    快捷键: shift+enter 编辑文字时回车换行 enter 快速建立同级主题(纵向) tab 快速建立子主题(横向) F4 插入注释 alt+左键+移动 拖动 shift+左键+移动 将元素脱离 ...

  8. 知乎UWP 预览

    又是很久都没有写博客了,为了表达歉意,奉上一个新的App,O(∩_∩)O! 因为商店的知乎太多了,然而,,所以一直打算自己动手写一个. 近段时间有些假期加上课程不是很忙,抽时间写了这个知乎.商店链接 ...

  9. Python使用基础

    1) 基本概念1.1 常量 Python没有提供常量保留字,需要自行扩展一个常量类来实现常量功能 class _const: class ConstError(TypeError):pass def ...

  10. Google 面试

    坚持完成这套学习手册,你就可以去 Google 面试了 系统 指针 value Google 面试 阅读10266   本文为掘金投稿,译文出自:掘金翻译计划 原文地址:Google Intervie ...