本章主要介绍Linux系统中的权限管理。
所有者和所属组的管理
权限管理
用数字表示权限
默认权限、特殊权限和隐藏权限
1 所有者和所属组
为了理解所有者和所属组的概念,我们先看图
张老板是某公司老板,买了一套房作为员工宿舍给A部门员工居 住。张老板是房主,所以他对房子具有很多权限,A部门员工只有使 用权而不能私自装修等,除张老板和A部门员工外,其他所有人都没 有任何权限。 那么,这套房子对三组人设置的权限如表所示。
表了解 u、g、o
同理,在Linux系统中对文件的授权也是通过这样的分组来进行的,如图所示。
1 的位置是所有者,这里/opt/hosts的所有者为root。
2 的位置是所属组,这里/opt/hosts的所属组为root。
如果想改变所有者,可以使用chown命令来实现,chown的用法如下。
chown user1 file
这里的意思是把file的所有者改为user1(理解为过户)。例如,把/opt/hosts的所有者改为wwww,如下所示。
[root@redhat8 ~]# chown wwww /opt/hosts
[root@redhat8 ~]# ls -lh /opt/hosts
-rw-r--r--. 1 wwww root 158 12月 4 10:45 /opt/hosts
chown也可以用于修改组,用法如下。
chown .group1 file 或 chown :group1 file
把file的所属组改成 group1,这里组前面有一个点或冒号。例如,把/opt/hosts 的所属 组改成users,如下所示。
[root@redhat8 ~]# chown .users /opt/hosts
[root@redhat8 ~]# ls -l /opt/hosts
-rw-r--r--. 1 wwww users 158 12月 4 10:45 /opt/hosts
需要注意的是,这里的点或冒号一定不要忘记了,否则就是修改所有者了。
也可以同时修改所有者和所属组,用法为“chown user1.group1 file”。例如,把/opt/hosts的所有者改成root。所属组改成wwww,如下所示。
[root@redhat8 ~]# chown root.wwww /opt/hosts
[root@redhat8 ~]# ls -l /opt/hosts
-rw-r--r--. 1 root wwww 158 12月 4 10:45 /opt/hosts
创建目录/opt/xx,把/etc/hosts拷贝到/opt/xx中,然后查看/opt/xx和 /opt/xx/hosts的 权限,如下所示。
[root@redhat8 ~]# mkdir /opt/xx
[root@redhat8 ~]# cp /opt/hosts /opt/xx/
[root@redhat8 ~]# ls -ld /opt/xx/
drwxr-xr-x. 2 root root 19 12月 5 10:00 /opt/xx/
[root@redhat8 ~]# ls -l /opt/xx/hosts
-rw-r--r--. 1 root root 158 12月 5 10:00 /opt/xx/hosts
可以看到,所有者都是root。现在修改/opt/xx的所有者为wwww,如下所示。
[root@redhat8 ~]# chown wwww /opt/xx
[root@redhat8 ~]# ls -ld /opt/xx/
drwxr-xr-x. 2 wwww root 19 12月 5 10:00 /opt/xx/
[root@redhat8 ~]# ls -l /opt/xx/hosts
-rw-r--r--. 1 root root 158 12月 5 10:00 /opt/xx/hosts
可以看到, /opt/xx的所有者变为了wwww,但是/opt/xx 中文件hosts的所有者并没有修改,这就意味着,当修改目录的所有者或所属组时,并不会影响目录中文件的属性。如果在改变目录属主/组时,想把里面内容的属主/组一起改掉,需要加上-R选项(表示递归),如下所示
[root@redhat8 ~]# chown -R wwww /opt/xx
[root@redhat8 ~]# ls -ld /opt/xx
drwxr-xr-x. 2 wwww root 19 12月 5 10:00 /opt/xx
[root@redhat8 ~]# ls -l /opt/xx/hosts
-rw-r--r--. 1 wwww root 158 12月 5 10:00 /opt/xx/hosts
可以看到,不仅把/opt/xx的属主改了,同时把/opt/xx里面内容的属主也改了。
如果想单独修改所属组,还可以使用chgrp命令,用法如下。
chgrp group1 file
把/opt/hosts的所属组改为users,如下所示。
[root@redhat8 ~]# ls -l /opt/hosts
-rw-r--r--. 1 root wwww 158 12月 4 10:45 /opt/hosts
[root@redhat8 ~]# chgrp users /opt/hosts
[root@redhat8 ~]# ls -l /opt/hosts
-rw-r--r--. 1 root users 158 12月 4 10:45 /opt/hosts
当然,chgrp也可以使用-R选项(表示递归),大家自行练习即可。
再次把/opt/hosts的所有者和所属组改为root,如下所示。
[root@redhat8 ~]# chown root.root /opt/hosts
[root@redhat8 ~]# ls -l /opt/hosts
-rw-r--r--. 1 root root 158 12月 4 10:45 /opt/hosts
2 查看及修改权限
对于一个文件来说,我们可以设置某用户对它具有什么操作权限,例如,是否可以看这个文件中的内容,是否可以往这个文件中写内容等。具有的权限包括以下3种。
(1)r:读权限。
(2)w:写权限。
(3)x :可执行权限。
r 权限和 w 权限比较好理解,x 权限如何理解呢?
对于一个目录 dir1来说,如果用户 user1 对目录 dir1 有x权限,则 user1 是可以用 cd 命令进入到dir1 中的,反之则不能用 cd 命令进人到此目录。
对于文件file1来说,如果用户user1对file1具有x权限,则用户可以把 file1当成一个命令来执行,当然运行的结果就要看file1的内容写的是什么了。
·在 Linux系统中,文件或目录的权限是通过u、g、o授权的,看下面的例子,如图所示。
1 是所有者的权限,这里的权限为rw。
2 是所属组的权限,这里的权限为r。
3 是其他人的权限,这里的权限为r。
查看blab所属组,命令如下。
[root@redhat8 ~]# groups wwww
wwww : wwww
blab 用户只属于 blab 组,所以 blab 用户对/opt/hosts文件只能使用 o 的权限,即只读r。 修改权限使用的是 chmod 命令,用法如图所示。
设置 o 不允许读 /opt/hosts。
[root@redhat8 ~]# chmod o-r /opt/hosts
[root@redhat8 ~]# ls -l /opt/hosts
-rw-r-----. 1 root root 158 12月 4 10:45 /opt/hosts
使用 wwww用户读取此文件
[wwww@redhat8 ~]$ cat /opt/hosts
cat: /opt/hosts: 权限不够
可以看到,blab 用户没有读取 /opt/hosts 的权限。现在把所有者的写权限去掉,同时给 o 加上读和写权限。
root@redhat8 ~]# chmod u-w,o+rw /opt/hosts
[root@redhat8 ~]# ls -l /opt/hosts
-r--r--rw-. 1 root root 158 12月 4 10:45 /opt/hosts
测试 wwww 是否对此文件可读可写。
[wwww@redhat8 ~]$ cat /opt/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[wwww@redhat8 ~]$ echo 111 >> /opt/hosts
可以看到,blab 对此文件具备读和写权限了。然后使用 root 进行写测试。
[root@redhat8 ~]# ls -l /opt/hosts
-r--r--rw-. 1 root root 162 12月 5 10:53 /opt/hosts
[root@redhat8 ~]# echo 22 >> /opt/hosts
从权限来看,root对此文件是只读权限,应该是写不进去的,但是实际却写进去了,这是 因为很多时候这些权限设置对root是不生效的。
刚才对权限的修改使用的是+和-,都是在原有权限的基础上进行增添删减,还可以直接用=,就是把权限设置为=后面的值,不管原来的权限是什么,如下所示。
[root@redhat8 ~]# chmod o=r /opt/hosts
[root@redhat8 ~]# ls -l /opt/hosts
-r--r--r--. 1 root root 165 12月 5 10:53 /opt/hosts
这里就是直接把 o 的权限设置为 r,不管 o 原来的权限是什么。
3 用数字表示权限
我们还可以用三个数字分别表示u、g、o的权限,规则如下。
(1)r——4。 (2)w——2。 (3)x——1。
再来看前面的图,如图所示。
这里u的权限为rw,则r-4,w=2,没有x则是0数字加起来为6,所以用6表示u的权限。g的权限为r,所以用4表示g的权限。o的权限为r,所以用4表示o的权限。
查看目录/opt的属性,命令如下。
[root@redhat8 ~]# ls -ld /opt/
drwxr-xr-x. 3 root root 29 12月 5 10:00 /opt/
这里u的权限为rwx,对应数字的和是4+2+1=7。
g的权限为x,对应数字的和是4+0+1=5。
o的权限为x,对应数字的和是4+0+1=5。
除给出权限能知道对应的数字外,给出数字也要能知道对应的权限。给出3个数字,要知道第一个数字是u的权限,第二个数字是g的权限,第三个数字是o的权限,然后每个数字用4、2、1进行分解。案例如下。
chmod 426 /opt/hosts
此处4是u的权限,4不能再次拆分,对应的权限为r。
2是g的权限,对应的权限为w。
6是o的权限,6=4+2,所以对应的权限为r和w。
[root@redhat8 ~]# chmod 426 /opt/hosts
[root@redhat8 ~]# ls -l /opt/hosts
-r---w-rw-. 1 root root 165 12月 5 10:53 /opt/hosts
使用chmod命令改变目录权限时,也可以使用-R选项,这样改变目录权限时也会把里面的文件及子目录的权限也改掉。
如果想给一个目录/文件设置权限,让所有人都具备所有权限,可以把此目录/文件的权限设置为777。
4 默认权限
先做如下操作,清空/opt中所有的内容,命令如下。
[root@redhat8 ~]# cd /opt/
[root@redhat8 opt]# rm -rf *
[root@redhat8 opt]# ls
[root@redhat8 opt]#
然后创建两个目录aa和 bb,创建两个文件11和22。
[root@redhat8 opt]# mkdir aa bb
[root@redhat8 opt]# touch 11 22
[root@redhat8 opt]# ll
总用量 0
-rw-r--r--. 1 root root 0 12月 5 11:10 11
-rw-r--r--. 1 root root 0 12月 5 11:10 22
drwxr-xr-x. 2 root root 6 12月 5 11:10 aa
drwxr-xr-x. 2 root root 6 12月 5 11:10 bb
[root@redhat8 opt]#
可以看到,文件的默认权限都是644,目录的默认权限都是755(大家可以自行再多创建几个文件和目录进行验证),这个默认权限是哪里来的呢?系统中存在一个叫umask的值。
[root@redhat8 opt]# umask
0022
这个umask值我们称为权限过滤符,有四个数字,其中第一个数字0表示八进制,默认权限就是由后面三个数字决定的,这里看到的umask默认值是022。
创建文件时最多能具有的权限是666,创建目录时最多能具有的权限是777,然后通过umask命令来过滤,最终得到的权限就是默认权限了。
此时有人会得到一个结论:文件的默认权限是666-umask,目录的默认权限是777-umask。但这个结论并不完全正确。
先用默认的umask=022来分析,如图所示。
在图中,u的权限不做任何过滤,g和o的权限分别把w给过滤掉,所以文件的权限为644,目录的权限为755。
现在把umask设置为033再次进行分析,如图所示。
在图中,umask要过滤g和o的wx权限,但是创建文件时本身就不带x,所以这里过滤 x 并没用。对于目录来说,则是把g和o的wx都过滤掉了。
所以,得到的结论如下。
(1)目录的默认权限 =777-umask。
(2)文件的默认权限=666(umask每个奇数-1),如umask=333,则目录默认权限=666-222.相反,如果需要在创建一个文件时要有一个特定的默认权限,就要知道如何设置umask的值。例如,要求创建文件时默认权限为222,umask=666-222=444,所以umask可以设置为444,也可以设置为544、554、455等,只要umask的三个数字中有奇数就减1,最后为444即可。
5 特殊权限
除具有r、w、x三个权限外,还有 s 和 t 权限。
(1)s 设置在可执行命令上
当某可执行命令的所有者的位置上有s位时,那么当普通用户再执行这个命令时将具有所有者的权限。
我们知道用户的密码都是存放在/etc/shadow中的,而/etc/shadow对其他人来说是没有任何权限的。
[root@redhat8 opt]# ls -l /etc/shadow
----------. 1 root root 1361 12月 1 15:35 /etc/shadow
普通用户是可以修改密码的。
[wwww@redhat8 ~]$ passwd
更改用户 wwww 的密码 。
Current password:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
能修改密码,也就意味着/etc/shadow 的内容被修改了,这与普通用户没有权限修改letclshadow相冲突,为什么能修改呢?问题在于passwd命令身上,我们来看一下此命令的属性。
[root@redhat8 opt]# which passwd
/usr/bin/passwd
[root@redhat8 opt]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33544 12月 14 2019 /usr/bin/passwd
先通过which命令查看passwd的路径,然后使用ls -1命令查看它的属性,其实这两条命令可以写成一条,如下所示。
root@redhat8 opt]# ls -l $(which passwd)
-rwsr-xr-x. 1 root root 33544 12月 14 2019 /usr/bin/passwd
这样可以把 $() 中命令的结果传递给外面的命令使用,此处 $() 可以换成反引号 ``,记住是反引号不是单引号,反引号就是键盘上的【~】键。
可以看到,passwd命令所有者的位置上有s位。所以,root用户用passwd命令可以修改密码,即修改/etc/shadow的内容,如下所示。
[root@redhat8 opt]# echo haha001 | passwd --stdin wwww
更改用户 wwww 的密码 。
那么,普通用户使用passwd命令也能修改/etc/shadow 的内容。再举一个例子,查看/opt/11的权限。
[root@redhat8 opt]# touch /opt/11
[root@redhat8 opt]# ls -l /opt/11
-rw-r--r--. 1 root root 0 12月 5 11:27 /opt/11
再看一下 vim 命令的属性。
[root@redhat8 opt]# ls -l $(which vim)
-rwxr-xr-x. 1 root root 3063600 9月 20 2021 /usr/bin/vim
这里 vim命令没有s位。
blab 用户对/opt/11只能使用o的权限,即r--,是没有写权限的,请自行用vim打开此文件,写入一些数据,然后强制保存,如图所示,发现是写不进去的。
给vim命令所有者位置上加上 s 权限。
[root@redhat8 opt]# chmod u+s $(which vim)
[root@redhat8 opt]# ls -l $(which vim)
-rwsr-xr-x. 1 root root 3063600 9月 20 2021 /usr/bin/vim
然后再次使用wwww用户编辑/opt/11文件,按【i】键进入插入模式,随意写入一些内容,如图所示。
虽然这里提示修改的是只读文件,但是强制保存,也是可以写进去的。
[wwww@redhat8 ~]$ cat /opt/11
这是一个测试
把 vim命令所有者位置上的 s 权限去除,命令如下。
[root@redhat8 opt]# chmod u-s $(which vim)
[root@redhat8 opt]# ls -l $(which vim)
-rwxr-xr-x. 1 root root 3063600 9月 20 2021 /usr/bin/vim
(2)s设置在目录的所属组上
如果目录所属组的位置上有s位,则不管谁在此目录中新创建的文件或目录,都会继承这个目录所属组。
查看目录/opt/aa的属性信息,命令如下。
root@redhat8 opt]# ls -ld /opt/aa/
drwxr-xr-x. 2 root root 6 12月 5 11:10 /opt/aa/
把此目录所属组改成users,给g加上s权限,为了测试方便,给o加上w权限,这样blab用户也可以往此目录中写内容,如下所示。
[root@redhat8 opt]# chgrp users /opt/aa/
[root@redhat8 opt]# chmod g+s,o+w /opt/aa/
[root@redhat8 opt]# ls -ld /opt/aa
drwxr-srwx. 2 root users 6 12月 5 11:10 /opt/aa
先使用root 用户在此目录中创建一个文件aa.txt,然后查看其属性,命令如下。
[root@redhat8 opt]# touch /opt/aa/aa.txt
[root@redhat8 opt]# ls -l /opt/aa/aa.txt
-rw-r--r--. 1 root users 0 12月 5 11:47 /opt/aa/aa.txt
可以看到,两个文件所属组都是users,因为它们所在的目录/opt/aa所属组的位置上有s权限,且 /opt/aa所属组为users,这样不管谁在/opt/aa中新创建的文件/目录,都会继承/opt/aa所属组。
(3)t 设置在目录的o位置上
如果某个目录o位置上有 t 位,那么此目录中的文件除所有者和root外,其他用户即使对此文件具有所有权限,也无法删除此文件。
先创建一个用户 tom,以作备用,命令如下。
[root@redhat8 opt]# useradd tom
[root@redhat8 opt]# echo haha001 | passwd --stdin tom
更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@redhat8 opt]# cd
root用户创建一个目录/aa,把权限修改为777。
[root@redhat8 ~]# mkdir /aa
[root@redhat8 ~]# chmod 777 /aa/
[root@redhat8 ~]# ls -ld /aa/
drwxrwxrwx. 2 root root 6 12月 5 11:48 /aa/
使用wwww用户在/aa中创建一个文件aa.txt,并把权限设置为777。
[wwww@redhat8 ~]$ cd /aa/
[wwww@redhat8 aa]$ touch aa.txt
[wwww@redhat8 aa]$ chmod 777 aa.txt
[wwww@redhat8 aa]$ ls -l aa.txt
-rwxrwxrwx. 1 wwww wwww 0 12月 5 12:14 aa.txt
这样任何人对/aa/aa.txt都具备所有权限,包括删除。
再打开一个终端,切换到tom,然后删除/aa/aa.txt,命令如下。
[tom@redhat8 ~]$ ls /aa/
aa.txt
[tom@redhat8 ~]$ rm -rf /aa/aa.txt
[tom@redhat8 ~]$ ls /aa/
[tom@redhat8 ~]$
可以看到,tom删除了/aa/aa.txt,因为此文件的权限为777。使用root用户在/aa的o位置上增加t权限,命令如下。
[root@redhat8 aa]# chmod o+t /aa/
[root@redhat8 aa]# ls -ld /aa/
drwxrwxrwt. 2 root root 6 12月 5 11:50 /aa/
然后重复刚才的操作,wwww用户创建/aa/aa.txt,并把权限设置为777
[wwww@redhat8 ~]$ cd /aa/
[wwww@redhat8 aa]$ touch aa.txt
[wwww@redhat8 aa]$ chmod 777 aa.txt
[wwww@redhat8 aa]$ ls -l aa.txt
-rwxrwxrwx. 1 wwww wwww 0 12月 5 12:18 aa.txt
再次切换到tom删除此文件。
[tom@redhat8 ~]$ ls -l /aa/aa.txt
-rwxrwxrwx. 1 wwww wwww 0 12月 5 12:19 /aa/aa.txt
[tom@redhat8 ~]$ rm -rf /aa/aa.txt
rm: 无法删除'/aa/aa.txt': 不允许的操作
虽然/aa/aa.txt的权限为777,但是现在tom是删除不掉的,因为目录/aa/位置上有t权限,目录/aa 中的内容只有所有者和root才能删除。
前面讲可以用数字表示权限,3个数字分别是u、g、o的权限,有时我们可以看到有4个数字,如图所示。
其中后面三个是u、g、o的权限,第一个数字就是特殊权限了。
(1)4=所有者+s。
(2)2=所属组+s。
(3)1=其他人+t
练习:
[root@redhat8 aa]# chmod 6644 /opt/aa/
[root@redhat8 aa]# ls -ld /opt/aa/
drwSr-Sr--. 2 root users 20 12月 5 11:47 /opt/aa/
这里的6就是特殊权限,6=4+2,那么也就是u+s、g+s了。
6 隐藏权限
系统中还存在一些隐藏权限,这些权限的设置对 root 也是生效的。查看隐藏权限的命令是lsattr,如果是查看目录的隐藏权限,需要加上-d选项。
root@redhat8 ~]# lsattr -d /opt/aa/
-------------------- /opt/aa/
这里不存在任何隐藏权限。修改隐藏权限的命令是chattr,常见的隐藏权限包括以下两种。
(1)a:只能增加,不能删除。
(2)i:不能增加,也不能删除。
增加权限用+,减去权限用-。 为/opt/aa增加a权限,命令如下。
[root@redhat8 ~]# chattr +a /opt/aa/
[root@redhat8 ~]# lsattr -d /opt/aa/
-----a-------------- /opt/aa/
目录/opt/aa中的内容只能增加,不能删除。
[root@redhat8 ~]# cp /etc/hosts /opt/aa/
[root@redhat8 ~]# ls /opt/aa
aa.txt hosts
[root@redhat8 ~]# rm -rf /opt/aa/hosts
rm: 无法删除'/opt/aa/hosts': 不允许的操作
删除失败,因为目录/opt/aa中的内容不允许删除,但是里面的文件是可以修改的。
[root@redhat8 ~]# echo 1111 > /opt/aa/hosts
可以看到,修改成功了。 去除a权限,命令如下
[root@redhat8 ~]# chattr -a /opt/aa/
[root@redhat8 ~]# lsattr -d /opt/aa/
-------------------- /opt/aa/
为/opt/aa增加i权限,命令如下。
[root@redhat8 ~]# chattr +i /opt/aa/
[root@redhat8 ~]# lsattr -d /opt/aa/
----i--------------- /opt/aa/
在/opt/aa中写入内容,命令如下。
[root@redhat8 ~]# ls /opt/aa/
aa.txt hosts
[root@redhat8 ~]# cp /etc/services /opt/aa/
cp: 无法创建普通文件'/opt/aa/services': 不允许的操作
会发现写不进去。下面删除一个文件,命令如下。
[root@redhat8 ~]# rm -rf /opt/aa/hosts
rm: 无法删除'/opt/aa/hosts': 不允许的操作
文件也删除不掉。
查看是否可以修改文件内容,命令如下。
[root@redhat8 ~]# echo 222 > /opt/aa/hosts
是可以修改的。请自行把/opt/aa 的i权限删除,然后清空/opt中的内容。
[root@redhat8 ~]# chattr -i /opt/aa/
[root@redhat8 ~]# rm -rf /opt/*
[root@redhat8 ~]# ls /opt/