Linux 中的文件或目录拥有 3 中角色:
- 所有者
- 所属群组
- 其他人
这三种角色都分别有不同的权限。
Linux 用户账号密码以及群组的记录文件位置
① 账号以及一般使用者还有 root 用户的相关信息记录在/etc/passwd
。
② 个人的账号密码记录在/etc/shadow
。
③ 组名信息记录在/etc/group
。
Linux 的文件属性
可以使用 ls -al
进行查看:
可以发现, Linux 的文件属性可以分成 7 部分:
① 第一部分表示文件的类型和权限:
共由 10 个字符组成:
第 1 个字符表示这个文件的类型:
- d:目录
- -:文件
- l:连接文件,即快捷方式
- b:可供存储的接口设备,如 /dev/sda
- c:串行接口设备,如鼠标、键盘
- s:数据接口文件,资料接口文件,通常被用在网络上的数据惩戒,在 /var/run 中可以看到
- p:数据输送文件,主要目的是解决多个程序同时存取一个文件造成的错误问题
后面的 9 个字符,以 3 个为一组分别表示文件所有者、文件所属群组以及其他人的权限:
- 第 1 组(即第 2 - 4 个字符):文件所有者拥有的权限
- 第 2 组 (即第 5 - 7 个字符):文件所属群组拥有的权限
- 第 3 组(即第 8 - 10 个):其他人拥有的权限
文件的权限且 rwx 这三个参数组成。
-
r
表示可读,可用 4 代替(后面修改权限时会用到)。 -
w
表示可写,可用 2 代替。 -
x
表示可执行,可用 1 代替。 -
-
表示无此权限。
如:drwxr-xr--
:
-
d
表示这是一个目录 -
rwx
表示文件的所有者拥有可读可写可执行的权限 -
r-x
表示文件所属群组拥有可读可执行,不可写权限 -
r--
表示其他人拥有可读,但不可写不可执行的权限
②第 2 栏表示有多少文件在此目录下
若是文件则一般只有 1;若是目录则视情况而定。
③ 第 3 栏表示这个 文件或目录 的拥有者
④ 第 4 栏表示这个 文件或目录 的所属群组
⑤ 第 5 栏表示这个文件的 大小,默认单位为 bytes
⑥ 第 6 栏表示这个文件的 创建日期 或 最近修改日期
若太久没被改动,则可能只会显示年份,若想显示完整的时间格式,可以使用命令:ls -l --full-time
⑦ 第 7 栏表示这个文件的 文件名
修改文件所属群组:chgrp
可以使用 chgrp
命令来修改文件所属群组,但是修改后的组名必须在/etc/group
文件中存在才行。
如:将 a.txt 的群组更改为 users 组:chgrp users a.txt
可以加一个参数-R
表示对目录的所属群组进行递归修改,即在此目录下的所有文件和目录的群组都要做相应的修改。
将 test 目录下的所有文件和目录的群组都改为 users 组:chgrp -R users /test
更改文件的所有者:chown
可以使用 chown
命令来修改文件的所有者,但是修改后的用户名必须是已经存在系统中的账号,也就是在 /etc/passwd
文件中有记录的用户名称。
如:将 a.txt 的所有者改为 yt:chown yt a.txt
同样的,也可以加上 -R
参数进行递归,将某个目录下的所有文件和目录的所有者都进行修改。
将 test 目录下的所有文件和目录的所有者都改为 yt:chown -R yt /test
也可以同时更改文件所有者和所属群组:chown 所有者:所属群组 文件或目录
如:将 a.txt 的文件所有者改为 yt;所属群组改为 users:chown yt:users a.txt
更改文件的权限:chmod
可以使用两种方式来改变一个文件或目录的权限:
- 使用数字来修改,即(r:4、w:2、x:1)
- 使用符号
① 使用数字类型来修改权限
- 可读(r)可用数字 4 表示;
- 可写(w)可用数字 2 表示;
- 可执行(x)可用数字 1 表示
然后将 3 中角色(即文件所有者、文件所属目录、其他人)的读写权限的数值形式的值相加再分别赋予即可。
如:修改 a.txt 的文件权限:
- 将文件所有者的权限改为可读可写可执行:4 + 2 + 1 = 7
- 将文件所属群组的权限改为可读可执行,不可写:4 + 0 + 1 = 5
- 将其他人的权限改为可读,不可写不可执行:4 + 0 + 0 = 4
通过以上的分析,就可以通过命令进行修改 a.txt 的权限:chmod 754 a.txt
同样可以使用-R
参数进行递归修改。
使用符号类型来修改权限
文件或目录拥有的 3 中角色:
- 所有者:user
- 所属群组:group
- 其他人:others
- 以上 3 种身份都包括:all
那么就可以使用符号来代表上面的 4 中情况:
- 所有者:u
- 所属群组:g
- 其他人:o
- 以上所有身份:a
用符号来代表读写执行 3 中权限:
- 读权限:r
- 写权限:w
- 执行权限:x
用符号来代表对权限的增加、删除和修改:
- 添加权限:+
- 删除权限:-
- 设定权限:=
通过一些例子来说明:
① 将一个文件的权限设定为 rwxr-xr–(即所有者可读可写可执行、所属群组可读可执行不可写、其他人可读不可写不可执行):chmod u=rwx,g=rx,o=r test.txt
② 若不知道文件原先属性,想将全部人(所有者、所属群组、其他人)的权限都添加可读权限:chmod a+r test.txt
③ 给文件的所属群组添加可执行权限:chmod g+x test.txt
④ 给文件的所有者除去可读权限chmod u-r test.txt
权限对文件的意义
- 读权限(r):可读取此文件的实际内容,如读取文本文件的文字内容等
- 写权限(w):可以编辑、新增或是修改该文件的内容,但不含删除该文件
- 执行权限(x):该文件具有可以被系统执行的权限
权限对目录的意义
- 读权限(r):表示具有读取目录结构列表的权限。因此若具有 读取 一个目录的权限时,表示可以查 询该目录下的文件名数据,即可以使用
ls
命令将该目录的内容列表显示出来 - 写权限(w):若具有对目录的写权限,则说明:
① 可以在该目录下建立新的文件和目录
② 可以删除该目录下已经存在的文件和目录
③ 可以将该目录下已经存在的文件或目录更名
④ 可以移动该目录内的文件和目录的位置
由此可见,目录写权限特别重要,不可随便的赋予。 - 执行权限(x):表示用户能否进入该目录成为工作目录,即能否使用
cd
命令进入该目录
文件的预设权限:umask
预设权限
在一般情况下:
- 若建立的是文件:则预设没有可执行权限(x),也就是说只有可读(r)和可写权限(w),最大为666。
文件的预设权限如下:-rw-rw-rw-
- 若建立的是目录:默认所有权限均开放,具有可读(r)、可写(w)和可执行(x)权限,即777.
目录的预设权限如下:drwxrwxrwx
umask
umask就是指定:目前用户在建立文件或目录时的权限默认值,可以直接输入umask
进行查看。
可以看到,输入 umask
后,会输出 4 位数字,如上图所示的就是0022:
- 第一位数字描述的是特殊权限(SGID、SUID 等)的默认权限需要减掉的权限分数
- 第二位数字描述的是所有者的默认权限需要减掉的权限分数
- 第三位数字描述的是所属群组的默认权限需要减掉的分数
- 第四位数字描述的是其他人的默认权限需要减掉的分数
需要特别说明的是:umask 显示的分数指的是,默认值需要减掉的分数。
如:去掉读权限(r)就是4,去掉读权限(r)和写权限(w)就是6.
下面看一个例子例子:
如上图中输入 umask
后,显示的是0022
,现在我们先只关注后面 3 个数字,即022
。
- 第一个数字是 0 ,表示默认情况下文件的所有者没有去掉任何权限
- 第二个数字是 2,表示默认情况下文件的所属群组的权限被拿掉了写权限(w)
- 第三个数字是 2,表示默认情况下其他人的权限去掉了写权限(w)
故:
① 当建立的是文件时,由于文件的默认权限是:-rw-rw-rw-
(666);但是被去掉了 022。666 - 022 = 644
,即-rw-r--r--
因此当 umask 为 0022 时,若我们建立的是文件,默认情况下该文件的权限是: -rw-r--r--
② 若建立的是目录,由于目录的默认权限是 drwxrwxrwx
(777);但是被去掉了 022。777 - 022 = 755
,即drwxr-xr-x
因此当 umask 为 0022,若我们建立的是目录,默认情况下该目录的权限是:drwxr-xr-x
修改预设权限
直接在 umask 后面接数字就可以修改(忽略 第一位),如:umask 002
配置文件的隐藏属性(只在 Ext2 / Ext3 文件系统上生效):chattr
用法:chattr [+-=] [ASacdistu] 文件或目录名
选项 | 意义 |
+ | 增加一个特殊参数,其他原本存在的参数不变 |
- | 删除一个特殊参数,其他原本存在的参数不变 |
= | 直接设定参数 |
A | 当存取该文件或目录时,访问时间(atime) 不会被修改 |
S | 一般文件是异步写入磁盘的,加了 S 参数可以同步写入磁盘 |
a | 该文件只能增加数据,不能删除也不能修改数据,只有 root 才能设定这个属性 |
c | 会自动将文件压缩,在读取的时候会自动的解压缩,存储时,会先进行压缩后再储存 |
d | 当 dump 命令被执行时,设定了 d 属性将使地该文件或目录不会被 dump 备份 |
i | 可以让一个文件不能被 删除、更名、设定连接,无法写入或新增数据,只有 root 可以设定此属性 |
s | 如果文件被删除,这个文件将会被完全的移除出这个硬盘空间 |
u | 与 s 相反,如果文件被删除,数据内容还存在硬盘中,可以使用此参数来救援该文件 |
可以使用 lsattr
来查看文件的隐藏属性lsattr [选项 ] 文件或目录
选项 | 意义 |
-a | 将隐藏文件的隐藏属性也显示出来 |
-d | 如果是目录,则仅列出目录本身的属性而非目录内的 |
-R | 递归列举子目录的隐藏属性 |
文件的特殊权限(SUID、SGID、SBIT)
通常情况下,文件和目录拥有 3 个一般的权限,即 读写执行(rwx);
但是,其实还有两个特殊权限:s、t。
1. set UID(SUID)
当 s 这个标志出现在文件拥有者的 x(可执行) 权限上时,那么就说明该文件具有了 SUID 的特殊权限
SUID 的限制与功能:
- SUID 权限只对二进制程序有效
- 执行者对于该程序需要具有 可执行权限(x)
- SUID 只在执行该程序的过程中有效
- 若具有 SUID 权限,则每一个执行者在执行该文件时会临时具有文件所有者的权限
例子:
① 在 Linux 系统中,所有的账号密码都记录在 /etc/shadow
这个文件中,且该文件的权限为:
说明 /etc/shadow 这个文件只有 root 用户可以读,且只有 root 用户可以强制写入。② 再来看看 passwd
这个命令。passwd 是一个可以修改登录密码的命令,也就是说 passwd
这个命令需要去修改 /etc/shadow
文件。
但是在上面看到了,/etc/shadow 这个文件只有 root 用户可以修改,那么普通用户为什么可以通过更改 /etc/shadow 的内容来更改密码呢?
来看看 passwd 这个命令文件的权限:
可以看到 passwd 文件的属性为:-rwsr-xr-x
,在原本文件所有者的执行权限的位置上出现了 s ;且该文件的所有者为 root。
由此可以看到,当一般用户调用 passwd 命令时,由于具有了 SUID 权限,因此当执行 passwd 命令去修改 /etc/passwd 文件时,会临时具有 root 的权限,也就可以进行修改了
③ 但是一般用户不能使用 cat
命令来查看 /etc/shadow 文件的内容,因为 cat 命令的权限为:-rwxr-xr-x
文件的所有者是 root ,但由于其不具有 SUID 权限,故不能临时具有 root 的权限,所以无法查看。
2. Set GID(SGID)
当 s 标志出现在文件所属群组时,则具有了 SGID 权限。。
与 SUID 不同的是,SGID 可以针对目录和文件来设定,而 SUID 只能针对文件来设定。
① 若是针对文件,SGID 有如下限制和功能:
- SGID 只对二进制程序起作用
- 程序的执行者对于该程序需要具有可执行权限(x)
- 执行者在执行该程序的过程中会临时获得该文件所属群组的支持,临时成为该群组的成员
例子:我们可以使用 /usr/bin/locate 这个命令程序去搜索 /var/lib/mlocate/mlocate.db 这个文件中的内容
先来看看 /usr/bin/locate 和 /var/lib/mlocate/mlocate.db 这两个文件的权限:
在 /usr/bin/locate 这个命令文件的所属群组的可执行权限位置上出现了 s 标志,说明其具有 SGID 权限。
当一个普通用户使用该命令去操作其他文件时,由于具有 SGID,那么久会临时具备了其所属群组(即 slocate )的权限,从而可以去读取 /var/lib/mlocate/mlocate.db 这个文件的内容。
② 若是针对目录,SGID 具有如下限制和功能:
- 若用户对此目录具有 可读(r)和可执行(w)权限,即该用户能够进入此目录
- 用户在此目录下的有效群组(effective group)将会变成该目录的群组
- 若用户在此目录下具有可写权限(w),即可以新建文件,则使用者建立的新文件的群组与此目录的群组相同,而不是和使用者的群组相同
3. Sticky Bit(SBIT)
SBIT 只对目录起作用。
SBIT 的限制和基本作用:
- 用户需要对此目录具有 可写(w)和可执行(x)权限,即具有写入权限
- 当用户在该目录下建立文件或目录时,只有自己和 root 管理员才有权利删除这个文件
4. SUID、SGID、SBIT 权限的设定
之前在设定权限时,我们只指定了 3 位数字,即默认的可读(r)、可写(w)、可执行(x);而我们可以在这 3 位数字前面再加上 1 个数字来代表特殊权限。
当使用 4 位的数字来设定权限时,第一位数字代表的权限:
- 4:具有 SUID 权限
- 2:具有 SGID 权限
- 1:具有 SBIT 权限
例子:将一个文件的权限修改为:-rwsr-xr-x
chmod 4755 a.txt
也可以使用符号来设置权限:chmod u=rwxs,g=xo=x a.txt
chmod g+s,o+t a.txt
若出现了大写的 T、S,则说明文件本身不具有可执行权限(x),因此为空。
如:文件的所有者不具有 x 权限,但是却设置了 SUID,则该文件的权限为:-rwSrwSrwT
权限和命令之间的关系
列举一些例子,来说明一下什么指令能在什么样的权限下才能运行:
① 让用户能够进入某目录成为可工作目录的基本权限:
- 可使用的指令:cd 等变换工作目录的指令
- 目录所需权限:可执行权限 (x)
- 若用户还想要在这个目录内利用 ls 查看文件名,则需要对此目录具有 可读权限®
② 用户在某个目录内读取一个文件的权限:
- 可使用的指令:cat、more、less 等
- 目录所需权限:至少需要 可执行权限(x)
- 文件所需权限:至少需要 可读权限®
③ 让使用者可以修改一个目录下文件的基本权限:
- 可使用指令:vi
- 目录所需权限:可执行权限 (x)
- 文件所需权限:可读可写权限(r、w)
④ 让一个使用者可以在一个目录下创建一个文件的基本权限:
- 可使用命令:touch 等
- 目录所需权限:需要具有 可写可执行权限(r、w)
⑤ 让用户进入某目录并执行该目录下的某个指令的基本权限:
- 目录所需权限:可执行权限 (x)
- 文件所需权限:可执行权限 (x)
主机的西部权限规划:ACL 的使用
传统的权限仅有 3 中身份 (owner、group、others) 搭配 3 中权限 (r、w、x)。并没有办法只针对某一个用户或某一个群组来设定特殊的权限需求。此时就需要使用到 ACL 这个机制了。
1. 什么是 ACL
ACL 是 Access Control List 的缩写,主要目的是在提供传统的 owner、group、others 的 read、write、execute 权限之外的细部权限设定。ACL 可以针对单一用户、但以文件或目录来进行 r、w、x 的权限设置。
ACL 主要可以针对的几个方面:
- 用户(user):可以针对用户来设定权限
- 群组(group):可以针对群组来设定权限
- 有效权限(mask):针对建立新文件的默认权限
2. setfacl:设定某个目录或文件的 ACL
setfacl [选项] 文件名
选项 | 意义 |
-m | 设定后续的 acl 参数给文件使用,不可与 -x 合用 |
-x | 删除后续的 acl 参数,不可与 -m 合用 |
-b | 删除所有的 acl 设定参数 |
-k | 溢出预设的 acl 参数 |
-R | 递归设定 acl |
-d | 设定默认 acl 参数,只对目录有效 |
针对特定用户的设定规范:
u:用户列表:[rwx]
如:
① 针对用户 yt 对文件 acltest 设置权限规范 rx(可读可执行):
setfacl -m u:yt:rx acltest
权限部分多了个 +
,且与原本的权限(644)有一定差异。② 若不加用户列表,则是对该文件的所有者设置
setfacl -m u::rwx acltest
可以看到对文件所有者设置了 rwx 权限后,上面显示的文件所有者 root 的权限变为了 rwx。
当一个文件设置了 ACL 参数后,他的权限部分就会多出一个 +
号。但是此时看到的权限和实际权限可能会有误差,我们就需要通过命令getfacl
来查看权限。
3. getfacl:查看 ACL 权限
getfacl 文件名
通过这个就可以查看到各个我们设置的 ACL 权限。原本用户 yt 是属于 other 那一组的权限(即只有r--
),但是由于刚刚我们设置了:setfacl -m u:yt:rx acltest
,因此 yt 用户具有了 r-x 的权限。
需要特别注意的是:mask::r-x
这一行:
mask 是此文件的预设权限,其意义是:使用者或群组所设定的权限必须要存在于 mask 的权限设定范围内才会生效。即有效权限(effective permission)。
因此如上图所示:如果这里的 mask 为 mask::r--
,但是 yt 的权限为 user:yt:r-x
,因为 mask 只有 r(可读),因此即便用户 yt 设置了拥有 rx(读执行)权限,但是依旧不存在 x 执行权限。
4. 针对不同方面来设置 ACL 权限
① 针对用户setfacl -m u:用户名:[rwx] 文件名
如:setfacl -m u:yt:rx acltest1
② 针对特定群组setfacl -m g:群组名:[rwx] 文件名
如:setfacl -m g:mygroup:rx acltest2
③ 针对有效权限 mask 的设定setfacl -m m:[rwx] 文件名
如:setfacl -m m:r acltest3
④ 针对预设权限的设定
如果想要在创建了 ACL 权限的目录下的再建立的文件或目录拥有设定了的 ACL 权限(也就是集成了目录的权限),那么就需要使用针对预设权限的设定方式setfacl -m d:[ug]:用户列表:[rwx] 文件名
如:让用户 yt 在设定了 ACL 的目录下拥有 rx 权限setfacl -m d:u:yt:tx /acltest