设置用户ID位的那回事

2024-03-31 16:48
文章标签 设置 用户 id 那回事

本文主要是介绍设置用户ID位的那回事,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文章转载自:http://blog.csdn.net/ccjjnn19890720/article/details/6990656

微笑

于这个知识点,让我一段时间都觉得很难了解!经过了几章的学习,有点慢慢了解这个怎么一回事情。

每一个进程其实对应了6个以上的ID,它们分别是
实际用户ID,实际组ID
有效用户ID,有效组ID,附加组ID
保存设置用户ID,保存设置组ID


        实际用户ID,就是当前执行这个进程的ID,比如我现在是andrew用户,那么我执行main程序,那么这个main的实际用户ID就是andrew,实际组ID其实和实际用户ID类似。
        有效用户ID,这个就是比较关键的一个ID,这个ID应该是unix一直在使用的一个ID,因为即使你只是一个很简单的访问文件,那也是要通过这个有效用户ID的,因为每一个文件都有一定的访问权限,而一个进程或者一个程序去访问它,os本身就是根据你的有效用户ID了给与一定量的权限.
那么有效用户ID与实际用户ID有什么区别呢??
        这两个ID在一般情况下是相同的,比如当前用户是andrew,那么它的实际用户ID是andrew,而有效用户ID也是andrew。可是在不一般的情况下那么这两个ID就可能不一样了,那么什么样的情况下是不一样的呢?那就是当一个用户要进行一个合理的特权的时候就需要啦,那么到底是怎么样的情况呢?

        比如我们在linux系统中的passwd这个命令或者这个passwd这个程序,一个用户对自己进行修改密码是一种很正常的事情,可是保存密码的文件/etc/passwd却是root用户可写的这样的权利,那么也就是用如果你要修改密码,必须通过root用户帮你修改,这样出现的问题可不是一点点...

[plain]  view plain copy print ?
  1. <span style="font-size:13px;">-rw-r--r-- 1 root root 1762 2011-11-04 18:16 /etc/passwd</span>  
        这个事情的处理是这样的,让用户去运行passwd这个程序的时候,os给与root用户的权利,然后用户就可以修改自己的密码。具体的讲就是让用户去运行passwd这个程序的时候,unix将它的有效用户ID变成了拥有passwd的用户的ID,也就是root,所以就可以修改这个/etc/passwd这个文件。

<注 passwd命令是/usr/bin/passwd,passwd这个文件是/etc/passwd>

      保存设置用户ID,这个ID是前段时间让我一直不明白的ID,那是相当的郁闷,不过经过最近的学习发现了这个ID的用处。这个ID是用来保存有效ID的副本,让我们运行程序的过程其实就是os调用exec系列函数来调用我们程序的main函数,exec函数是kernel唯一执行程序的方法,或者那么讲不管什么用户程序的运行,其实也就是os的exec的调用过程。而exec在调用过程中会将这个程序的有效用户ID拷贝给保存用户ID。至于有什么用,下面再提出。


2.文件的设置用户ID位

       这个东西应该是上面的关键所在,每一个文件都有一个文件模式字(st_mode),这个字可以通过看stat函数去函数,而这个模式字包含了很多文件的属性,包括文件的类型,以及文件的访问权限的,当然设置用户ID位也在其中。通过设置这个位,就能当执行这个文件的时候,进程的有效ID设置为该文件本身的用户。不知道你明白与否,不过我那个时候却没有明白,不过现在却明白了,这里的文件我可以把他认为是一些可运行的文件,或者就是可执行文件,而当运行这个文件的时候,进程会改变其有效用户ID,变成这些文件本身的ID。还是举那个passwd这个例子,它的属性是

[plain]  view plain copy print ?
  1. -rw<span style="color:#ff0000;">s</span>r-xr-x 1 root root 37140 2011-02-15 06:11 /usr/bin/passwd   
看到s了没有,这就是设置了设置用户ID位的标志,而他的own是root,也只有root能有权利去写/etc/passwd的文件,可以当我们改变我们的密码的时候我们也改变了这个文件,现在你能感觉到什么了不??

下面举一个实际的例子看看:

[cpp]  view plain copy print ?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <sys/stat.h>  
  4. #include <unistd.h>  
  5.   
  6. int main()  
  7. {  
  8.     printf("real user ID = %d\n",getuid());  
  9.     printf("effect user ID = %d\n",geteuid());  
  10.   
  11.     return 0;  
  12. }  
  13.   
  14. andrew$./main  
  15. real user ID = 1000  
  16. effect user ID = 1000  
  17.   
  18. andrew$su  
  19. root#chown root main  
  20. root#chmod u+s main  
  21. root#ls -l | grep main  
  22. -rwsr-xr-x  1 root   andrew  9809 2011-11-19 10:32 main  
  23. root#exit  
  24. andrew$exit  
  25. andrew$./main  
  26. real user ID = 1000  
  27. effect user ID = 0  
就像你看见的,有效用户ID变化了,真的变了,真的很神奇把,哈哈如果你还想知道其他的话,你可以试试看access这个函数,这个函数可以得知一个进程真的的能力,而不受设置用户ID的影响的,所以它能让你见到一个进程本身没有访问那个文件的能力,可是他在具体的运行的过程却可以打开这个文件。

3.还有一些什么呢?

关于这个我还想讨论一些东西,首先就是setuid(uid)这个函数,这个函数在不同的用户之下有这不一样的效果:
在root用户下,可以是实际用户ID,有效用户ID,保存设置用户ID都设置为uid
在普通用户下的话,如果uid是实际用户ID或者保存设置用户ID的话,那么则会将有效用户ID设置为uid,
如果不符合上面的那么就返回-1
还有关于kernel关于这3个用户的维护过程:
1.实际用户ID,这个ID可以认为是用户也不会改变的,除了root用户下的setuid这个函数可以改变,因为通常我们在login以后我们的用户就已经决定下来啦,那么也就是说实际用户ID是不变的。
2.有效用户ID,这个ID通常情况下是不改变的,但是当执行文件被设置了设置用户ID位,那么exec会将这个进程的有效用户ID修改成这个可执行文件的本来的用户,就像我们前面所说的那样的。
3.保存设置用户ID,这个准确的说可以认为是有效用户ID的备份,不管什么时候,只要运行了exec以后都会对有效用户ID进行拷贝的。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

以下参考自:http://bbs.csdn.net/topics/390185226 六楼的同学。

程序启动后, 实际用户ID是启动者是谁, 有效用户ID一般是启动者, 如果程序有用户s权限就是程序的用户主, 还有一个保存设置用户ID,从命令行启动程序后是有效用户ID。

前两者一般人都懂,保存设置用户ID没几个人懂。

当一个程序setuid(uid)之后,如果当前有效用户ID是root,那么RUID,EUID,SAVED SET-USER-ID都被设置成uid。
而如果想再切回root是很难的,只有少数操作系统实现支持使用seteuid切回root。为什么不能切回root了?因为:
       If  the process does not have appropriate privileges, but uid is equal to the real user ID or the saved set-user-ID, setuid() shall set the effective user ID
       to uid; the real user ID and saved set-user-ID shall remain unchanged.

只有uid等于当前的RUID/S-S-UID才可以,但seteuid可以帮你突破这个限制。

对于一个EUID不是root的用户,就很简单了:可以切成RUID或者S-S-UID。

比如A用户启动的程序,那么3个ID都是A, 于是A用户没有任何用户可以切。
但是,如果A用户启动的程序是设置过s权限的B用户的程序,那么A的RUID=A,EUID=B,S-S-UID=B。
此时如果想让程序降权,也就是让EUID从B变到A,那么setuid(getuid())即可变成RUID=A,EUID=A,S-S-UID=B。 降权后干了一些事后打算提权回B,因为S-S-UID=B,所以可以setuid(B的UID)提权回B,也就是RUID=A,EUID=B,S-S-UID=B,又变到了最初的样子。

这篇关于设置用户ID位的那回事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864825

相关文章

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

Linux:alias如何设置永久生效

《Linux:alias如何设置永久生效》在Linux中设置别名永久生效的步骤包括:在/root/.bashrc文件中配置别名,保存并退出,然后使用source命令(或点命令)使配置立即生效,这样,别... 目录linux:alias设置永久生效步骤保存退出后功能总结Linux:alias设置永久生效步骤

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2