Linux文件权限管理

文件权限的管理

Linux用户解析

UGO权限的概述

U表示user(用户);G表示group(组);O表示other(其他人)

UGO权限的作用主要是控制用户对资源的访问,如使用某个程序、查看某个文档等;例如不开通VIP就无法查看VIP的影片;但这对于文件来说可能非VIP为1,而VIP为2,两者之间只相差一个数字

权限的对象

属主:U(user);属组:g(group);其他人:o(other);所有人:a(u+g+o=all)

Linux的三种权限类型

rwx可读可写可执行

可读:r=4;可写:w=2;可执行(也可以说是可运行):x=1

记忆方式:可读read;可写write;可执行exe

查看权限信息

语法:ls -l或是ll 文件路径;如下,查看当前目录下file1.txt的权限信息

[root@localhost ~]#ll file1.txt

image-20240909154436312

如上图,"-rwxr-x—.“第一个”-“表示文件类型,后面九个参数每三个一组,分别表示用户权限、组成员权限和其他人权限;如该图,用户权限为"rwx"可读可写可执行、组成员权限为"r-x"可读不可写可执行、其他人对该文件无权限;而在末尾的那一个”."则表示

如何设置基本权限

更改文件权限

使用ugo更改权限

几个在更改权限中需要使用的符号:u用户,g组,o其他,r读,w写,x执行

语法:chmod 对象(u/g/o/a)赋值符(+/-/=)权限类型(r/w/x) 文件/目录

示例:新建file1.txt,先使用"ll"进行查看file1.txt的权限;

然后在file1.txt内编写一段程序,因为刚刚创建的file1.txt文件对任何人都是没有执行权的,所以这个程序自然对任何人都不起作用

接下来我们要使用chmod命令为属主增加执行权,以更改file1.txt文件变为可执行权限,并且一般拥有执行权限的文件都会变绿;流程如下

[root@localhost ~]#touch file1.txt		//新建file1.txt文件保证实验环境
[root@localhost ~]#ll file1.txt		//查看现在的file1.txt权限

image-20240910132550428

[root@localhost ~]#vim file1.txt		//编写一段简单的程序
echo "hello 123"
read -p "请输入你的名字" name
echo "你好&name"
[root@localhost ~]#chmod u+x file1.txt		//为file1.txt的属主增加执行权
[root@localhost ~]#ll file1.txt		//再次查看file1.txt权限内容,发现属主权限已经从rw-更改为rwx
[root@localhost ~]#./file1.txt		//开始执行file1.txt文件,其中"./"表示当前目录下

image-20240910134104422

更多的更改权限的练习,如下

例1:

[root@localhost ~]#chmod a=- file1.txt		//使得全部人都没有权限

Question:如果设置了"a=-"即全部人都没有权限,那么root用户还能执行或者是查看吗

Answer:root"上帝"用户,当然还是可以对file1.txt这个文件进行修改的,只不过所有的权限对象(u、g、o)都没有x(执行权),自然而然地就执行不了这个文件了,我们可以使用cat或是ll命令来验证;并且还同时发现ll查看权限时,file1.txt文件的颜色有变为白色了

image-20240910135919791

例2:

[root@localhost ~]#chmod ug=rw,o=r file1.txt		//配置属主和属组可以读写,其他人只读
使用数字来更改权限

三种数字代表的权限:4读2写1执行;如下,将file1.txt的权限设置为属主可读可写,属组可读,其他人执行

[root@localhost ~]#chmod 644 file.txt

image-20240910162715156

更改文件的属主和属组

语法:chown 用户名.组名 文件;如下

[root@localhost ~]#chown alice.hr file1.txt		//同时更改属主和属组分别为alice和hr
[root@localhost ~]#chown alice file1.txt		//只更改属主
[root@localhost ~]#chown .hr file1.txt			//只更改属组,与更改属主相比多加了一个"."

实验:原本file1.txt文件的属主和属组都是root,我们使用zhangsan(普通用户)去访问file1.txt,会发现zhangsan对file1.txt什么事情都干不了

接下来使用chown命令将file1.txt文件的属主和属组都更改为zhangsan

再次查看其权限和使用zhangsan用户去访问file.txt,将会发现zhangsan身为这个用户的属主,将拥有除了root以外最高的权限

[root@localhost ~]#chown zhangsan.zhangsan file1.txt		//更改file1.txt的属主和属组为zhangsan和zhangsan

image-20240910165926653

在当前目录下查看当前目录

语法:在"ll file1.txt"的基础下加上选项-d

[root@localhost ~]#ll dir -d

image-20240910171218689

实例:如在dir目录下有f1、f2和f3三个文件,如果直接更改dir的文件的属主和属组是否可以使得f1、f2和f3的权限一并更改呢?我们来实践一下,如下图

经过实践,很明显是不行的;将dir的属主和属组更改后,其内的文件的属主和属组并没有与dir目录进行同步修改

image-20240910172351533

那么解决的办法就是在创建修改dir目录的属主和属组时增加一个选项"-R",表示递归,即目录下的所有内容都一并修改的;如下

image-20240910173749738

在更改属组的时候,我们还可以使用另外一个命令;使用chgrp命令

语法:chgrp 组名 文件;同样的该命令也同样存在的递归选项"-R"

UGO设置权限及实验

实验操作

需要一个文件file10.txt,属主是user100,有读写执行的权限,属组是jishuzu(user200),拥有读取的权限;其他人(user300)无权限;操作如下:

[root@localhost ~]#touch file10.txt
[root@localhost ~]#chmod 740 file10.txt
[root@localhost ~]#chown user100.jishuzu file10.txt

image-20240910183313132

实验验证

使用user100访问文件、写入文件和执行文件(图一);使用jishuzu成员访问文件和尝试其他操作(图二);使用其他用户(user300),尝试这三种操作

图一

image-20240910183422506

图二

image-20240910183609379

图三

image-20240910183803196

ACL基本权限及实验

ACL和UGO的区别

问题:使用chmod能够针对独立用户设置文件不同权限吗?即针对一个用户设置他自己的权限

因为存在了这个问题,所以就需要ACL来解决这个问题

所以ACL和UGO最主要的区别是:ACL设置不同的用户有不同的基本权限,即对象的数量不同;UGO在设置权限时只能针对一个用户,一个组和其他人

配置ACL

添加ACL权限(选项-m)

语法:setfacl -m u/g:用户名:权限 文件对象;u/g中表示u代表着针对用户添加权限,而g则是代表着针对组添加权限;如下为普通用户alice添加ACL的/home/test.txt的rw权限,“-m"起到了关键性的作用,”-m"表示添加权限

[root@localhost ~]#setfacl -m u:alice:rw /home/test.txt
ACL实验

在/home目录下创建test.txt,使用ll查看权限后,更改其UGP权限为740

使用getfacl查看test.txt的额外权限"getfacl /home/test.txt"

然后更改/home/test.txt针对用户alice的ACL权限为rw,针对用户jack的ACL权限为无,针对hr组的权限为可读可执行

在使用setfcal和ll命令观察变化

[root@localhost ~]#touch /home/test.txt		//创建文件
[root@localhost ~]#chmod 740 /hoem/test.txt		//设置文件的UGO权限
[root@localhost ~]#ll /home/test.txt		//查看文件的UGO权限
[root@localhost ~]#getfacl /home/test.txt		//查看test.txt文件的ACL权限

image-20240910191341918

[root@localhost ~]#setfacl -m u:alice:rw /home/test.txt
[root@localhost ~]#setfacl -m u:jack:- /home/test.txt
[root@localhost ~]#setfacl -m g:hr:r-x /home/test.txt
[root@localhost ~]#getfacl /home/test.txt		//验证查看
[root@localhost ~]#ll /home/test.txt		//观察变化

image-20240910192415354

image-20240910192757919

如上图,使用getfacl查看,发现多了几行;使用ll查看,发现三个权限之后增添了一个"+",说明这个文件(/home/test.txt)已经添加了ACL权限,单纯的使用ll已经看不清这个文件的内容了,必须使用getfacl才能看清

验证:切换用户对/home/test.txt进行修改;备注:user02属于hr组

image-20240910193846011

image-20240910193929258

image-20240910194256086

ACL设置属主和属组的权限

即不指定用户或组

设置属主:

[root@localhost ~]#setfacl -m u::rwx /home/test.txt

设置属组:

[root@localhost ~]#setfacl -m g::rwx /home/test.txt

设置其他人

[root@localhost ~]#setfacl -m o::rwx /home/test.txt

可以使用getfacl或ll查询

删除ACL(选项-x和-b)

其实删除ACL权限就和增加ACL权限相差一个选项而已,但删除ACL权限分为两种,“-x"删除某一个特定用户或组,”-b"直接删除设置的全部ACL权限;如下

删除hr组配置的所有ACL权限

[root@localhost ~]#setfacl -x g:hr /home/test.txt
[root@localhost ~]#getfacl /home/test.txt		//查看验证,发现group:hr:r-x已经被移除

image-20240910200713186

删除所有的ACL的权限,将会只保留UGO权限

[root@localhost ~]#setfacl -b /home/test.txt
[root@localhost ~]#getfacl /home/test.txt

image-20240910201738766

特殊权限

高级权限类型

特殊位suid:suid针对会针对文件/程序时,具备临时获得属主的权限;sgid安全组标志符;stick粘连符

这里只讲解suid,因为sgid和stick一般情况下用不到

设置语法:chmod u+s 程序的文件路径

问题:下面的操作,为什么会失败?

[root@localhost ~]#touch /root/file1.txt
[root@localhost ~]#su alice
[alice@localhost ~]$cat /root/file1.txt
cat:/root/file1.txt:权限不够

image-20240910204255218

分析:是因为使用cat时,root和alice(普通用户)运行的权限不同;

root /usr/bin/cat(root) /root/file1.txt;alice /usr/bin/cat(alice) /root/file1.txt

这样最大问题就是普通用户查看不了root用户的文件

所以,suid就应运而生了;我们可以通过设置suid,使普通用户通过suid临时提权查看root用户指定的文件;即为cat程序临时加上suid权限

[root@localhost ~]#ll /usr/bin/cat		//先查看cat程序与待会设置好suid做对比(图一)
[root@localhost ~]#chmod u+s /usr/bin/cat		//为用户类型加上suid
[root@localhost ~]#ll /usr/bin/cat		//观察与设置suid之前ll命令输出有什么不同(图二)

image-20240910205743108

可以看到原本属主的rwx变化为了rws,就说明这个程序文件设置了suid,使得普通用户也可以使用这个程序(但还是不建议在实际生产环境中这么做,这使得了计算机的安全系数大大地降低)

如下图,可以看到alice作为普通用户成功地访问到了root用户下的文件,并且没有报错

image-20240910205939724

查找程序运行文件

语法:which 运行文件的命令

上述例子中我们是以cat程序为例,那么在设置suid加上权限的时候,我们又怎么知道程序运行的文件在哪里呢?使用which命令可以很好地解决这个问题;如下我们想查看ls命令的运行文件在哪里

[root@localhost ~]#which ls

image-20240910205643885

文件属性(chattr)并不需要花太多时间

用途:chattr常常用于锁定某个文件,换句话讲就是拒绝所有人去修改(包括root)

语法:chattr +/- 文件属性 文件路径

文件属性有很多种,这里就只讲部分几个

i(immutable)如果在文件上启用i属性,就会导致我们不能更改这个文件、重命名或删除(包括root用户)

[root@localhost ~]#chattr +i file1.txt
[root@localhost ~]#lsattr file1.txt		//可以查看file1.txt被设置了哪些文件属性

image-20240910211424280

我们可以使用root尝试着删除掉file1.txt,结果当然是删除不掉的;如下

image-20240910211641994

还有很多年文件属性,配置的方法都是一样的

大写"S"(Synchronus),这个属性使文件的变更或更改同步并保存到磁盘,即改了什么,就保存什么,但磁盘书写的速度非常的慢

“j”(journaling),日志属性,这个属性会使文件数据,先保存到日志上,然后再去写入文件,即干什么,写什么,并且写的非常的细节,但就是因为这样才对设备的要求高

“a”(append),这个属性一旦设置上去,任何人都只能在该文件上追加属性,即可以写入新的东西,但不能动以前的东西

“c”(compressed),启用这个属性后,文件会在磁盘上自动压缩

进程(权限)掩码umask

umask可以影响着每一个文件应该是怎么样的权限

每新建一个文件或目录时,系统分配给它们的默认权限会受到umask的影响;其中,具象化的了解就是umask是要被减去的值;并且,因为有了umask的存在,会导致root成为整个系统中最大权限的存在

umask实例一

查看umask值,了解创建目录或普通文件后的默认权限设置是怎么产生的

我们可以使用umask命令来查看umask值

image-20240910213305732

从上图中看到系统给我们设置的umask值为0022

而通过下图可以看到,系统默认设置的目录权限为755,而文件默认设置的权限为644

image-20240910213753478

默认权限的由来

由于系统最高权限以数字的方式表示是777,前面也提到过了umask值是用来被减的;

我们使用0777-0022得到了0755就是目录的默认权限;

因为文件是基于目录存放的,所以在计算默认权限的时候,也是基于0755来计算的

并且由于目录是需要被打开的,所以目录是必须需要执行权的,而执行权对于文件来讲就是非必要的

所以文件的默认权限是基于目录的,并且还要去掉执行权,即在数字上减1(0755-0111=0644)

如下,使用umask命令可以更改系统默认的umask值,更改完后,我们重新创建一个文件和目录,会发现与之前相比,默认的权限完全不一样了

但在生产环境下我们并不推荐这么做,因为这样会使得文件对于其他人来说较高,然安全隐患加重,我们在改为umask=0000后,一定要更改回umask=0022

image-20240910215537704

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值