`
ChadLiu
  • 浏览: 6984 次
  • 性别: 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系统每个文件都有三种类型用户ID:文件拥有者ID、同组用户ID、所有剩下用户ID。并且每种类型用户都有三种类型的访问权限:读、写、执行。文中还介了进程的分类及进程读/写/执行文件的过程。

    Linux FTP服务配置

    最终权限等于配置文件中的权限和linux文件系统权限相或的结果。比如vsftp配置文件中允许匿名用户下载,但光这样是不够的,还需要被下载的文件或文件夹的能够被其他用户读取。 尝试上传文件失败,符合匿名用户只允许...

    linux用户创建

    不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。 用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的...

    LINUX FTP设置方法

    说明:默认配置文件就已经能够实现匿名用户对/var/ftp文件内容的下载,以及本机用户对自已主目录的访问(上传与下载)。 20.3 vsftp配置基本实例 20.3.1 改变端口号 vi vsftpd.conf #新增底下一行,原有的配置不动 ...

    Android 访问文件权限的四种模式介绍

    Linux文件的访问权限 * 在Android中,每一个应用是一个独立的用户 * drwxrwxrwx * 第1位:d表示文件夹,-表示文件 * 第2-4位:rwx,表示这个文件的拥有者(创建这个文件的应用)用户对该文件的权限 * r:读 * w:写...

    LINUX系统管理白皮书

    17.2 限制NNTP访问权限 169 17.3 NNTP身份验证 170 17.4 nntpd与C-News的沟通 171 第18章 新闻阅读机的配置 172 18.1 tin配置 172 18.2 trn配置 173 18.3 nn配置 174 第19章 其他问题 176 19.1 PLIP的空...

    RED HAT LINUX 6大全

    本书全面系统地介绍了Red Hat Linux 6。全书共分为五个部分,包括35章和四个附录。第一部分为Red Hat Linux的介绍和安装;第二部分为服务配置;第三部分为系统管理;第四部分为Linux编程;第五部分为附录。本书内容...

    cmd操作命令和linux命令大全收集

    dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间 date /t 、 time /t 使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,...

    linux学习记录

    为abc文件设置权限 -rwxrw-r-- -表示文件 后面三个一组,分为三组 rwx表示当前文件的所有者(读,写,执行权限)rw- 表示跟所有者同一组的其他人(读,写权限)r-- 表示其他人(读权限) lrwxr--r-- l 表示链接 ...

    Linux命令笔记

    4:umask 显示或设置文件缺省权限 语法:umask[-S] 权限管理/文件特殊权限 1:SetUID 可执行的二进制文件(u:w=s 4) 2:SetGID 可执行的二进制文件或目录(g:r=s 2) 3:Sticky BIT 只对目录有效(o:x=t 1) 权限管理/...

    入门学习Linux常用必会60个命令实例详解doc/txt

    这是因为Linux和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...

    Linux指令一周通 (技术图书大系).azw3

    7.14 xhost指令:设置X服务器的访问权限 7.15 xinit指令:启动x-Windows 7.16 xlsclients 指令:显示正在运行的 X程序 7.17 xlsfonts指令:显示目前X服务器可使用的字体 7.18 xset指令:设置x-Windows

    Linux操作系统基础教程

    Linux 是在 1991 年发展起来的与 UNIX兼容的操作系统,可以免费使用,它的源代码 可以自由传播且可任人修改、充实、发展,开发者的初衷是要共同创造一个完美、理想并 可以免费使用的操作系统。 我们并不能使同学...

    redhat linux教材20课程学习文档

    第一部分 Linux简介和原理介绍 第一章 概述 1.1 Linux 的历史及背景 1.1.1 什么是 Linux? 1.1.2 Linux 该怎么念? 1.1.3 Linux 的历史 1.1.4 Linux的优点 1.2 Linux与开源软件 1.3 Linux 与 Windows 的比较 1.3.1 ...

    IIS6.0 IIS,互联网信息服务

    为了安全,要对对每个目录按不同的用户设置不同的访问权限,然后关闭一些不需要的服务,这样可以对不良人士利用IIS溢出漏洞访问到系统盘作个第一级防护。 3.iis安全设置之端口设置。IIS有默认的端口设置,只要稍有...

    Linux基础(练习三)

    现有文件应针对用户和组设置为rw。(提示:切勿使用setfacl) 使用chgrp,以递归方式更新目录及其内容上的组所有权 使用chmod更新目录上的setgid标志 并将所有现有文件的权限针对其所有者和组更新为rw 使用setfacl...

Global site tag (gtag.js) - Google Analytics