linux uid 内核,Linux内核学习笔记: uid之ruid,euid,suid

s的本质是让某个用户在执行s权限的程序时,拥有该程序文件的属主或者属组一样的访问权限。属主或者属组取决于s的位置

一. Linux 文件权限的表示方法

文件权限用 12 个二进制位表示,如果该位的值是 1,表示有相应的权限:

11 10 9 8 7 6 5 4 3 2 1 0

S G T r w x r w x r w x

第 11 位为 SUID 位,第 10 位为 SGID 位,第 9 位为 sticky 位,第 8-0 位对应于上面的三组 rwx 位。

上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1

-rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0

给文件加 SUID 和 SUID 的命令如下:

chmod u+s filename 设置SUID位

chmod u-s filename 去掉SUID设置

chmod g+s filename 设置SGID位

chmod g-s filename 去掉SGID设置

另外一种方法是 chmod 命令用八进制表示方法的设置。如果明白了前面的 12 位权限表示法也很简单。

普通数字方法:

SUID是4   SGID是2    SBIT是1

chmod 4755 filename

第一个7代表的就是这三个特殊命令,后面的755是普通权限。上面的命令把filename这个文件加入了SUID权限。

查看特殊权限的方法就是普通的ls命令:

SUID会在所属用户权限本应是x的地方显示s

SGID会在所属用户组权限本应是x的地方显示s

SBIT在其它用户权限本应是x的地方显示t

如果希望查找系统中所有具有特殊权限的文件,则:

find / -perm +7000

假如你有文件a.txt

#ls -l a.txt

-rwxrwxrwx

#chmod 4777 a.txt

-rwsrwxrwx ======>注意s位置

#chmod 2777 a.txt

-rwxrwsrwx ======>注意s位置

#chmod 7777 a.txt

-rwsrwxswt ======>出现了t,t的作用在内存中尽量保存a.txt,节省系统再加载的时间.

目录的S(大写)属性使得在该目录下创建的任何文件及子目录属于该目录所拥有的组,目录的T属性使得该目录的所有者及root才能删除该目录。还有对于s与S,设置SUID/SGID需要有运行权限(x),如果一个文件的属主在chmod u+s file时没有x可执行权限,用ls -l后就会看到S,证明你所设置的SUID/SGID没有起作用。

假设要将一个文件权限修改为“-rwsr-xr-x”,由于s在用户权限中,所以是SUID,因此,原先的755前面还要加上4,也就是4755,所以,用命令chmod 4755 filename 设置就可以了。此外,还可能出现S和T的情况。我们知道,s和t是替代x这个权限的,但是,如果它本身没有x这个权限,修改为s或t时就会变成大S或大T,例如:执行chmod 7666 filename。 因为666表示“-rw-rw-rw”,均没有x权限,所以最后变成“-rwSrwSrwT”。

二. SUID 和 SGID 的详细解析

由于 SUID 和 SGID 是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的 SUID 和 SGID 位是没有多大意义的。

首先讲普通文件的 SUID 和 SGID 的作用。

如果普通文件 file 是属于 foo 用户的,是可执行的,现在没设 SUID 位,ls 命令显示如下:

-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 file

任何用户都可以执行这个程序。UNIX 的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括 user id 和 group id。用户可以用 id 命令来查到自己的或其他用户的 user id 和 group id。

除了一般的 user id 和 group id 外,还有两个称之为 effective 的 id,就是有效 id,上面的四个 id 表示为:uid,gid,euid,egid。内核主要是根据 euid 和 egid 来确定进程对资源的访问权限。一个进程如果没有 SUID 或 SGID 位,则 euid=uid egid=gid,分别是运行这个程序的用户的 uid 和 gid。例如 kevin 用户的 uid 和 gid 分别为 204 和 202,foo 用户的 uid 和 gid 分别为 200 和 201,kevin 运行 myfile 程序形成的进程的 euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是 kevin 用户对资源访问的权限,和 foo 没关系。

如果一个程序设置了 SUID,则 euid 和 egid 变成被运行的程序的所有者的 uid 和 gid,例如 kevin 用户运行 myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主 foo 的资源访问权限。

SUID 的作用就是这样:

让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源

。passwd 就是一个很鲜明的例子。

SUID 的优先级比 SGID 高,当一个可执行程序设置了 SUID,则 SGID 会自动变成相应的 egid。

下面讨论一个例子:

UNIX 系统有一个 /dev/kmem 的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为:

cr--r----- 1 root system 2, 1 May 25 1998 kmem

但 ps 等程序要读这个文件,而 ps 的权限设置如下:

-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps

这是一个设置了 SGID 的程序,而 ps 的用户是 bin,不是 root,所以不能设置 SUID 来访问 kmem,但大家注意了,bin 和 root 都属于 system 组,而且 ps 设置了 SGID,一般用户执行 ps,就会获得 system 组用户的权限,而文件 kmem 的同组用户的权限是可读,所以一般用户执行 ps 就没问题了。但有些人说,为什么不把 ps 程序设置为 root 用户的程序,然后设置 SUID 位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为 SGID 的风险比 SUID 小得多,所以出于系统安全的考虑,应该尽量用 SGID 代替 SUID 的程序,如果可能的话。下面来说明一下 SGID 对目录的影响。SUID 对目录没有影响。如果一个目录设置了 SGID 位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。

===================================================================================================================================

看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。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值