`
ChadLiu
  • 浏览: 7531 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

关于Linux文件访问权限与设置用户id位

阅读更多

      最近在学习《Unix 高级环境编程》这边书,之前对Unix中的文件访问还有和文件访问相关的设置用户id(set_user_ID)位以及设置组id(set-group-ID)位一直没有弄清楚,今天跟他人讨论一个问题,终于有些明白了,记录以供温故。

       首先说说文件的权限控制位,每一个文件都有文件模式字st_mode,ls -l一个文件前面10位就是文件的类型和权限说明了。具体可分为用户读写可执行,组读写执行,其他读写执行位。当一个进程要访问某个文件的时候,会以进程的有效用户ID来进行权限检测,看改用户ID具体属于文件的哪个部分,是文件用户本身,还是属于用户组还是属于其他用户的。与每个进程相关联的用户ID和组ID包括实际用户(实际上是谁),ID实际组ID;有效用户ID(用于文件访问权限检查),有效组ID,附加组ID(有时候一个用户可能属于多个组);保存的设置用户ID(由exec函数保存),保存的设置组ID。所有者ID是文件的性质,而有效ID和附加组ID是进程的性质。一般内核进行的检测是:

        (1)若进程的有效用户ID是0(超级用户),则允许访问。

        (2)若进程的有效用户ID等于文件的所有者ID(即进程拥有此文件),那么当所有者适当的访问权限位被设置,则允许访问,否则拒绝访问。适当的访问权限位指的是,若进程为读而打开该文件,则用户读位应为1,若进程为写而打开该文件,则用户的写位应为1。。。

        (3)若进程的有效用户ID或进程的附加组ID之一等于文件的组ID,那么:若组的适当的访问权限位被设置,则允许访问,否则拒绝访问。

        (4)若其他用户适当的访问权限位被设置,则允许访问,否则拒绝访问。

        按顺序执行这四步,若进程拥有此文件(第2步),则按用户访问权限批准或拒绝该进程对文件的访问,不查看组访问权限。类似地,若进程并不拥有该文件,但进程属于某一个适当的组,则按组访问权限批准或者拒绝该进程对文件的访问,不查看其他用户的访问权限。当进程既不拥有该文件,进程也不属于某个组,就只能查看其他用户的访问权限了。

        当执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID通常就是实际组ID。但是当文件设置了用户ID位后,当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID(st_uid),设置组ID类似。下面将以一个例子来具体说明,其中access函数是按照实际用户ID和实际组ID进行访问权限测试的,open函数打开一个文件事,内核以进城的有效用户ID和有效组ID为基础进行权限测试。

access函数实例:

#include "apue.h"
#include <fcntl.h>

int main(int argc, char *argv[])
{
	if (argc != 2)
		err_quit("usage: a.out <pathname>");
	if (access(argv[1], R_OK) < 0)
		err_ret("access error for %s", argv[1]);
	else
		printf("read access OK\n");
	if (open(argv[1], O_RDONLY) < 0)
		err_ret("open error for %s", argv[1]);
	else
		printf("open for reading OK\n");
	exit(0);
}

 编译生成可执行文件a.out并执行:

chardliu@ubuntu:~/apue.2e/file$ cc access.c

chardliu@ubuntu:~/apue.2e/file$ ls -l a.out
-rwxrwxr-x 1 chardliu chardliu 7839 Jun 26 21:01 a.out
chardliu@ubuntu:~/apue.2e/file$ ./a.out a.out
read access OK
open for reading OK

root@ubuntu:/home/chardliu/apue.2e/file# ll /etc/shadow
-r-------- 1 root shadow 1235 Apr 11 18:50 /etc/shadow

chardliu@ubuntu:~/apue.2e/file$ ./a.out /etc/shadow
access error for /etc/shadow: Permission denied
open error for /etc/shadow: Permission denied

此时之所以access和open都出错,是因为进程的实际用户ID和有效用户ID都为chardliu,而shadow文件的用户所有者是root,所以当进程以chardliu身份来对shadow文件进行访问权限检测时,是根据shadow的其他用户读写执行位来检测的,由上可知,shadow文件只有所有者root本身可读,没有其他任何权限。

按理,那么当给shadow文件增加其他用户读权限后access和open都应该成功,测试一下果真如此:

chardliu@ubuntu:~/apue.2e/file$ su  //以root用户对shadow文件进行权限设置
Password:
root@ubuntu:/home/chardliu/apue.2e/file# chmod o+r /etc/shadow        //给shadow增加其他用户可读权限
root@ubuntu:/home/chardliu/apue.2e/file# exit
exit
chardliu@ubuntu:~/apue.2e/file$ ll /etc/shadow
-r-----r-- 1 root shadow 1235 Apr 11 18:50 /etc/shadow
chardliu@ubuntu:~/apue.2e/file$ ./a.out /etc/shadow         //再次访问shadow文件,OK
read access OK
open for reading OK

 

下面说明一下设置用户ID的作用。

在此之前还是将shadow的文件访问控制位置为原来的,即清除其他用户可读权限,同时将a.out可执行文件的所有者改为root,并且设置其用户ID位:

chardliu@ubuntu:~/apue.2e/file$ su
Password:
root@ubuntu:/home/chardliu/apue.2e/file# chmod o-r /etc/shadow
root@ubuntu:/home/chardliu/apue.2e/file# ll /etc/shadow
-r-------- 1 root shadow 1235 Apr 11 18:50 /etc/shadow

root@ubuntu:/home/chardliu/apue.2e/file# chown root a.out
root@ubuntu:/home/chardliu/apue.2e/file# chmod u+s a.out
root@ubuntu:/home/chardliu/apue.2e/file# ll a.out
-rwsrwxr-x 1 root chardliu 7839 Jun 26 21:01 a.out*

退出超级用户,以正常用户运行:

root@ubuntu:/home/chardliu/apue.2e/file# exit
exit
chardliu@ubuntu:~/apue.2e/file$ ./a.out /etc/shadow
access error for /etc/shadow: Permission denied
open for reading OK
会发现运行结果access失败,而打开文件成功。access是以实际用户IDchardliu对shadow进行访问权限检测的,发现其他用户读没有设置权限,所以失败;a.out设置了用户ID,所以当进程执行a.out时,进程的有效用户ID由chardliu设置为了a.out所有者的用户ID root了,所以可以成功打开文件,open是以进程的有效用户ID进行访问权限检测的。

通过这个过程,相信会对文件的访问权限控制有一个比较清晰的理解。

参考资料:W.Richard Stevens, Stephen A.Rago《UNIX环境高级编程》

 

 

 

 

 

 

 

1
0
分享到:
评论

相关推荐

    Linux文件目录的权限和属性实践讲解

    通过对Linux文件目录权限和属性的学习与实践,我们不仅可以更好地管理系统的安全性和稳定性,还能根据不同的应用场景灵活调整文件的访问控制策略。希望本文能够帮助大家更加深入地理解和掌握这些重要的基础知识。

    Linux系统的文件模式和访问权限介绍

    此外,Linux文件系统还包括三个特殊的标志位:suid(Set-User-ID)、sgid(Set-Group-ID)和sticky位。suid允许一个可执行文件在执行时临时具有文件所有者的用户ID,这通常用于提高权限,例如在运行需要管理员权限的...

    Linux命令:改变文件或目录的访问权限

    Linux 命令:改变文件或目录的访问权限 在 Linux 系统中,每个文件和目录都有访问许可权限,用...Linux 系统提供了多种命令来管理文件或目录的访问权限,用户可以根据需要选择适合的命令来控制文件或目录的访问权限。

    linux文件权限设置.docx

    文件权限决定了用户对文件的访问权限,包括读、写、执行等权限。在 Linux 中,每个文件都有其所属的用户和组,并且每个用户和组都有其对应的权限。 基本权限 -------- 在 Linux 中,文件权限有三种基本权限:读(r...

    linux系统权限管理文件特殊权限PPT学习教案.pptx

    Linux 系统权限管理文件特殊权限是 Linux 操作系统中的一种重要机制,用于控制用户对文件和目录的访问权限。本学习教案将详细介绍 Linux 系统权限管理文件特殊权限的概念、类型、作用和使用方法。 ACL 权限 ACL...

    Linux文件权限的设置方法.doc

    理解并熟练运用Linux文件权限是系统管理员和开发者的基本技能,它对于保护系统安全、控制用户间的资源访问至关重要。正确设置权限可以确保数据的安全性,避免未经授权的访问和操作,同时允许协作和资源共享。通过...

    Linux文件特殊权限SGID-UID详解

    尽管 `/etc/shadow` 文件是 root 专有的并且不允许其他用户直接访问,但是通过 SUID 权限,任何用户都可以通过 `passwd` 命令更改自己的密码。 **3. 使用限制** - **二进制文件限制**:SUID 只能应用于二进制文件...

    07_文件访问权限

    在Linux/Unix系统中,还有第四种权限,即"Setuid"(设置用户ID),它允许一个进程以文件所有者的身份运行,即使该进程的用户不同。 在Linux/Unix中,文件权限用九位数字表示,称为“chmod”模式。这九位数字分为三...

    11-RHEL7-Linux文件权限管理

    用户可以通过这套系统为不同的用户和用户组设定对文件或目录的访问权限。 在Linux中,文件权限分为三类:所有者(owner)、用户组(group)和其他用户(others)。每个文件或目录都有一个所有者,可以是文件系统中...

    Linux改变文件或目录的访问权限命令

    在Linux操作系统中,管理文件和目录的访问权限是系统管理员和普通用户日常操作的重要部分。权限控制确保了数据的安全性和隐私性。本文将详细讲解如何使用Linux命令来改变文件或目录的访问权限。 首先,我们需要了解...

    Linux文件权限的设置方法.docx

    本篇将详细介绍Linux文件权限的设置方法。 首先,Linux中的文件类型主要有五种:普通文件、目录文件、链接文件、设备文件和管道文件。普通文件通常包含文本或二进制数据;目录文件是用于组织文件系统的结构;链接...

    linux有效用户和实际用户的区别以及权限中的S借鉴.pdf

    UNIX 内核是根据进程的有效 ID,包括用户 ID 和组 ID,来确定对资源的访问权限的。用户可以使用 id 命令来查看自己的或其他用户的用户 ID 和组 ID。 在 Linux 中,SUID 和 SGID 权限位的设置需要小心,因为它们可以...

    linux用户权限管理

    组是具有相同权限的用户的集合,简化了权限管理和文件访问控制。用户与组的关系可以是一对一、一对多、多对一或多对多。 2. **用户配置文件**: - **/etc/passwd文件**:这是Linux用户管理的核心文件,包含所有...

    linux-文件权限

    一组用户共享对文件或目录的访问权限。组成员可以被赋予读、写或执行权限,但通常不如所有者的权限全面。 #### 其他用户(other) 除了所有者和所属组之外的所有其他用户。他们通常只能获得有限的权限,如只读或无...

    浅谈LINUX文件系统的特殊权限设置与应用.pdf

    综上所述,Linux文件系统的特殊权限机制是其安全特性的重要组成部分,有效地平衡了用户间的资源共享与数据保护。通过合理设置这些权限,系统管理员可以创建安全、有序的多用户环境,满足不同用户的需求,同时也降低...

    linux中特殊权限问题

    1. SUID(Set-User-ID):如果一个文件设置了SUID位,那么当普通用户执行这个文件时,程序会临时获得文件所有者的权限。这常用于如passwd命令,使得普通用户能修改自己的密码,但不能修改其他人的。 2. SGID(Set-...

    Linux用户及权限管理.pdf

    权限管理在Linux中通过rwx(读、写、执行)三位二进制表示,分别对应文件所有者、同组用户和其他用户的权限。此外,还有`chmod`命令用于改变文件或目录的权限,`chown`和`chgrp`命令用来改变文件的所有者和组。 ...

    linux系统权限总结

    ### Linux文件权限基础 Linux中的文件权限通常由读(r)、写(w)与执行(x)三个基本部分组成。这三种权限分别对应于文件的操作权限:读取、修改与执行。具体而言,当一个文件拥有读权限时,用户可以查看该文件的...

    Linux系统中文件权限说明

    这些数字和字符组合代表了文件所有者、同组用户以及其他用户的访问权限。其中,数字777、644等是基于二进制计算得出的结果,而字符组合则更直观地反映了权限状态。 - **r**:读取权限,允许用户读取文件内容。 - **...

Global site tag (gtag.js) - Google Analytics