Linux之用户授权及权限安全

余生长醉 提交于 2020-01-09 15:41:11

给文件设定权限可以限定使用文件的用户,从而保护文件的安全。Linux中文件的一般权限分为r(读)、w(写)和x(执行)。通过命令ls -l 文件/目录或者ll 文件/目录可以查看文件/目录的权限。

以文件file为例,介绍文件权限的查看。
在这里插入图片描述
第一位-表示该文件类型为文件,我们分析后面的rw-rw-r--

read write execute
user yes yes no
group yes yes no
other yes no no

如上表所示,rw-rw-r--中,前三位表示文件所有者分别对该文件的读、写和可执行权限,中间三位表示用户组分别对该文件的读、写和可执行权限,后三位表示其他用户分别对对该文件的读、写和可执行权限。(目录同理)

修改文件/目录的一般权限

用户对于文件的一般权限是可以修改的,由超级用户root通过命令chmod实现。

增删法修改文件/目录的权限

若要修改默认的文件权限,可以使用如下方式:

1.首先要创建一个文件,因为要修改文件的权限,而一个普通用户的Desktop目录里的文件对其他用户是不可见的,为了演示修改权限后文件的效果,重新在mnt目录下新建一个文件file。
在这里插入图片描述
如图,该命令不被允许,我们查一下mnt目录的权限:
在这里插入图片描述
由图可知mnt目录的所有者和所在组均为root,对于其他用户没有写权限,难怪普通用户zj无法在该目录下建立文件了。

为了解决这个问题,我们先修改mnt目录的权限:

1-1.切换到root用户,增加其他用户对mnt的写权限(只有超级用户可以修改文件的权限):
在这里插入图片描述
1-2.查看修改后mnt的权限:
在这里插入图片描述
现在普通用户zj可以在mnt目录下建立文件了,我们再次用zj执行touch /mnt/file命令,不报错:
在这里插入图片描述
2.查看该文件的权限
在这里插入图片描述
可以看到文件file初始化的权限为rw-rw-r--,其他用户无法对该文件进行写操作,我们尝试一下。切换到普通用户xz,执行vim /mnt/file命令,在文件中写入内容后以:wq命令保存,结果如下:
在这里插入图片描述
以命令:wq!强制保存,结果如下:
在这里插入图片描述
文件并没有成功退出,只有执行强制退出不保存命令:q!时才退出vim编辑器。

3.给文件file增加其他用户的写权限:
在这里插入图片描述
4.重新返回用户xz编辑file文件:
在这里插入图片描述
文件成功修改!!
此例中给出了目录和文件的权限方法,除了增加权限,还可以删除权限,与增加的符号相反,使用-即可,例如:chmod o-x /mnt/file

被操作者除了其他人(other,o),还有文件/目录的所有者(user,u)以及user所在的组(group,g)例如:给用户所有者增加写权限的命令是:chmod u+w file;删除user所在组的读权限的命令是:chmod g-r file。除了使用加减符号修改权限,还可以通过设定修改文件/目录的权限。在已知某一文件/目录权限的情况下可以对其权限进行增删,但若提前并不知,可使用设定值的方法对权限进行修改。

设定法修改文件/目录的权限

令user拥有读取文件和执行文件的权限,命令为chmod u=rx file
在这里插入图片描述
同理,要修改group和other的权限,可以使用chmod g=权限 filechmod o=权限 file
比较特殊的是,若要同时修改三种用户的权限,可以使用chmod a=权限 file实现。例如令三种用户均仅有可读权限:
在这里插入图片描述
若要同时删除三种用户的某个权限,可以使用chmod -权限 file实现。
在这里插入图片描述

数字法修改文件/目录的权限

例如可以使用chmod 777 /mnt/file命令将file的所有权限都打开。
在这里插入图片描述

数字与权限的对应

数字 含义 权限
0 - - - 无任何权限
1 - -x 可执行
2 -w- 可写
3 r- - 可读
4 -wx 可写+可执行
5 r-x 可读+可执行
6 rw- 可读+可写
7 rwx 可读+可写+可执行

知道了数字与权限的对应关系就可以将权限修改为任意的格式。

复制权限

复制某一文件的权限有两种方法,一种是直接复制整个文件(包括文件的权限的内容),另一种是仅复制文件的权限。

方法一:利用cp命令将文件/mnt/file复制给文件/mnt/file2,然后通过查询两个文件的权限和内容,可以看到这两个文件完全相同。
在这里插入图片描述
方法二:利用命令chmod --reference=源文件 目标文件仅复制文件的权限。
在这里插入图片描述
注意:在执行此命令之前要确保目标文件已创建,如果/mnt/file2不存在,则会报错。
在这里插入图片描述
遇到这种情况,我们先创建文件,再执行复制权限命令即可。
在这里插入图片描述
随后,通过查看文件的权限和内容可以看到,通过此命令并没有复制文件file的内容。
在这里插入图片描述

改变权限阀值

资源存在的意义是共享,对资源的权限开放的越大,资源的共享性就越好,但系统的安全性就越差。为保证系统安全性的同时尽可能的实现资源共享,需要保留使用资源的最小权限。这就需要设定权限阀值,在初始化资源时就定好某类型的资源应该拥有的最小权限。比如:文件的初始化权限是664,目录的初始化权限是775

1.初始化file时的权限:
在这里插入图片描述
2.初始化一个目录dir并查看它的权限:
在这里插入图片描述
我们可以通过umask命令查看权限阈值。
在这里插入图片描述
第一位是特殊位,先不予考虑,后面三位是002,说明预留的权限是777-002=775,正好是初始化目录的权限。初始化文件的权限在此基础上再减去了111,即777-002-111=664

资源的权限阀值是可以修改的,分为临时修改和永久修改两种。

临时修改权限阀值

umask XXX  ##将权限阀值修改为xxx,在此shell下成立

永久修改权限阀值

假如要将root的权限阀值修改为744

1.将用户切换为root,执行vim /etc/bashrc命令
在这里插入图片描述
2.搜索umask,命令模式下执行/umask
在这里插入图片描述
3.将else中的umask修改为033
在这里插入图片描述
4.执行vim /etc/profile命令,将else中的umask修改033
在这里插入图片描述
5.更新修改过的两个配置文件
在这里插入图片描述
6.新建一个文件和目录,验证一下权限阀值是否已更改
在这里插入图片描述
可见新建的目录初始权限为744,新建文件的初始权限为644。(注意:系统默认文件的权限要在目录权限的基础撒谎嗯减去三类用户的执行权限,即111)。

修改特殊权限

除了以上的r、w、x这三种一般权限,还有三种特殊权限SUID、SGID、STICKYID。
SUID:用于二进制可执行文件,该权限开启时,运行程序时以文件拥有者的身份去运行。
SGID:可用于二进制可执行文件和目录。作用于文件时,该权限可在运行程序时以文件所有组的身份去运行;作用于目录时,在该目录中新建的目录/文件所属组与该目录相同。
STICKYID当该权限开启时,所有用户都可在目录下创建文件,但只有目录所有者和root用户才可删除文件。当该权限作用于文件时,即使文件未被调用也可以加载到交换空间中。

以下使用几个例子来说明这三种特殊权限的用法:
例1chmod o+t 目录地址后,只有文件所有者和root可以删除目录下的文件。

[root@localhost mnt]# su - xz                 ##切换到普通用户xz
[xz@localhost ~]$ mkdir /mnt/dir              ##创建目录
[xz@localhost ~]$ ls -ld /mnt/dir             ##查看目录权限
drwxrwxr-x. 2 xz xz 6 Dec 28 11:08 /mnt/dir
[xz@localhost ~]$ chmod o+t /mnt/dir          ##给目录增加特殊权限t
[xz@localhost ~]$ ls -ld /mnt/dir             ##查看修改后的目录权限
drwxrwxr-t. 2 xz xz 6 Dec 28 11:08 /mnt/dir
[xz@localhost ~]$ su - zj                     ##切换到普通用户xz
[zj@localhost ~]$ touch  /mnt/dir/test        ##创建文件test,发现无权限
touch: setting times of '/mnt/dir/test': Permission denied
[zj@localhost ~]$ su - root                   ##切换到超级用户xz
Password: 
[root@localhost ~]# chmod o+w /mnt/dir        ##给目录dir增加写权限
[root@localhost ~]# ls -ld /mnt/dir     
drwxrwxrwt. 2 xz xz 6 Dec 28 11:08 /mnt/dir
[root@localhost ~]# logout
[xz@localhost ~]$ touch /mnt/dir/test{1..3}   ##创建文件test1,test2,test3
[xz@localhost ~]$ su - tushansusu             ##切换到普通用户tushansusu
[tushansusu@localhost ~]$ rm /mnt/dir/test1   ##删除由xz创建的文件,失败!
rm: remove write-protected regular empty file '/mnt/dir/test1'? y
rm: cannot remove '/mnt/dir/test1': Operation not permitted
[tushansusu@localhost ~]$ logout
[root@localhost ~]# rm /mnt/dir/test1        ##root删除由xz创建的文件test1,成功!
rm: remove regular empty file '/mnt/dir/test1'? y
[root@localhost ~]# logout
[xz@localhost ~]$ rm /mnt/dir/test2         ##xz删除由xz创建的文件test2,成功!
[xz@localhost ~]$ ls -lR /mnt/
/mnt/:
total 0
drwxrwxrwt. 2 xz xz 19 Dec 28 11:38 dir

/mnt/dir:
total 0
-rw-rw-r--. 1 xz xz 0 Dec 28 11:18 test3
[xz@localhost ~]$ 

例2chmod g+s 目录地址 ,使目录下建立的文件的主组与目录相同。

[zj@localhost ~]$ touch /mnt/dir/test1        ##用普通用户zj在dir目录下创建文件test1
[zj@localhost ~]$ ls -lR /mnt/                ##查看目录和文件的权限
/mnt/:
total 0
drwxrwxrwt. 2 xz xz 32 Dec 28 11:46 dir

/mnt/dir:
total 0
-rw-rw-r--. 1 zj zj 0 Dec 28 11:46 test1     ##发现test1的所有者和所在组均为zj
-rw-rw-r--. 1 xz xz 0 Dec 28 11:18 test3
[zj@localhost ~]$ su - root
Password: 
[root@localhost ~]# chmod g+s /mnt/dir/     ##给目录dir增加特殊权限s
[root@localhost ~]# ls -ld /mnt/dir/        ##查看目录的权限
drwxrwsrwt. 2 xz xz 32 Dec 28 11:46 /mnt/dir/
[root@localhost ~]# logout
[zj@localhost ~]$ touch /mnt/dir/test2      ##用普通用户zj在dir目录下创建文件test2
[zj@localhost ~]$ ls -lR /mnt/              ##查看目录和文件的权限
/mnt/:
total 0
drwxrwsrwt. 2 xz xz 45 Dec 28 11:50 dir

/mnt/dir:
total 0
-rw-rw-r--. 1 zj zj 0 Dec 28 11:46 test1
-rw-rw-r--. 1 zj xz 0 Dec 28 11:50 test2   ##test2的所在组为xz
-rw-rw-r--. 1 xz xz 0 Dec 28 11:18 test3
[zj@localhost ~]$ 

设定权限除了限制文件的使用者,还可以限制命令的使用者(命令也是一种特殊的文件)。
例3:将命令cat修改为程序所有者调用。

watch -n 1 ps ax -o user,group,comm | grep cat   ##监视调用cat命令的进程
[zj@localhost Desktop]$ cat                      ##执行cat命令

监视页面显示运行时文件的user是调用该命令的用户zj。
在这里插入图片描述

[zj@localhost Desktop]$ ls -l /usr/bin/cat     ##查看cat命令的权限
-rwxr-xr-x. 1 root root 51856 Jan 11  2019 /usr/bin/cat
[zj@localhost Desktop]$ su - root
Password: 
[root@localhost ~]# chmod u+s /bin/cat         ##给cat命令的user增加特殊权限s
[root@localhost ~]# ls -l /bin/cat
-rwsr-xr-x. 1 root root 51856 Jan 11  2019 /bin/cat
[root@localhost ~]# logout
[zj@localhost Desktop]$ cat                    ##执行cat命令

监视页面显示运行命令时cat的user是命令的所有者root。
在这里插入图片描述
例4:将命令cat修改为程序所在组调用。

[zj@localhost Desktop]$ su - root
Password: 
[root@localhost ~]# chmod g+s /bin/cat    ##给cat命令的group增加特殊权限s
[root@localhost ~]# ls -l /bin/cat
-rwxr-sr-x. 1 root root 51856 Jan 11  2019 /bin/cat
[root@localhost ~]# logout
[zj@localhost Desktop]$ cat               ##执行cat命令

监视器显示运行命令时cat的group是命令的所在组root。
在这里插入图片描述

ACL-文件访问控制列表

上述对权限的控制都是分类控制用户对文件的使用权,若存在特殊用户与其余用户的权限均不同,可使用ACL。

可以使用命令getfacl 文件地址查看某个文件/目录对应的用户的权限。

[zj@localhost Desktop]$ watch -n 1 getfacl /mnt/dir/test1

在这里插入图片描述
假设用户xz拥有对此文件的r、w、x功能,那么对于文件test1,xz就是一个特殊用户。要实现此功能,可以使用setfacl -m 命令。

[zj@localhost Desktop]$ su - root
Password: 
[root@localhost ~]# setfacl -m u:xz:rwx /mnt/dir/test
[root@localhost ~]# ls -l /mnt/dir/test1
-rw-rwxr--+ 1 zj zj 0 Dec 28 11:46 /mnt/dir/test1   ##权限末尾由.变为+号

此时,监控器中增加了特殊用户xz对文件test1的权限。
在这里插入图片描述
若要删除该用户对test1的权限,可以使用命令setfacl -x

[root@localhost ~]# setfacl -x u:xz /mnt/dir/test1
[root@localhost ~]# ls -l /mnt/dir/test1
-rw-rw-r--+ 1 zj zj 0 Dec 28 11:46 /mnt/dir/test1

这时,监控器中的xz用户自动消失,但这个特殊权限并没有关闭。若要彻底关闭这个功能,可以使用命令setfacl -b

[root@localhost ~]# setfacl -b /mnt/dir/test1
[root@localhost ~]# ls -l /mnt/dir/test1
-rw-rw-r--. 1 zj zj 0 Dec 28 11:46 /mnt/dir/test1
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!