Linux 权限管理基础

一、权限概述

1)权限的基本概念

在多用户计算机系统的管理中,权限是指某个特定的用户具有特定的系统资源使用权利。

linux 中分别有读、写、执行权限:

权限针对文件权限针对目录
读r表示可以查看文件内容;cat表示可以(ls)查看目录中存在的文件名称
写w表示可以更改文件的内容;vim 修改,保存退出表示是否可以删除目录中的子文件或者新建子目录(rm/touch/mkdir)
执行x表示是否可以开启文件当中记录的程序,一般指二进制文件(.sh) => 绿色表示是否可以进入目录中(cd)

注:一般给予目录读权限时,也将会给其执行权限,属于“套餐”组合

可读权限 read => r(简写),可写权限 write => w(简写),可执行权限 excute => x(简写)

2)为什么要设置权限

① 服务器中的数据价值体现,不能随意纂改

② 员工的工作职责和分工不同,内部管理的需要

③ 应对来自外部的攻击(安全)

3)Linux用户身份类别

Linux 系统一般将文件权限分为3 类:

read(可读)write(可写)execute(执行)

问:谁对文件有读,写,执行的权限呢?
答:针对三大类用户,属主User、属组Group、其他Other

4)User 文件拥有者

文件的拥有者:默认情况下,谁创建了这个文件谁就是文件的拥有者。文件的拥有者可以进行更改并不是一成不变的。

[root@hsforpyp ~]# touch linux.txt
如上情况,root 用户就是 linux.txt 文件的拥有者
12

5)Group 文件所属组内用户

group所属组内用户代表与文件的所属组相同的组内用户。

比如,root与alex、egon都同属于一个team的用户组,去掉文件拥有者root,alex和egon就是这个文件的组内用户。

6)Other 其他用户

other其他用户代表这些人既不是文件的拥有者,也不是文件所属组内的用户,我们把这些人就称之为other其他用户。

7)特殊用户 root

在Linux操作系统中,root拥有最高权限(针对所有文件),所以权限设置对root账号是没有效果。

在Linux系统中,三大类用户也可以拥有简写形式user(u)、group(g)、other(o)

二、普通权限管理

1)ls -l命令查看文件权限

基本语法:

# ls -l 或 ll
1

备注:ll命令是红帽以及CentOS系统特有的一个简写命令,在其他操作系统中可能并不支持,可通过alias命令设置别名。

filepermission

2)文件类型及权限解析

linuxFilePermission

① 文件类型

Linux一共有7种文件类型,分别如下:
-:普通文件
d:目录文件
l: 软链接(类似Windows的快捷方式)

(下面四种是特殊文件)
b:block,块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如猫(上网猫)等串口设备)
s:套接口文件/数据接口文件(例如启动一个MySql服务器时会产生一个mysql.sock文件)

② SElinux

SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。

细心的小伙伴会发现上图结尾有一个.,该点表示此文件带有“SELinux的安全上下文”,RHEL8默认是开启SELinux的,所以会有这个点,当我们关闭SELinux后再创建文件,此处就不会有这个点了,但以前的文件还是会带有这个点(此时SElinux不起作用)。

当SELinux结合其他访问控制措施如ACL时,.会被+字符所覆盖。

3)文件或文件夹权限设置(字母)

基本语法:ch = change mod

# chmod [选项] 权限设置 文件或目录的名称
选项说明:
-R :递归设置,针对文件夹(目录)
123

三方面:
第一个:确认要给哪个身份设置权限,u、g、o、ugo(a)
第二个:确认是添加权限(+)、删除权限(-),还是赋予权限(=)
第三个:确认给这个用户针对这个文件或文件夹设置什么样的权限,r、w、x

案例:给readme.txt文件的拥有者,增加一个可执行权限

# chmod u+x readme.txt
1

案例:把readme.txt文件的拥有者的可执行权限去除

# chmod u-x readme.txt
1

案例:为readme.txt中的所属组内用户赋予rw权限

# chmod g=rw readme.txt
1

案例:给shop目录及其内部的文件 统一添加w可写权限

# chmod -R ugo+w shop
或
# chomd -R a+w shop
123

案例:给shop目录设置权限,要求拥有者rwx,组内用户r-x,其他用户r-x

# chmod -R u=rwx,g=r-x,o=r-x shop
1

4)文件或文件夹权限设置(数字)

经常会在技术网站上看到类似于# chmod 777 a.txt 这样的命令,这种形式称之为数字形式权限

文件权限与数字的对应关系,我们会发现没有7这个数字

权限对应数字意义
r4可读
w2可写
x1可执行
0没有权限

现在有些小伙伴可能会察觉到 1+2+4=7,没错,的确7就是r+w+x累加的结果。

777 :

第一个数字7,代表文件拥有者权限

第二个数字7,代表文件所属组内用户权限

第三个数字7,代表其他用户权限

rwx = 4 + 2 + 1 = 7

rw = 4 + 2 = 6

rx = 4 + 1 = 5

案例:给readme.txt设置权限,文件的拥有者rwx,组内用户rw,其他用户r

rwx = 7
rw = 6
r = 4
# chmod 764 readme.txt
1234

案例:给shop文件夹设置777权限

# chmod -R 777 shop
1

5)奇葩权限

问题:用超级管理员设置文档的权限命令是# chmod -R 731 shop,请问这个命令有没有什么不合理的地方?

答:731权限进行拆解

7 = 4 + 2 + 1 = rwx

3 = 2 + 1 = wx

1 = x

问题在权限731中的3权限,3表示写+执行权限,但是写又必须需要能打开之后才可以写,因此必须需要具备可读权限,因此此权限设置不合理。

注:实际生活中,各位小伙伴在设置权限时一定不要设置这种”奇葩权限”,一般情况下,单独出现2、4的权限数字一般都是有问题的权限。

6)特殊权限说明

在Linux 中,如果要删除一个文件,不是看文件有没有对应的权限,而是看文件所在的目录是否有写权限,如果有才可以删除(可写权限的前提是具备可 执行权限)。

/shell/readme.txt
我们想删除readme.txt文件,必须要对shell目录具有可写权限,否则文件无法删除
12

三、文件拥有者以及文件所属组设置

文件拥有者:属主

文件所属组:属组

1)文件拥有者与所属组的查看

# ls -l
或
# ll
123
linux0001

2)了解文件的拥有者与文件所属组来源

在Linux操作系统中,每个文件都是由Linux系统用户创建的。

在Linux操作系统中,每个用户都具有一个用户名称以及一个主组的概念

[root@hsforpyp ~]# su - demouser 
[demouser@hsforpyp ~]$ touch file.txt 
[demouser@hsforpyp ~]$ ll file.txt 
-rw-rw-r--. 1 demouser demouser 0 Feb 20 20:10 file.txt
1234

默认情况下,谁创建了这个文件,谁就是这个文件的属主,属主的主组就是这个文件的属组。

3)为什么需要更改文件拥有者与所属组

一个财务表格,以前由 Lily 进行负责更新撰写,她有读写权限,现在 Lily 休假了,改权限是没用的,需要把属主改成 Mike,由 Mike 接替任务。

4)文件拥有者设置

ch = change ,own = owner

# chown [选项] 新文件拥有者名称 文件名称
选项说明:
-R :代表递归修改,主要针对文件夹
123

案例:把/root/readme.txt文件的拥有者更改为hsforpyp

# chown hsforpyp /root/readme.txt
1

案例:把/root/file文件夹的拥有者更改为demouser

# chown -R demouser /root/file
1

5)文件所属组的设置

ch = change , group,chgrp

# chgrp [选项] 新文件所属组名称 文件名称
选项说明:
-R : 代表递归修改,主要针对文件夹
123

案例:把/root/readme.txt文件的所属组名称更改为hsforpyp

# chgrp hsforpyp /root/readme.txt
1

案例:把/root/file文件夹的所属组名称也更改为demouser

# chgrp -R demouser /root/file
1

6)chown修改属主与属组

基本语法:

# chown [选项] 文件拥有者名称:文件所属组名称 文件名称
或
# chown [选项] 文件拥有者名称.文件所属组名称 文件名称
选项说明:
-R : 代表递归修改,主要针对文件夹
12345

① 案例:readme.txt文件的拥有者与所属组同时更改为root

# chown root:root readme.txt
或
# chown root.root readme.txt
123

② 案例:readme.txt文件的拥有者单独更改为demouser

# chown demouser readme.txt
或
# chown demouser readme.txt
123

③ 案例:readme.txt文件的所属组单独更改为demouser

# chown :demouser readme.txt
或
# chown .demouser readme.txt
123

④ 案例:更改shop目录的拥有者以及所属组为root

# chown -R root:root shop
或
# chown -R root.root shop
123

四、Linux特殊权限位

    在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUID、SGID与SBIT的特殊权限位。 这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。

1)SUID(SetUid)

作用:SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)

/etc/shadow文件比较特殊,其权限为— — —(即000),除root外,其他人都没有权限
问:普通用户执行/usr/bin/passwd的时候需要去修改/etc/passwd和/etc/shadow等文件,这些文件除了root外,其他用户都没有写权限,但是又为了能让普通用户修改自己的密码,该怎么办呢?
答:临时让他们具有root的权限,而这个s权限就是用来完成这个特殊任务的。s权限只能应用在二进制的可执行文件上。

linuxSetUid

s所在位可能显示为大S,小s表示同时具备s权限和x可执行权限,大S表示只有s权限而没有x可执行权限
which命令可以用于查看二进制可执行文件所在位置

[hsforpyp@hsforpyp tmp]$ which passwd
/usr/bin/passwd
12

☆ 添加S位权限

# chmod u+s /usr/bin/passwd
或者
# chmod 4755 /usr/bin/passwd
123

☆ 去除S位权限

# chmod u-s /usr/bin/passwd 
或者
# chmod 0755 /usr/bin/passwd
123

2)SGID

SGID与SUID类似,主要实现以下两个功能

  • 对拥有执行权限的二进制文件 : 让执行者在命令执行瞬间临时拥有属组的权限
  • 对目录 : 在某个目录中创建的文件自动继承该目录的用户组
[root@hsforpyp ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 47128 Aug 12  2018 /usr/bin/locate
12

以 locate 命令为例,可以看到,/usr/bin/locate 文件被赋予了 SGID 的特殊权限,这就意味着,当普通用户使用 locate 命令时,该用户的所属组会直接变为 locate 命令的所属组,也就是 slocate。

☆ 添加SG位权限

# chmod -R g+s filename
或者
# chmod -R 2755 filename
123

☆ 去除SG位权限

# chmod -R g-s filename
或者
# chmod -R 0755 filename
123

3)SBIT(针对文件夹)

☆ 粘滞位(sticky bit)

主要功能:只允许文件的创建者和root用户删除文件(防止误删除权限位)

基本语法:

# chmod -R o+t 文件夹的名称
或
# chmod -R 1777 文件夹的名称
123

使用ls -l命令查看/tmp目录权限

[hsforpyp@hsforpyp tmp]$ ls -ld /tmp
drwxrwxrwt. 14 root root 4096 Feb 20 20:10 /tmp
或
[hsforpyp@hsforpyp tmp]$ ll -d /tmp
drwxrwxrwt. 14 root root 4096 Feb 20 20:10 /tmp
12345

/tmp文件夹,拥有最高权限777,比如hsforpyp创建了一个文件在此目录,demouser用户也可以对其进行删除操作,这种显然不太合适。这时,就需要使用到粘滞位。

☆ 添加粘滞位

# chmod -R o+t /tmp
或
# chmod -R 1777 /tmp
123

☆ 移除粘滞位

# chmod -R o-t /tmp
或
# chmod -R 0777 /tmp
123

五、Linux文件的隐藏属性

Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限。

1)chattr 设置文件的隐藏权限

修改文件或目录的隐藏属性,只有 root 用户可以使用

格式:

# chattr [+-=] [属性] 文件或目录名
1
参数作用
i无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S文件内容在变更后立即同步到硬盘(sync)
s彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A不再修改这个文件或目录的最后访问时间(atime)
b不再修改文件或目录的存取时间
D检查压缩文件中的错误
d使用dump命令备份时忽略本文件/目录
c默认将文件或目录进行压缩
u当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t让文件系统支持尾部合并(tail-merging)
x可以直接访问压缩文件中的内容

2)lsattr 显示文件的隐藏属性

格式:

# lsattr [选项] 文件或目录名
1
参数作用
-a后面不带文件或目录名,表示显示所有文件和目录(包括隐藏文件和目录)
-d如果目标是目录,只会列出目录本身的隐藏属性,而不会列出所含文件或子目录的隐藏属性信息
-R和 -d 恰好相反,作用于目录时,会连同子目录的隐藏信息数据也一并显示出来

六、ACL访问控制列表

1)为什么需要ACL

Linux 系统传统的权限控制方式,无非是利用 3 种身份(文件所有者,所属群组,其他用户),并分别搭配 3 种权限(读 r,写 w,访问 x)。但在实际应用中,以上这 3 种身份根本不够用。
linuxACLControl
如上图,一班的老师和同学都可以访问并修改(rwx)本班的项目方案,其他班级的同学自然不可以拥有这些权限(—),某一天,班里来了一位试听的同学,他可以访问本班的项目方案,但由于他并没有学习过以前的课程,所以无法给他修改权限,即只能赋予他r-x权限,这时,我们如何分配呢?
这种情况下,普通权限的三种身份都不符合要求,ACL 访问控制权限。

ACL,是 Access Control List的缩写,在 Linux 系统中, ACL 可实现对单一用户设定访问文件的权限。

ACL权限可以针对某个用户,也可以针对某个组。ACL优势就是让权限控制更加的精准。

2)getfacl 获取文件的ACL权限

getfacl = get file acl

基本语法:

# getfacl 文件或目录名称
1

3)setfacl 设置文件的ACL权限

setfacl = set file acl

# setfacl [选项] 文件或目录名称
|选项|功能|
|--|--|
|-m|修改acl策略,给予用户ACL权限,使用 "u:用户名:权限 文件名" 的格式;给予组ACL权限,使用"g:组名:权限 文件名" 格式。|
|-x|去掉某个用户或者某个组的权限,格式:"setfacl -x u:用户名 文件名"或"setfacl -x g:组名 文件名"|
|-b| 删除所有的acl策略,格式:"setfacl -b 文件名"|
|-R|递归设定ACL权限,格式:"setfacl -m u:用户名:权限 -R 文件名"|
1234567

案例:针对readme.txt文件给demouser设置一个可读权限

# setfacl -m u:demouser:r readme.txt	=>  针对某个用户开通ACL权限
1

案例:针对file文件夹给hsforpyp组设置一个可读可写权限rw

# setfacl -R -m g:hsforpyp:rw file	=> 	针对某个用户组开通ACL权限
1

案例:把demouser用户权限从readme.txt中移除掉

# setfacl -x u:demouser readme.txt
1

案例:把hsforpyp用户组权限从file中移除掉

# setfacl -x -R g:hsforpyp file
1

案例:把readme.txt文件中的所有ACL权限全部移除

# setfacl -b readme.txt
1

六、umask

1)什么是umask

    Windows 系统中,新建的文件和目录时通过继承上级目录的权限获得的初始权限,而 Linux 不同,它是通过使用 umask 默认权限来给所有新建的文件和目录赋予初始权限的。umask值由4个八进制数制成,分别对应着特殊权限位以及rwx普通权限。

文件(或目录)的初始权限 = 文件(或目录)的最大默认权限 – umask权限
问:如何获取umask默认权限的值?
答:直接通过umask命令

[root@hsforpyp ~]# umask
0022
[root@hsforpyp ~]# su - hsforpyp 
[hsforpyp@hsforpyp ~]$ umask
0002
12345

上述发现,root用户下,umask 默认权限为0022,普通用户下,umask 默认权限为0002。

案例:通过root用户和普通用户分别创建一个普通文件和一个目录。

[root@hsforpyp hsforpyp]# touch rootfile
[root@hsforpyp hsforpyp]# mkdir rootfloder
[root@hsforpyp hsforpyp]# su - hsforpyp 
[hsforpyp@hsforpyp ~]$ touch file
[hsforpyp@hsforpyp ~]$ mkdir floder
[hsforpyp@hsforpyp ~]$ ll
total 0
-rw-rw-r--. 1 hsforpyp hsforpyp 0 Feb 21 01:16 file
drwxrwxr-x. 2 hsforpyp hsforpyp 6 Feb 21 01:16 floder
-rw-r--r--. 1 root     root     0 Feb 21 01:15 rootfile
drwxr-xr-x. 2 root     root     6 Feb 21 01:15 rootfloder
1234567891011

通过root用户创建文件及目录初始权限值和umask值相加得到:
普通文件:0644+0022=0666
目录:0755+0022=0777
通过普通用户创建文件及目录初始权限值和umask值相加得到:
普通文件:0664+0002=0666
目录:0775+0002=0777

总结:
1.文件的最大默认权限是 666,也就是说任何用户都没有可执行权限,原因很简单,执行权限是文件的最高权限,赋予时绝对要慎重,因此绝不能在新建文件的时候就默认赋予,只能通过用户手工赋予。
2.目录的最大默认权限是 777,

2)修改umask值

☆ 临时修改(重启后失效)

# umask 421
# umask
0421
123

☆ 永久修改

① # vim /etc/profile找到以下内容,修改umask后面的值

if [ $UID -gt 199]&&[ "'id -gn'" = "'id -un'" ]; then
    umask 002
    #如果UID大于199(普通用户),则使用此umask值
else
    umask 022
    #如果UID小于199(超级用户),则使用此umask值
fi
1234567

② wq 保存退出
③ # source /etc/profile 立即生效

原创文章,作者:Zhang Miao Miao,如若转载,请注明出处:https://www.yidc.net/archives/12096