由于Linux是多用户、多任务的操作系统,因此可能常常有多人同时在某台主机上工作,为了考虑每个人的隐私,文件所有者这个权限就尤为重要。每个人均可在主机上设置文件的权限,让其成为个人的“私密文件”,即个人所有者。因为设置了适当的文件权限,除本人(文件所有者)之外的用户无法查看文件内容。
群组是权限中最有用的功能之一,群组简单理解就是用户组,类似于我们公司的各个部门之间,或者学校班级之间的划分,每个班级就是一个群组,群组内的资源是共享的,群组间是相互隔离的。
不属于文件所有者或文件所属群组成员的用户。
tips:这么说大家可能还不是很了解,这里举个栗子:
张三、李四、王五是舍友住在三室一厅的房子里,他们分别是自己房间的所有者(owner);这里有一个用户组(group),这个组有张三、李四、王五三个成员,这个组里的成员都可以进入客厅;隔壁赵六,既不能进入他们的个人房间,也不能去他们三个共用的客厅,显而易见就是其他人(others)。
权 限 | 说 明 |
---|---|
读权限(r) | 可获取文件的数据 |
写权限(w) | 可修改文件的数据 |
执行权限(x) | 可以将此文件运行为进程 |
权 限 | 说 明 |
---|---|
读权限(r) | 可使用ls命令获取其下的所有文件列表 |
写权限(w) | 可在此目录下“创建/删除//复制/移动”文件 |
执行权限(x) | 可以cd至此目录中,并且可以使用ls -l命令来获取所有文件的详细属性信息 |
在Linux中,是如何查看文件的权限信息呢?ls命令就可以查看文件的相关属性(也可以使用 " ll " 命令,等价于 " ls -l " )。其中,标红的部分就是Linux的文档权限属性信息。
对于这十个字段,所表达的含义可以结合这张图来理解:
十位字符表示含义:
第1位:表示文档类型,取值常见的有"d"表示文件夹、"-"表示文件、"l"表示软链接、"s"表示套接字等等;
第2-4位:表示文档所有者的权限情况,第2位表示读权限的情况,取值有r、-;第3位表示写权限的情况,取值有w、-;第4位表示执行权限的情况,取值有x、-。
第5-7位:表示与所有者同在一个组的用户的权限情况,第5位表示读权限的情况,取值有r、-;第6位表示写权限的情况,取值有w、-;第7位表示执行权限的情况,取值有x、-。
第8-10位:表示其他用户的权限情况,第8位表示读权限的情况,取值有r、-;第9位表示写权限的情况,取值有w、-;第10位表示执行权限的情况,取值有x、-。
选 项 | 解 释 |
---|---|
-R | 递归设置权限(当文件类型为目录时使用) |
权限模式就是该文件需要设置的权限信息,分为字母形式和数字形式。
① 字母形式
给谁设置 | 含 义 | 分配方式 | 含 义 | 权限字符 | 含 义 |
---|---|---|---|---|---|
u | 所有者(owner) | + | 新增权限(相对当前) | r | 读权限 |
g | 用户组(group) | - | 删除权限(相对当前) | w | 写权限 |
o | 其他人(others) | = | 将权限设置成具体的值(注重结果) | x | 执行权限 |
a | 所有人(all) | … | … | - | 没有权限 |
实例:创建/tmp/test(-rw-rwx—)文件并给其设置权限,要求所有者拥有全部的权限,同组用户拥有读和执行权限,其他用户拥有读权限和写权限。
[root@localhost tmp]# chmod u=rwx,g=rx,o=rw test //第一种方法
[root@localhost tmp]# ll
总用量 0
-rwxr-xrw-. 1 root root 0 3月 12 20:14 test
[root@localhost tmp]# chmod u+x,g-w,o+rw test //第二种方法
[root@localhost tmp]# ll
总用量 0
-rwxr-xrw-. 1 root root 0 3月 12 20:14 test
② 数字形式
权 限 | 数 值 |
---|---|
读权限(r) | 4 |
写权限(w) | 2 |
执行权限(x) | 1 |
实例:为/tmp/test文件设置权限,要求所有者拥有全部的权限,同组用户拥有读和执行权限,其他用户只读权限。
全部权限(u):读+写+执行=4+2+1=7
读和执行(g):读+执行=4+1=5
读权限(o):读=4
[root@localhost tmp]# chmod 754 test
[root@localhost tmp]# ll
总用量 0
-rwxr-xr--. 1 root root 0 3月 12 20:14 test
tips:如果权限数字中但凡出现2与3的数字,则该权限有不合理的情况。为什么呢?
那是因为2表示只有写权限,3表示拥有写和执行权限。那么大家想一想,用户没有读权限,如何打开文件去写呢?
选 项 | 解 释 |
---|---|
-R | 递归修改(将目录内的目录或文件一并修改) |
创建/tmp/test文件,修改所有者为tom,所属组为jerry。
[root@localhost tmp]# ll //初始信息
总用量 0
drwxr-xr-x. 2 root root 18 3月 12 21:09 test
[root@localhost tmp]# chown tom:jerry test //修改所属者和所属组
[root@localhost tmp]# ll //修改成功
总用量 0
drwxr-xr-x. 2 tom jerry 18 3月 12 21:09 test
选 项 | 解 释 |
---|---|
-R | 递归修改(将目录内的目录或文件一并修改) |
[root@localhost tmp]# ll //初始信息
总用量 0
drwxr-xr-x. 2 tom jerry 18 3月 12 21:09 test
[root@localhost tmp]# chgrp root test/ //修改所属组
[root@localhost tmp]# ll //修改成功
总用量 0
drwxr-xr-x. 2 tom root 18 3月 12 21:09 test
1、任何一个可执行程序文件是否可以执行,取决于发起者对文件是否有x权限;
2、若进程启动成功,进程的属主为发起者,属组为进程发起者的所属组;
3、进程所能够访问文件的权限,取决于进程的发起者:
① 进程的属主与文件的属主是否相同;如果相同,则应用属主的权限;
② 否则,则检查进程的属主是否属于文件的属组;如果是,则应用属组的权限;
③ 否则,就只能应用others的权限。
ACL的全称是Access Control List(访问控制列表),一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供了一个额外的、更灵活的权限管理机制。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。
作为UGO权限管理的补充,ACL自然有UGO办不到的事情,例如:
① 可以针对用户来设置权限
② 可以针对用户组来设置权限
③ 子文件/目录继承父母录的权限
选 项 | 解 释 |
---|---|
-R | 递归列出所有文件和目录的acl |
选 项 | 解 释 |
---|---|
-m | 配置文件的acl,不可与-x合用 |
-x | 删除acl,不可与-m合用 |
-b | 删除所有acl |
-k | 删除默认acl |
-R | 递归地对所有文件和目录应用操作 |
-d | 配置"默认acl参数",只对目录有效,该目录新建的数据会继承此默认值 |
① 创建/tmp/testdir目录,并为tom(others)用户赋予x权限使其可以进入testdir目录。
[root@localhost tmp]# mkdir testdir //创建/tmp/testdir(drw-r--r--)目录
[root@localhost tmp]# chmod 644 testdir/ //修改testdir目录权限
[root@localhost tmp]# ll
总用量 0
drw-r--r--. 2 root root 6 3月 13 10:33 testdir
root@localhost testdir]# su - tom //切换至tom用户(tom用户属于其他人)
[tom@localhost tmp]$ cd testdir/ //尝试进入testdir目录(因为没有x权限,所以拒绝访问)
bash: cd: testdir/: 权限不够
[tom@localhost tmp]$ su - root //切换至root用户
密码:
上一次登录:五 3月 13 10:21:37 CST 2020从 192.168.140.1pts/0 上
[root@localhost ~]# setfacl -m u:tom:x /tmp/testdir/ //为tom用户对testdir目录添加x权限
[root@localhost tmp]# ll //查看文件信息也发生了变化
总用量 0
drw-r-xr--+ 2 root root 22 3月 13 10:33 testdir
[root@localhost tmp]# getfacl testdir/ //查看testdir目录的acl
# file: testdir/
# owner: root
# group: root
user::rw-
user:tom:--x //tom用户拥有x权限
group::r--
mask::r-x
other::r--
[root@localhost tmp]# su - tom //切换至tom用户测试是否可以进入testdir目录
上一次登录:五 3月 13 10:47:38 CST 2020pts/0 上
[tom@localhost ~]$ cd /tmp/testdir/
[tom@localhost testdir]$ //进入成功
② 删除tom用户对/tmp/testdir目录的所有acl权限。
[root@localhost ~]# setfacl -x u:tom /tmp/testdir/ //删除tom用户对testdir目录的权限acl权限
[root@localhost ~]# getfacl /tmp/testdir/ //查看testdir目录的acl
getfacl: Removing leading '/' from absolute path names
# file: tmp/testdir/
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r-- //user:tom:--x 这条记录以及被删除
③ 使/tmp/testdir目录下"文件/目录"继承/tmp/testdir目录的acl权限。
[root@localhost ~]# chmod 745 /tmp/testdir/ 修改testdir目录的权限为(-rw-rw-r-x)
[root@localhost ~]# setfacl -m d:u:tom:rw /tmp/testdir/ //为tom用户对testdir添加子目录/文件会继承的rw权限
[root@localhost ~]# touch /tmp/testdir/testfile //创建testfile文件
[root@localhost ~]# getfacl -R /tmp/testdir/ //递归查看testdir目录下全部文件的acl
getfacl: Removing leading '/' from absolute path names
# file: tmp/testdir/
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
default:user::rw-
default:user:tom:rwx //其子目录/文件默认tom用户拥有rw权限
default:group::r--
default:mask::rwx
default:other::r--
# file: tmp/testdir//testfile
# owner: root
# group: root
user::rw-
user:tom:rw- //tom用户拥有rw权限
group::r--
mask::rw-
other::r--
[root@localhost ~]# su - tom //切换至tom用户测试是否可以进入向testfile文件中写入内容
上一次登录:五 3月 13 13:35:50 CST 2020pts/0 上
[tom@localhost ~]$ echo "Hello World" > /tmp/testdir/testfile
[tom@localhost ~]$ cat /tmp/testdir/testfile
Hello World
④ 删除/tmp/testdir目录的全部acl权限。
[root@localhost tmp]# setfacl -b /tmp/testdir/ 移除所有acl权限
在我们创建新的目录和文件时本身也是有它默认的权限,这个默认权限是什么呢?就是由权限掩码umask所确定的。它的功能可以说与chmod刚好相反,代表默认拿走的,也就是说不要的权限。
所以说umask就是用来指定"目前用户在新建文件或者目录时的权限默认值"。那么如何得知或设置这个umask呢?
[root@localhost ~]# umask //以数字类型的方式显示出权限设置
0022
//其中第一个0与特殊权限有关,可以暂时不用理会
//后三位022则与普通权限(rwx)有关
[root@localhost ~]# umask -S //以符号类型的方式显示出权限设置
u=rwx,g=rx,o=rx
那么这个数字具体是怎么表示权限的呢?
文件:666-umask 目录:777-umask
那又为什么文件是666去减呢?那是因为文件默认不能拥有执行权限,如果普通文件都有执行权限,那么势必安全性就会很低(一些木马程序就有权限直接被执行)!所以,如果减得的结果中有执行权限,则会加1进行修改。
例如:
umask:023
文件:666-023=643 需要加"1",所以为644
目录:777-023=745
设置umask很简单,这里不做过多讲述。
[root@localhost ~]# umask 023 //设置umask为023
[root@localhost ~]# umask
0023
当s这个标志出现在文件所有者的x权限上时,就被称为Set UID,简称为SUID。那么这个特殊权限的特殊性的作用是什么呢?
① SUID权限仅对二进制程序(binary program)有效;
② 执行者对于该程序需要具有x的可执行权限;
③ 本权限仅在执行该程序的过程中(run-time)有效;
④ 执行者将具有该程序所有者(owner)的权限。
这么说大家可能不太理解,SUID这个权限的目的到底是什么呢?
例如:当用户修改自己密码的时候需要使用passwd这个命令,这个二进制文件的权限为:"-rwsr-xr-x",所以系统中每一个用户都可以执行,但是在修改密码的过程中需要将密码写入/etc/shadow文件中,但是这个文件的权限为:"----------"。从进程安全上下文中,大家可以知道一个命令对文件的调用权限取决于发起者对文件的权限,所以根本是拒绝写入的!这时就用到了这个s权限,执行passwd命令的过程中发起者就拥有了root的权限,所以用户就可以借助root的权力,修改/etc/passwd文件了。
tips:属主的执行权限为如果原本有执行权限,显示为小写s;否则为大写S。
如果这个s放在文件的所属用户组的x权限上时,就被称为Set GID,简称为SGID。和SUID一样,只是SGID是获得该程序所属用户组的权限。
① SGID对二进制程序有用;
② 程序执行者对该程序需要具有x的可执行权限;
③ 执行者将具有该程序所属组(group)的权限。
④ SGID主要用在目录上:在此目录下创建新的文件时,新的文件的属组和目录的属组相同。
如果大家已经理解SUID,那么相信前三点不是难点,第四点为大家举个栗子:
[root@localhost tmp]# mkdir testdir //创建testdir目录
[root@localhost tmp]# chmod g+s o+w testdir/ //为testdir目录添加SGID权限以及其他人给予w权限
[root@localhost tmp]# ll //权限给予成功
总用量 4
drwxr-srwx. 2 root root 4096 3月 17 00:17 testdir
[root@localhost tmp]# su - tom //切换至tom用户
[tom@localhost ~]$ touch /tmp/testdir/testfile //在testdir目录下创建testfile文件
[tom@localhost ~]$ cd /tmp/testdir/ //转到/tmp/testdir目录下
[tom@localhost testdir]$ ll //查看testfile有何特殊
总用量 0
-rw-rw-r--. 1 tom root 0 3月 17 00:35 testfile //`可以看出用户组还是root`
tips:属组的执行权限为如果原本有执行权限,显示为小写s;否则为大写S。
这个就是针对others来设置的了,目前只针对目录有效,作用是:当用户在该目录下建立文件或目录时,仅有自己和root才有权力删除。
最有代表的就是/tmp目录(drwxrwxrwt),任何人都可以在里面增加、修改文件,但仅有root与该目录/文件的创建者能够删除自己的目录或文件。
tips:其他人的执行权限为如果原本有执行权限,显示为小写t;否则为大写T。
Linux系统中的文件和目录,除了可以设定普通权限和特殊权限外,还有一些隐藏属性。
属 性 | 含 义 |
---|---|
A | 文件的atime不可被修改,可以减少磁盘I/O数量,有利于提高性能和续航能力 |
S | 磁盘I/O同步选项,功能类似sync |
a | 即append,只能向文件中添加数据,而不能删除 |
i | 文件不能被删除、改名、设置链接关系、写入或追加数据,只有root可以设置这个属性 |
c | 即compresse,文件会自动地经压缩后在存储,读取时会自动地解压 |
d | 即no dump,设定文件不能成为dump程序的备份目标 |
s | 删除文件或目录时,会被完全从硬盘空间中删除,不可恢复 |
u | 与s相反,删除文件或目录时,其内容会被保存,用于后期恢复数据,常用来防止意外删除文件或目录 |
选 项 | 解 释 |
---|---|
-a | 显示所有文件和目录的隐藏属性 |
-d | 只列出目录本身的隐藏属性,不会对目录下的文件或子目录进行操作 |
-R | 递归操作,列出当前目录及其子目录下的文件和目录的隐藏属性 |
查看文件的隐藏属性;
[root@localhost ~]# lsattr anaconda-ks.cfg
-------------e- anaconda-ks.cfg
模式格式:+/-/= 属性
参 数 | 含 义 |
---|---|
+ | 增加某些特殊属性,其他属性保持不变 |
- | 删除某些特殊属性,其他属性保持不变 |
= | 重置为仅后面接的特殊属性 |
给文件赋予 i 属性;
[root@localhost ~]# chattr +i anaconda-ks.cfg //赋予i属性
[root@localhost ~]# lsattr anaconda-ks.cfg //查看
----i--------e- anaconda-ks.cfg
[root@localhost ~]# rm -f anaconda-ks.cfg //即使是root用户也不能删除
rm: cannot remove `anaconda-ks.cfg': Operation not permitted