您的位置:首页 > 运维架构 > Linux

Linux基础:文件属性和权限

2015-03-13 17:30 381 查看
大纲
1、前言
文档版本更新时间
备注
v1
2016-03-05

一、多用户多任务分时操作系统

分时系统的概念:将CPU时间资源适当分配在每个使用者身上,让所有使用者都有独占整部机器的错觉。但是如果把“使用者”进行抽象,可以将任务也理解为计算机CPU时间资源的使用者。分时就是多用户和多任务的基础和前提,对于一个分时系统,支持多任务是其与生俱来的本质, 但是如果要支持多用户,则还需要很多附加的条件,最大的问题就是用户的身份问题。 对于多用户操作系统,提供单用户模式是非常必要的。这个主要是在系统发生故障时,进行故障修复时使用的。所谓单用户模式,就是操作系统不进行用户身份确认,可以直接让用户进行各种操作。

二、用户与用户组

Linux是一个多用户、多任务的操作系统,为了让各个用户具有较保密的文件数据,因此用户的权限管理就比较重要了。Linux一般将档案可存取的身份分为三个类别,分别是 owner/group/others,这三种身份各有 read / write / execute 等权限。
Linux的文件所有权和访问授权是与用户id和组密切相关的。Linux 一般将文件可存取访问的身份分为3个类别,分别是owner, group, others,且3中身份各有 read, write, execute等权限。当用户登录系统时,就会进行身份验证。成功登录系统后的用户,都携带用户身份(User ID, UID)以及组身份(Group ID, GID),当需要访问文件或者执行程序时,需要检查用户是否拥有访问的权限。
正确登录后,我们就会拥有一个自己的文件目录,这个目录一般是 /home/[username],后面的[username]与你的用户名相同。这就是你的home目录,你的专属区域(私人空间,自由),但是如果离开了自己的home目录,就进入了公共区域(公共空间,受限制),这个区域一般都是只读的,只有很少位置可以能够写入数据。
一般来说,Linux的用户信息保存在/etc/passwd中,组信息保存在/etc/group中,文件的每一行代表一个用户/组。早期的Linux将密码以明文的形式保存在 /etc/passwd 中,而现在则多以暗码(也就是加密之后的形式)的形式保存在 /etc/shadow 中。将密码存储在 /etc/shadow 中提高了密码的安全性,因为/etc/passwd允许所有人查看,而 /etc/shadow 只允许root用户查看。
Linux系统中还有一些用户是用来完成特定任务的,比如: nobody, admin, ftp等。需要注意,在Linux中不管用户名有多么NB,只要不是root,它就一定是普通用户,权利大小都是相同的。还有一些这样的用户或组根本就不是拿来用的,完全是用来占坑的,主要目的是为了兼容。

使用 id 命令,您可以找出用户和组信息。类似的,您可以使用 groups 命令找出您在什么组中。
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@localhost ~]# groups
root
[root@localhost ~]#


三、Linux文件属性

文件的属性和权限与用户身份是密切相关的,共同完成了Linux系统的多用户权限控制。如果要是细究Linux多用户权限控制的本质,实际上就是让不同的用户能够访问的文件不同罢了。由于root可以访问任何文件,所以就拥有了至高无上的权利。那么凭什么规定一个用户能访问哪些文件,而又不能访问哪些文件呢? 答案是文件自己说了算
既然是文件自己说了算,那么我们就看看文件时怎么做到的。在Linux系统中,每个文件都会有一个特定的拥有者(一般是创建它的用户)和所属用户组,这是属于它的固有属性。文件可以利用这两个固有属性来规定它的拥有者或者其所属用户组内的用户是否拥有对它的访问权利,即读、写和执行的权利。此外,为了提高适应性,文件还规定了其他不相关人等,也就是第三个固有属性,对它的读、写和执行的权利。这三个固有属性和三个权利合起来,就构成了文件的针对系统中所有用户的访问控制。
要了解Linux权限控制,就必须学习Linux的文件权限和属性。Linux 权限模型每个文件系统对象有 3 种类型。这些权限就是读(r),写(w)和执行(x)。写权限包括修改和删除对象的能力。此外,这些权限被分别指定给文件所有者、文件组成员和其他人。
可以使用 # ls -l 命令查看文件的权限:








我们来解释一下上面7列的意思。

3.1 第一列代表这个文件的类型(type)和权限(permission)
它由十个字符组成,第一个字母描述了对象的类型(- 在这个例子中表示普通文件),剩下的 9 个字母每三个字母为一组,分别对应属主(owner),属组(group)和其他人(other)的权限。第一组表示文件所有者的读、写和执行权限。- 表示相应的权限没有被授予。

3.1.1 第一个字符表示文件的类型

[d] 目录(directory)

[-] 文件(file, f)

[l] 符号链接文件(Symbolic links file)

块设备文件(block)

[c] 字符设备文件(character)

[p] 命名管道(pipe)

[s] 套接字(socket)

[b]3.1.2 接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。

其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。



Linux文件或目录的权限位是由 9 个权限位来控制,每三位为一组,它们分别是文件属主(Ower)的读、写、执行,用户组(Group)的读、写、执行以及(Other)其它用户的读、写、执行;
所有者: 读r、写w、执行x

所属组: 读r、写w、执行x

其它人: 读r、写w、执行x

如果权限位不可读、不可写、不可执行,是用 - 来表示。

3.2 第二列代表有多少文件名连接到此节点(i-node)。
Linux所使用的文件系统是一种基于inode的文件系统,它是所有类Unix操作系统中的一种数据结构,也是这类操作系统中文件系统的核心,每一个新创建的文件都会被分配一个inode,且每个文件都有一个唯一的inode编号。我们可以把 inode 理解为一个指针,它指向的是文件所在磁盘中的物理位置。
文件系统通常存在 i-node 块 以及 block 块。 每个文件都将它的权限和属性记录到文件系统的 inode 中,实际的数据则是保存在block块中。
为什么需要增加这个inode连接数引用计数呢? 原因就在于Linux允许一个文件拥有多个名字。也就是说,文件名只是相当于对inode的一次引用。

不过Linux使用的倒置目录树结构的组织中,文件名却是存放在目录文件中的,因此每个文件名就会连接到一个inode。这个属性记录的就是有多少不同的文件名连接到相同的一个inode号。因此会存在有多个文件名连接到一个 inode 的情况,这就是硬链接,而该列就是指的硬链接数。

3.3 第三列表示这个文件(或目录)的所有者(属主)。

3.4 第四列表示这个文件(或目录)的所属组。

3.5 第五列表示这个文件的大小,单位为字节(byte)。
其中链接文件(上面的 b.txt 文件)的大小正好是指向的目标文件名的字符数。

3.6 第六列表示文件的最近修改时间(mtime)。
其实文件属性中还包括创建时间和最近读取时间,只是并未显示出来。

3.7 第七列为该文件的文件名。

四、目录权限的意义

目录和常规文件一样使用相同的权限位进行标识,但是它们的翻译不同。目录的读权限允许用户使用该权限列出目录内容。写权限意味着用户使用该权限能够在目录中创建或者删除文件。执行权限允许用户输入目录并访问任意子目录。没有执行权限,目录下的文件系统对象就是不可访问的。没有读权限,目录下的文件系统对象在目录清单下就是不可见的,但是如果知道磁盘上对象的完整路径,这些对象仍是可访问的。 目录与普通文件的权限意义并不相同,这是因为目录与文件所记录的数据内容不相同导致。

当某个用户需要访问某个文件时,系统就读取这个文件的属性和权限信息与当前用户的UID和GID进行对比,来确定当前用户是文件的拥有者还是其所属用户组同组,亦或是毫无关系。然后根据这些比对结果和用户所执行的动作来判断是否满足权限要求。这样也就引出了文件权限和命令的一些关系,因为Linux系统的一个文件是否可执行时通过属性来决定的,而不是扩展名。

4.1 对于普通文件的权限
r (read): 允许读权限,比如可以使用cat <file name>之类的命令来读取某个文件的内容

w (write):允许写权限,表示你可以编辑和修改某个文件的内容

x (execute):允许执行权限,通常指可以运行的二进制程序文件或者脚本文件。Linux上不是通过文件后缀名来区分文件的类型。 在Linux中,文件能够被执行是由"x"这个权限来决定的,而跟文件的扩展名没有半毛钱关系。不过拥有可以执行的能力, 与能否执行成功,是两码子事儿。

4.2 对于目录文件的权限
但是对于目录的权限位则很容易混淆,这里要注意区分:
r (read contents in directory):读取目录里面的内容。可以使用 ls 命令将目录内容列举
所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件。

w (modify contents of directory):编辑目录里面的内容。拥有更改该目录结构列表的权限:
主要包括
1、创建新的文件与目录
2、删除目录下面的文件与目录(无论该文件的权限是什么,这一点很重要)
3、对目录里面的文件与目录重命名
4、移动目录里面的文件与目录的位置

x (access directory):代表的是用户能否进入该目录成为工作目录(cd 命令)。(相当重要的概念)

注意:目录要同时具有读权限和执行权限才可以打开,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息。

4.3 总结
要编辑文件内容,原则上必须对该文件拥有 rw 权限。 其实只有w权限也是可以编辑的,但是看不到文件内容,怎么编辑呢? 对吧。

要编辑目录内容,那么必须对该目录拥有 wx 权限。想一想为什么? 因为必须要切换到该目录下,我才能对里面的内容做更改。 执行逻辑: 第一步: 切换到目录下; 第二步:执行编辑目录操作。

五、修改文件属性和权限

我们已经知道文件权限对于一个系统的重要性了,但如何对文件的属性和权限进行修改呢?这里主要用到三个命令:chgrp, chown, chmod,分别对应修改用户组、拥有者和文件权限。

首先说明,要想操纵文件的属性和权限,你必须具备对文件的写权利,或者是root。
改变所属组: chgrp

改变所有者: chown

改变文件权限: chmod

## chgrp/chown/chmod [-R] dirname/filename
-R : 进行递归 recursive,如果想把目录以下的所有文件或子目录改变,应该加-R参数,递归更改;

## 改变属组
# chgrp users a.txt

## 改变属主
# chown users a.txt
# chown root:root a.txt
# chown :users a.txt
# chown -R root:root ./tmp    # 递归,其子目录下的所有文件都会更改

5.1 改变权限: chmod
chmod 是用来改变文件或目录权限的命令,但只有文件的属主和root用户才有这种权限。通过 chmod 来改变文件或目录的权限有两种方法,一种是通过八进制,另一种是通过符号方式。

第一种方式:符号方式改变文件权限(权限微调)





[root@localhost ~]# chmod --help
Usage: chmod [OPTION]... MODE[,MODE]... FILE...
or:  chmod [OPTION]... OCTAL-MODE FILE...
or:  chmod [OPTION]... --reference=RFILE FILE...
Change the mode of each FILE to MODE.
MODE可以分成如下3块: [who] operator [permission]

[ugoa]*([-+=]([rwxXst]*|[ugo]))+
who的含义是
u 属主权限
g 属组权限
o 其它用户权限
a 所有用户(all 表示所有,缺省就是all)
operator的含义
+ 增加权限
- 取消权限
= 设定权限
permission的含义
r 读权限
w 写权限
x 执行权限
X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
s 文件属主和组id
l 给文件加锁,使其它用户无法访问
示例:
[root@skype ~]# ls -l a.txt
-rw-r--r--. 1 root root 0 Mar 13 23:19 a.txt

## 减掉other的r权限
[root@skype ~]# chmod o-r a.txt        # o-r
[root@skype ~]# ls -l a.txt
-rw-r-----. 1 root root 0 Mar 13 23:19 a.txt
## 增加group的w权限
[root@skype ~]# chmod g+w a.txt        # g+w
[root@skype ~]# ls -l a.txt
-rw-rw----. 1 root root 0 Mar 13 23:19 a.txt

u,g,o,r,w,x的排列顺序都是任意的。
使用这种方式比较灵活,组合起来比较方便;比如;
u=r+x 为文件属主添加读写权限;
ug=rwx,o=r 为属主和属组添加读、写、执行权限,为其它用户设置读权限。
a+x 为文件的属主、属组和其它用户添加执行权限;
g=u 让文件的属组和属主和权限相同;
# chmod u=rwx,go=rx a.txt        # 注意: u=rwx,go=rx 之间没有任何空格
# chmod u=rwx,g=rx,o=rx a.txt
# chmod o=- a.txt
# chmod a+x a.sh
# chmod +x a.sh


方式二:八进制方式改变文件权限




r = 4,w = 2,x = 1,- = 0, 每种身份(owner, group, others)各自的三个权限(r, w, x)分数是需要累加的。这三个数字中的每一个都通过添加所需的权限设置来构建:读(4),写(2)和执行(1)。
owner = rwx = 4 + 2 + 1 = 7

group = r-x = 4 + 0 + 1 = 5

other = r-x = 4 + 0 + 1 = 5

示例:
[root@skype ~]# ls -l a.txt
-rw-r--r--. 1 root root 0 Mar 13 23:19 a.txt

# 如果需求把a.txt的权限改为 rwxr-xr-x ,怎么用八进制表示呢? 775
[root@skype ~]# ls -l a.txt
-rwxr-xr-x. 1 root root 0 Mar 13 23:19 a.txt


六、预设权限: umask

当我们创建一个文件或者目录时,它的默认权限是什么呢? 那就和umask有关了,umask就是指定【目前用户在建立文件或目录时的默认权限】。umask的作用是定义用户创建文件或目录的默认权限。umask表示的是禁止权限。
在默认权限属性上,目录和文件是不一样的:若用户创建“文件“,则默认没有可执行(x)权限,即只有r、w这两个选项,也就是最大为666,默认权限如下:-rw-rw-rw-

若用户新建“目录“,则由于x与是否可以进入此目录有关,因此默认为所有权限均开放,即为777,默认权限如下:drwxrwxrwx

怎么查看该用户缺省的umask:
[root@localhost ~]# umask
0022
[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx
umask的分数指的是“该默认值需要减掉的权限“;r、w、x分别是4、2、1分,假设umask为022新建文件时:(-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--)新建目录时:(drwxrwxrwx) - (-----w--w-) = (drw-r-xr-x)umask的配置文件为:/etc/profile 或 ~/.profile 或 ~/.bash_profile,可通过修改这些文件里的umask值,改变其默认的 umask。
[root@skype ~]# umask
0022
[root@skype ~]# touch a.txt
[root@skype ~]# mkdir a.dir
[root@skype ~]# ls -ld a.dir a.txt
drwxr-xr-x. 2 root root 4096 Mar 13 23:41 a.dir   # (rwxrwxrwx) - (----w--w-) = rwxr-xr-x
-rw-r--r--. 1 root root    0 Mar 13 23:40 a.txt   # (rw-rw-rw-) - (----w--w-) = rw-r--r--
计算权限的时候,最好使用【符号方式】,而尽量不要使用八进制方式。

七、suid & sgid

Linux 权限模型有两个特殊的访问模式,名为 suid(设置用户 id)和 sgid(设置组 id)。当可执行的程序设置为 suid 访问模式,它的运行模式就好像是由文件所有者启动而不是由真正启动它的用户启动。类似的,设置为 sgid 访问模式,程序就会运行,好像启动用户属于文件组,而不属于他所有的组。可以单独或者同时设置两个访问模式。

针对u,g,o分别有set uid,set gid及sticky。强制位与冒险位添加在执行权限的位置上。如果该位置原已有执行权限。suid 和 sgid 位与长目录清单中用户和组的x占据相同的空间。如果文件是可执行的,suid 或 sgid 位如果已设置,将会显示为小写的 s,否则就显示为大写的 S。Set uid与set gid 在u和g的x位置上各采用一个s。sticky使用一个t。设置方法与其他权限设置相同。
虽然 suid 和 sgid 很便利,甚至在很多环境下是必需的,但是这些访问模式不适当的使用会造成系统安全上的漏洞。您要尽量少地使用 suid 程序。passwd 命令是少数 必须 为 suid 的命令之一。

7.1 设置 suid 和 sgid suid 和 sgid 位使用字母 s 在符号上进行设置和重设;例如,u+s 设置 suid 访问模式,g-s 删除 sgid 模式。在八进制格式中,suid 在第一位(高阶)为值 4,而 sgid 是值 2。
# chmod u+s  aaa

# chmod 4755 aaa
7.2 SUID的目的SUID权限仅对二进制程序(binary program)有效,不能够用在shell script上面。
执行者对于该程序需要具有x的可执行权限
本权限仅在执行该程序的过程中(run-time)有效
执行者将暂时具有该程序所有者(owner)的权限
对目录无效
SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。在Linux/Unix下,可执行文件可以被setUid,这使得任意使用者在执行该文件时,都绑定了文件拥有者的权限。就好像文件带了一把尚方宝剑一样,默认情况下,用户执行一个指令,会以该用户的身份来运行进程。指令文件上的强制位,可以让用户执行的指令,以指令文件的拥有者或所属组的身份运行进程。注:这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放到目录上,放上也是无效的。setUid文件通常用来提升使用者的权限.最有代表性的su命令.普通用户可以可以执行该命令,使自己升级为root。

7.3 SET GID 强制位的作用 默认情况下,用户建立的文件属于用户所在的组。但是目录设置了setgid,表示在此目录中,任何人建立的文件,都会属于当前目录所属的组。如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同。

对于目录来说:用户若对于此目录具有r与x的权限时,该用户能够进入此目录

用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
若用户在此目录下具有w的权限(可以新建文件),则用户所创建的新文件的用户组与此目录的用户组相同。

对于文件来说: SGID对二进制程序有用
程序执行者对于该程序来说,需具备x的权限
执行者在执行的过程中将会获得该程序用户组的支持。

7.4 Sticky Bit 只针对目录有效。其作用是: 在Linux下,/tmp是一个存放临时文件的目录,要求是对所有用户可写。但每个用户都只能删除自己拥有的文件。这种情况下,就可以把目录加一个粘着位。默认情况下,如果一个目录上有w和x权限,则任何人都可以在此目录中建立与删除文件。一旦目录上设置了冒险位,则表示在此目录中,只有文件的拥有者,目录的拥有者与系统管理员root 才可以删除文件。
换句话说:当甲用户对于A目录来说具有群组或其他人的身份,并且拥有该目录的w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行“删除、更名、移动”等操作。不过,如果将A目录加上了 Sticky Bit 权限位时,则甲只能够针对自己建立的文件或目录进行“删除、更名、移动”等操作,而无法改动其他人的。 当用户U在目录D下创建文件F, 若目录D拥有SBIT权限,那么仅有用户U和root能删除文件F。

极重要!Linux权限与命令间的关系权限对于用户账号来说是非常重要的,因为他可以限制用户能不能读取/建立/删除/修改文件或目录!我们就将文件系统的管理命令和文件权限这两者结合起来,说明一下什么命令在什么样的权限下才能够运作吧!^_^
一、让用户能进入某目录成为『可工作目录』的基本权限为何: · 可使用的命令:例如 cd 等变换工作目录的命令;· 目录所需权限:用户对这个目录至少需要具有 x 的权限· 额外需求:如果用户想要在这个目录内利用 ls 查阅文件名,则用户对此目录还需要 r 的权限。二、用户在某个目录内读取一个文件的基本权限为何? · 可使用的命令:例如cat, more, less等等· 目录所需权限:用户对这个目录至少需要具有 x 权限;· 文件所需权限:用户对文件至少需要具有 r 的权限才行!三、让用户可以修改一个文件的基本权限为何? · 可使用的命令:例如 nano 或 vi 编辑器等;· 目录所需权限:用户在该文件所在的目录至少要有 x 权限;· 文件所需权限:用户对该文件至少要有 r, w 权限四、让一个用户可以建立一个文件的基本权限为何? · 目录所需权限:用户在该目录要具有 w,x 的权限,重点在 w 啦!五、让用户进入某目录并执行该目录下的某个命令的基本权限为何? · 目录所需权限:用户在该目录至少要有 x 的权限;· 文件所需权限:用户在该文件至少需要有 x 的权限例题一:让一个用户 testuser 能够进行『cp /dir1/file1 /dir2』的命令时,请说明 dir1, file1, dir2 的最小所需权限为何? 答:执行 cp 时, testuser 要『能够读取来源文件,并且写入目标文件!』所以应参考上述第二点与第四点的说明!因此各文件/目录的最小权限应该是:dir1 :至少需要有 x 权限;file1:至少需要有 r 权限;dir2 :至少需要有 w, x 权限。例题二: 有一个文件全名为 /home/student/www/index.html ,各相关文件/目录的权限如下: drwxr-xr-x 23 root root 4096 Sep 22 12:09 / drwxr-xr-x 6 root root 4096 Sep 29 02:21 /home drwx------ 6 student student 4096 Sep 29 02:23/home/student drwxr-xr-x 6 student student 4096 Sep 29 02:24/home/student/www -rwxr--r-- 6 student student 369 Sep 29 02:27/home/student/www/index.html 请问 testuser 这个账号(不属于student群组)能否读取 index.html 这个文件呢? 答:虽然 www 与 index.html 是具有让 testuser 读取的权限,但是因为目录结构是由根目录一层一层读取的,因此 testuser 可进入 /home 但是即不可进入 /home/student/ ,既然连进入 /home/student 都不许了,当然就读不到index.html 了!所以答案是『testuser不会读取到 index.html 的内容』喔!那要如何修改权限呢?其实只要将 /home/student 的权限修改为最小 711 ,或者直接给予 755 就可以啰!这可是很重要的概念喔!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息