概述
从接触linux第一天开始,Linux一切皆文件的哲学思想就深植于每个linuxer的心中,因此,实现Linux的系统安全必然绕不开文件权限。文件的权限是建立在用户的基础上的,脱离了用户,文件权限也就变得毫无意义了。用户、组和文件权限一起铸就了linux的系统安全模型。本文主要从文件权限方面了解Linux的安全模型。
文中主要讲解了:
1. 文件权限rwx权限对于Linux文件和目录的意义
2. 三个特殊权限的应用场景和作用。
本文是基于Linux文件系统的 CentOS 7.2 进行理解和示例演示。Windows下的FAT和NTFS未必适用。
用户和组
首先,让我们简单地回顾一些基本的用户和组的信息。
用户
在Linux中,根据系统管理的需要,将用户账号分为管理员和普通用户,他们拥有不同的权限、担任不同的角色。系统用一个数字形式对用户进行标识,我们称之为UID,系统仅仅是通过UID进行识别和区分用户。用户名是用以方便人类识别的。(root未必是管理员,UID=0的用户就一定是管理员)
管理员
我们一般称管理员用户为root。在Linux中,UID=0的root用户权限是至高无上的,它可以控制所有的程序,访问所有的文件,使用系统上所有的功能。
普通用户
除了管理员,我们把UID不等于0的其他用户都称之为普通用户。普通用户账号需要管理员进行创建,拥有有限的权限,一般只在用户自己的家目录中有完全权限。
根据使用方式,再将普通用户划分为系统用户和登录用户。系统用户对守护进程获取资源进行权限分配。这些用户一般不允许登录到系统,仅用于维持系统或某个程序的正常运行。登录用户则可以进行交互式登录系统。
组
为了方便管理多个用户,我们引进了组的概念。基于某种特定联系的多个用户集合在一起,即构成一个用户组,用于表示该组内所有用户的账号称为组账号。系统同样基于数字形式,对组账号进行标识和区分,我们称之为GID。
每一个用户账号至少属于一个组,这个组称为该用户的基本组(如果用户UID和基本组GID相同,我们称为该用户的私有组);如果该用户同时还包括在其他的组中,则这些组称为该用户的附加组(或公共组)。
我们可以通过命令id查看用户和组的信息
文件基本权限
查看文件权限
Linux文件是有归属的,每个正常的文件的按归属分为所有者(属主)、所有组(属组)和其他用户,我们可以对各归属设置相应权限。我们可以通过 ls –dl FILENAME 查看这些信息。
解读ls -dl信息
文件类型
第一段1位代码表示文件类型,代码列表:
代码 | 文件类型 |
– | 普通文件 |
d | 目录文件(directory) |
b | 块设备(block) |
c | 支付设备(character) |
l | 符号链接文件(link) |
p | 管道文件(pipe) |
s | 套接字文件(socket) |
文件权限
第二段9位代码,每3个位为一组,分3组,表示文件对应的拥有者(属主)、所属用户组(属组)和其他用户3组权限。
每组由r w x 顺序排列表示,当拥有相应权限时候,就取对应字母表示有权限;以“-”(减号)表示无权限。字母代表的意义为:r 读(read)、w 写(write)、x 执行(execute)。
对于每组每一位权限而言,仅存在有和没有,因此我们可以引进3组3位二进制表示,每组数字是范围是000-111,转换为人类易读表示为0-7。
符号 二进制 八进制 — 000 0 –r 001 1 -w- 010 2 -wr 011 3 r– 100 4 r-x 101 5 rw- 110 6 rwx 111 7
扩展功能
第三段1位字符,是新添加的一项增强功能,所以一些发行版现在可能仅显示前 10 个字符。在其他情况下,第 11 个字符是一个空格,所以您可能不会注意到它。这个字符指定一种替代性的访问方法是否适用于该文件。当文件模式位后面的字符是一个空格时,没有替代性访问方法。当它是一个印刷字符时,则存在这样一种方法。举例而言,该方法可能是一个访问控制列表。GNU
ls
使用了一个 “.”(句点)字符来表示一个仅具有 SELinux 安全性上下文的文件。具有其他任何替代访问(FACL)方法组合的文件使用 “+”(加号)字符来标记。
第五、六段显示的是文件的归属:所有者和所属组。
演示文件权限
了解了上面的概念,我接下来我们通过演示,加以理解三种权限对文件和目录意义:
文件
首先我们准备演示文件/tmp/cat,演示用户user1。/tmp/cat文件的属主和属组都是root,所以user1对应该文件的权限归属是其他用户。
无权限时:user1用户可以查看文件的元数据;无法对文件进行读、写、执行操作,即读写使用user data。
分别赋予rwx权限时:
由此,我们可以知道,文件的rwx对于文件的意义是:对文件的data block内容进行查看,编辑和执行操作。(执行是相对Linux的二进制和脚本等文件而言,普通文件执行无意义。)
目录
根据Linux文件系统结构我们可以知道,目录的data block数据,是记录该目录下的子目录和文件的列表,因此对data block的操作我们可以理解为查看目录的子目录和文件列表、增删子目录或文件、切换进入目录。
同样的,我们创建目录/tmp/dir/,属主和属组依然是root,user1用户匹配的仍然是其他用户权限。演示:
无权限时:user1用户可以查看目录的元数据;无法对目录进行读、写、执行操作。
赋权:x
可以进入目录。
赋权:w
仅赋权w,无法删除/tmp/dir/file,无法添加文件;
赋权wx时候,可以删除和添加文件
赋权:r
仅赋权r,有限地查看目录内文件,信息不完整。
赋权r-x,可以实现完整的查看目录内文件。
小结文件三种权限rwx对文件和目录的不同意义:
代码 | 权限描述 | 对文件的意义 | 对目录的意义 |
r | read | 可以查看文件内容 | 可以列出目录下的子目录和文件(需要与x权限) |
w | write | 可以修改文件内容 | 可以在目录中创建、删除子目录和文件(需与x权限配合) |
x | execute | 可以执行文件 | 可以进入目录 |
文件特殊权限
在Linux中,普通用户可以对自己的账户进行密码修改,修改后的密码是存储在/etc/shadow的,这就意味着普通用户对/etc/shadow文件具有写权限。如果赋予普通用户对/etc/shadow文件写权限,即表示普通用户可以删改文件下其他用户的账户密码信息,这带来的后果是灾难性的。
而事实上,/etc/shadow文件的的权限是000,系统中仅有管理员是可以对000的文件进行编辑。我们也仅仅是通过passwd命令时,才能进行密码的修改。这表示当普通用户使用passwd命令时,它披上了管理员的小马甲,暂时获取了root的权限,对/etc/shadow文件进行编辑操作。 这就引进了Linux权限模型的3个特殊权限:SUID、SGID和 Sticky。
SUID
我们演示的是cat命令,测试用户user1和 user2,其中文件cat和user1.file文件权限,环境如下图:
user2是无法执行cat,也不具备查看user1.file文件的
当我们给user2赋权x时,我们看到原来user2无法查看的user1.file文件,已经能够查看了。
小结SUID:
-
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限(用户自身要对SUID的命令具有可执行权限)
-
启动为进程之后,其进程的属主为原程序文件的属主(即SUID让用户披上了命令原属主的马甲,赋予了原属主的权限。)
-
给目录SUID是无意义的。
SGID
我们给目录予SGID,当用户本身无权限的时候,SGID是无效的,用户自身需要对目录有相应的权限。
当目录拥有SGID时,在里面新建的文件,属组将会是目录的原属组。
小结SGID:
-
默认情况下,用户创建文件时,其属组为此用户所属的 主
-
一旦某目录被设定了SGID ,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
-
通常用于创建一个协作目录
Sticky Bit
这个就是针对others来设置的了,和上面两个一样,只是功能不同而已。
SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。
最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。
小结Sticky
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权
在目录设置Sticky 位,只有文件的所有者或root可 可以删除该文件
sticky 对文件无意义
结束语
用户言论只代表其个人观点,由于初学Linux,限于本人水平有限,文中难免错误纰漏。欢迎各位看官不吝指教、讨论相关技术。谢谢。
联系我:jacky18676887374@aliyun.com
原创文章,作者:昭其,如若转载,请注明出处:http://www.178linux.com/29146
评论列表(1条)
文章的层次结构清晰明了,内容丰满,有理论有实践。
图片清晰,指示明确,结合文字引导,可谓图文并茂。
文件事情整体介绍的清楚明白,但如果在思路引导上加以优化是一篇上等佳作