看UNIX相关的书时经常能遇到这几个概念,但一直没有好好去理清这几个概念,以致对这几个概念一直一知半解。今天好好区分了一下这几个概念并总结如下。说白了这几个UID引出都是为了系统的权限管理。 下面分别用RUID, EUID,SUID来表示实际用户ID,有效用户ID,设置用户ID。另外用户ID是个整型数,为了说明方便真接使用了用户名来代表不同的UID。先解释一下这几个ID的作用: RUID, 用于在系统中标识一个用户是谁,当用户使用用户名和密码成功登录后一个UNIX系统后就唯一确定了他的RUID. EUID, 用于系统决定用户对系统资源的访问权限,通常情况下等于RUID。 SUID,用于对外权限的开放。跟RUID及EUID是用一个用户绑定不同,它是跟文件而不是跟用户绑定。 说明SUID的时候很多书都简略的提了一下passwd这个程序,下面就拿这个例子来分析。我们知道linux系统的密码都存在了/etc/shadow这个文件里。这个文件是如此的重要,在做任何修改之前最好先备份一下。查看/etc/shadow文件的属性如下: [root@localhost ~]# ll /etc/shadow -r——– 1 root root 1144 Jul 20 22:33 /etc/shadow 从上可以看出/etc/shadow文件是一个属于root用户及root组的文件,并且只有EUID为root的用户具有读的权限,其它所有EUID都没有任何权限。当你在steve用户(EUID此时也为steve)的shell下试图用vim打开这个文件时会提示权限不允许。至于连root用户也只有读的权限我猜是为了不鼓励root用户使用vim类的编辑器去直接修改它,而要采用passwd命令来修改这个文件。如果你非要直接修改它,那么你可以使用chmod命令修改为属性为root可写,然后就可以修改了。 用过UNIX系统的人都知道,任何一个用户都可以使用passwd这个命令来得新设定自己的密码。但从上面已经知道,非root用记是无法读这个文件的,那么普通用户是如何做到修改这个文件的呢?我们知道passwd这个命令实际执行的程序是/usr/bin/passwd, 查看这个文件属性如下: -r-s–x–x 1 root root 21944 Feb 12 2006 /usr/bin/passwd; 对应文件存取标志的s位就是通常说的SUID位,另外可以看到所有用户都有执行的这个程序权力。当steve用户执行passwd命令的时候。Shell会fork出一个子进程,此时进程的EUID还是steve,然后exec程序/usr/bin/passwd。exec会根据/usr/bin/passwd的SUID位会把进程的EUID设成root, 此时这个进程都获得了root权限, 得到了读写/etc/shadow文件的权限, 从而steve用户可完成密码的修改。 exec退出后会恢复steve用户的EUID为steve.这样就不会使steve用户一直拥有root权限。 我们可以测试一下,用root用户把/usr/bin/passwd的SUID位去掉,如下: [root@localhost ~]# ll /usr/bin/passwd -r-s–x–x 1 root root 21944 Feb 12 2006 /usr/bin/passwd [root@localhost ~]# chmod u-s /usr/bin/passwd [root@localhost ~]# ll /usr/bin/passwd -r-x–x–x 1 root root 21944 Feb 12 2006 /usr/bin/passwd 然后steve用户用命令passwd去更新密码会提示如下错误: [steve@localhost ~]$ passwd Changing password for user steve. Changing password for steve (current) UNIX password: passwd: Authentication token manipulation error [steve@localhost ~]$ 这就是因为/usr/bin/passwd程序的SUID去掉后,steve用户虽然可以执行该程序,但因为/usr/bin/passwd/的SUID没有设置,这样exec后进程的EUID仍为steve的原因。 也许有人会发现root用户却仍可以使用该用命修改密码,那是因为root用户本身的EUID时就是root (也有可能只要发现是RUID是root就不检查EUID了,直接可读写,root就是老大嘛), 可以读取密码文件。 另外也许有人会发现普通的文件文件普通的文本文件会也可以设置SUID位, 但这是没有意义的,因为文本文件没有地方执行seteuid()的系统调用来改变当用用户的EUID。 最后,这里的对用户ID的规则同样也适用了组ID。
Linux内核学习笔记: uid之ruid,euid,suid
转载请注明出处:服务器评测 » Linux内核学习笔记: uid之ruid,euid,suid
相关推荐
- 🔴 [英国|德国|保加利亚|马里兰|土耳其|美国] CINFU – 裸机专用服务器 Intel、AMD 每月 32 欧元起 🔴
- *IOFLOOD.com █ 网络星期一 █ 30% 折扣即将结束
- 爱沙尼亚和荷兰 10Gbps 专用服务器优惠 – 快来抢购,以免售罄
- *双 Xeon 512GB RAM | 1/2.5/10Gbps 端口,首月优惠 30% | SSD、NVME!
- 🔴 [英国|德国|保加利亚|马里兰|美国] CINFU – 裸机专用服务器 Intel、AMD 每月 29 欧元起 🔴
- 限时促销 – 双 Xeon 最低 49 美元 新加坡无限流量服务器 – RACKH
- *PLiKhost:廉价且可靠的印度尼西亚 (IIX) 专用服务器 – 雅加达
- *廉价专用服务器★起价 28 美元/月★12TB 磁盘促销★IPMI★双倍 RAM 和 XFER!