1、权限管理概述

Linux中通过r、w、x共3种权限控制系统与保护系统,组成9位权限

Linux权限体系中还有3位特殊权限,组合起来共12位权限

2、Linux权限计算

1)rwx权限含义

r   read,是否可读
w   write,是否可写
x   execute,是否可执行(一般是脚本文件、命令)

2)9位权限

Linux中任何一个文件或目录与用户的关系有3种:

文件/目录与用户的关系含义
所有者(属主)这个文件或目录属于某个用户(所有者)。你自己
用户组(家庭)(属组)这个文件或目录属于某个用户组。家人
其他人(陌生人)这个文件或目录不属于某个用户,也不属于这个用户组。隔壁老王

3、权限计算

权限与数字的对应关系

r:4 w:2 x:1 没有权限(-):0

例如:

[root@linux-87-01 ~]# ll 1.txt 
-rw-r--r-- 1 root root 0 May  8 22:00 1.txt
[root@linux-87-01 ~]# 

通过换算知道该文件权限为:644(rw-r–r–,每3位为一组相加。rw-:4+2+0=6,r–:4+0+0=4)

4、修改权限

chmod命令:change mode,使用数字或字母形式修改权限

chown命令:change owner,修改文件所有者、用户组。

选项:-R,递归修改

案例1:修改1.txt权限为755

[root@linux-87-01 ~]# chmod 755 1.txt

案例2:修改1.txt文件所有者和用户组为oldboy

[root@linux-87-01 ~]# ll 1.txt 
-rwxr-xr-x 1 root root 0 May  8 22:00 1.txt
[root@linux-87-01 ~]# chown oldboy.oldboy 1.txt 
[root@linux-87-01 ~]# ll 1.txt 
-rwxr-xr-x 1 oldboy oldboy 0 May  8 22:00 1.txt
[root@linux-87-01 ~]# 

基于字母形式修改权限:

案例3:以字母形式修改1.txt的权限为644

[root@linux-87-01 ~]# chmod u=rw,g=r,o=r 1.txt

u:所有者 g:用户组,o:其他人

或者:

[root@linux-87-01 ~]# chmod u+rw,g+r,o+r 1.txt 

案例4:给/etc/rc.d/rc.local(所有位置)添加执行权限

有4种写法:

[root@linux-87-01 ~]# chmod u+x,g+x,o+x /etc/rc.d/rc.local 
[root@linux-87-01 ~]# chmod ugo+x /etc/rc.d/rc.local  
[root@linux-87-01 ~]# chmod a+x /etc/rc.d/rc.local
[root@linux-87-01 ~]# chmod +x /etc/rc.d/rc.local

建议使用最后一种。

5、权限与文件、目录

5.1 概述

5.2 测试文件权限

#创建/oldboy-mode
[root@linux-87-01 ~]# mkdir /oldboy-mode
[root@linux-87-01 ~]# cd /oldboy-mode
[root@linux-87-01 oldboy-mode]#
#创建oldboy.sh文件,并修改属主、属组为oldboy
[root@linux-87-01 oldboy-mode]# echo 'hostname' > oldboy.sh
[root@linux-87-01 oldboy-mode]# chown oldboy.oldboy  oldboy.sh
#添加可执行权限
[root@linux-87-01 oldboy-mode]# chmod +x oldboy.sh
#测试写权限(切换到oldboy用户)
[oldboy@linux-87-01 oldboy-mode]# echo pwd >> oldboy.sh 
#测试执行权限(事先切换到oldboy用户)
[oldboy@linux-87-01 oldboy-mode]$ ./oldboy.sh 
linux-87-01
/oldboy-mode
[oldboy@linux-87-01 oldboy-mode]$ 

核心:对于文件来说,只有w权限不够,需要有r权限配合(rw)

如果文件只有w权限,只能通过追加方式写入,如果使用vi/vim写入则会清空文件内容只保留最新的(:wq!)

5.3 目录权限

1)目录只有r权限

[root@linux-87-01 oldboy-mode]# chmod u=r /oldboy-mode/
[root@linux-87-01 oldboy-mode]# chown oldboy.oldboy /oldboy-mode/
[root@linux-87-01 oldboy-mode]# ll -d /oldboy-mode/
dr--r-xr-x 2 oldboy oldboy 23 May  8 22:36 /oldboy-mode/
[root@linux-87-01 oldboy-mode]# 

看看可不可以使用ll命令列出目录信息

[oldboy@linux-87-01 ~]$ ll  /oldboy-mode/
ls: cannot access /oldboy-mode/oldboy.sh: Permission denied
total 0
-????????? ? ? ? ?            ? oldboy.sh
[oldboy@linux-87-01 ~]$ 

显然会有问题。目录r权限要配合x权限使用:

[root@linux-87-01 ~]# chmod u=rx /oldboy-mode/
#再切换到oldboy用户
[oldboy@linux-87-01 ~]$ ll  /oldboy-mode/
total 4
-rwxr-xr-x 1 oldboy oldboy 13 May  8 22:40 oldboy.sh
[oldboy@linux-87-01 ~]$ 

核心:

目录的r权限查看目录下的内容,如果只有r权限,那么目录下文件的属性信息无法查看,会提示?,目录的r权限要配合x权限使用。

对于目录的x权限表示是否能够进入目录权限,是否能查看与修改目录下文件属性信息权限。

目录没有w权限:

[oldboy@linux-87-01 ~]$ ll -d /oldboy-mode/
dr-xr-xr-x 2 oldboy oldboy 23 May  8 22:36 /oldboy-mode/
[oldboy@linux-87-01 ~]$ touch /oldboy-mode/1.txt
touch: cannot touch ‘/oldboy-mode/1.txt’: Permission denied
[oldboy@linux-87-01 ~]$ 

目录有w权限,没有x权限:

[root@linux-87-01 ~]# chmod u=rw /oldboy-mode/
[oldboy@linux-87-01 ~]$ touch /oldboy-mode/1.txt
touch: cannot touch ‘/oldboy-mode/1.txt’: Permission denied
[oldboy@linux-87-01 ~]$ 

无法创建文件。

所以,目录w权限,要配合x权限使用。

总结:

1)文件:w要配合r使用,x要配合r使用

2)目录:r要配合x使用,w要配合x使用

因此,普通文件权限一般是644,命令、脚本:755目录权限一般是:755

6、删除文件要什么权限?

删除文件,跟目录权限有关(目录有wx权限即可)

查看文件内容              文件要有r权限
编辑或修改文件             文件要有rw权限
执行脚本/命令             文件要有rx权限

查看目录内容              目录要有rx权限

创建、删除文件            文件所在的目录要有rwx权限
重命名                   文件所在的目录要有rwx权限

7、系统默认权限

Linux通过umask命令控制文件和目录的默认权限

root用户系统默认的umask:

[root@linux-87-01 ~]# umask 
0022
[root@linux-87-01 ~]#

普通用户默认的umask:

[oldboy@linux-87-01 ~]$ umask 
0002
[oldboy@linux-87-01 ~]$

一般情况下,文件最大权限是666(不考虑脚本、命令),目录最大777

文件或目录最大权限减去umask的值,文件umask如果某一位是奇数,那么这一位需要减去umask的值后,这一位要加1。目录的不需加1。

文件默认权限:

   666
  -022
  -------
   644

目录默认权限:

   777
  -022
  -----
   755

如果umask是0012,那么文件默认权限是:666-012=654(但是umask有1位是奇数,所以结果要加1),所以是664。目录则是:777-012=765。(目录的不用加1)

修改umask:umask 数值。比如:umask 0012

要永久修改,则修改/etc/profile文件

8、权限控制与系统安全

(1)概述

通过权限控制让系统安全:

搭建网站来说,服务器权限的设置原则:最小化原则,既要保证网站可以正常访问,也要保证网站安全。

推荐网站的权限配置:

文件:644 root root

目录:755 root root

网站在运行的时候需要的用户,这个用户不推荐是root,推荐使用虚拟用户

(2)单台机器

假设,网站运行的时候是www用户,网站程序代码目录是/app/code/www目录,那如何设置权限?

#1、网站目录:/app/code/www
[root@linux-87-01 ~]# useradd -M -s /sbin/nologin www
[root@linux-87-01 ~]# mkdir -p /app/code/www/upload
#文件和目录所有者、用户组:root  root
#文件和目录权限分别是:644 755

#设置属主、属组及权限
[root@linux-87-01 ~]# find /app/code/www/ -type f | xargs chmod 644
[root@linux-87-01 ~]# find /app/code/www/ -type d | xargs chmod 755
[root@linux-87-01 ~]# chown -R root.root /app/code/www

#2、用户上传的目录:/app/code/www/upload
#该目录属主、属组为:www   www,文件、目录权限不变还是644、755
[root@linux-87-01 ~]# chown -R www.www /app/code/www/upload

#3、控制用户上传指定类型的文件
#4、只能上传,不能执行

(3)集群

根据具体情况设置文件目录权限

9、特殊权限

前面说的都是rwx普通权限位。涉及所有者、用户组、其他人共9位。

下面查看一下/tmp目录、/bin/passwd文件的权限:

发现,除了r、w、x权限外,还有s、t权限,这就是特殊权限。

属主、属组都可以有s权限,分别叫suid、sgid

其他人有t权限:t,就sbit

所以,共有3种特殊权限。

加上普通权限9位,共12位权限。

suid:set uid,命令、脚本的u(所有者)位置上有s或S的时候,其他人运行该命令、脚本的时候临时拥有该所有者的权限
sgid:set gid,命令、脚本的g(用户组)位置上有s或S的时候,其他人运行该命令、脚本的时候临时拥有该用户组的权限
sbit:sticky  bit,也叫粘滞位,目录的o(其他人)位置上有t的时候,每个用户可以在这个目录下创建内容,但是,每个用户只能管理自己的文件

s与S:如果原来有x权限,则显示s,没有则S。

t与T:如果原来有x权限,则显示t,没有则T。

suid对应的数字是4、sgid是2,sbit是1。

特殊权限的设置:

chmod  u+s  文件
chmod  g+s  文件
chmod  o+t  目录

权限的数字形式表示;

[root@linux-87-01 ~]# ll 1.txt 
-rw-r--r-- 1 root oldboy 0 May  9 22:26 1.txt
[root@linux-87-01 ~]#

该文件没有特殊权限,其权限用数字表示为:644

下面,加上特殊权限之后:

[root@linux-87-01 ~]# chmod 4644 1.txt 
[root@linux-87-01 ~]# ll 1.txt 
-rwSr--r-- 1 root oldboy 0 May  9 22:26 1.txt
[root@linux-87-01 ~]# 

由此可见,用数字表示4644,则第一位数字表示特殊权限。

[root@linux-87-01 ~]# chmod 6644 1.txt 
[root@linux-87-01 ~]# ll 1.txt 
-rwSr-Sr-- 1 root oldboy 0 May  9 22:26 1.txt
[root@linux-87-01 ~]# 

此时的权限为:6644

有没有7644呢?

[root@linux-87-01 ~]# chmod 7644 1.txt 
[root@linux-87-01 ~]# ll 1.txt 
-rwSr-Sr-T 1 root oldboy 0 May  9 22:26 1.txt
[root@linux-87-01 ~]# 

文件也有粘滞位权限:

取消1.txt文件的t权限:

[root@linux-87-01 ~]# chmod o-t 1.txt 
[root@linux-87-01 ~]# stat 1.txt 
  File: ‘1.txt’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 33583382    Links: 1
Access: (6644/-rwSr-Sr--)  Uid: (    0/    root)   Gid: ( 1315/  oldboy)
Access: 2023-05-09 22:26:29.683816614 +0800
Modify: 2023-05-09 22:26:29.683816614 +0800
Change: 2023-05-09 22:35:46.196983623 +0800
 Birth: -
[root@linux-87-01 ~]# 

一般地,粘滞位只出现在/tmp目录本身,其他目录(文件)不建议使用t权限。

10、隐藏属性

Linux系统中,文件除了有普通权限和特殊权限外,还有隐藏属性(特殊属性)

lsattr:查看隐藏属性

chattr:设置隐藏属性,命令格式:chattr [+|-参数] 文件|目录

参数:
i   无法修改文件,也不能删除。如果目录设置了该参数,则仅能修改其中的子文件内容,而不能新建或删除文件
a   只能追加内容,文件无法修改、覆盖内容,同样也不能删除

默认情况下,文件没有隐藏属性:

[root@linux-87-01 ~]# lsattr  1.txt 
---------------- 1.txt
[root@linux-87-01 ~]#

添加i属性:

[root@linux-87-01 ~]# chattr +i 1.txt
[root@linux-87-01 ~]# rm -f 1.txt 
rm: cannot remove ‘1.txt’: Operation not permitted
[root@linux-87-01 ~]# lsattr 1.txt 
----i----------- 1.txt
[root@linux-87-01 ~]# 

文件添加了i权限后,无法删除

删除i属性:

[root@linux-87-01 ~]# chattr -i 1.txt

练习:取出stat /etc/passwd的0644这四位权限

[root@linux-87-01 ~]# stat /etc/passwd  | awk -F '[(/]' 'NR==4{print $2}'
0644
[root@linux-87-01 ~]# 

11、acl权限(文件控制列表)

前面所说的一般权限、特殊权限、隐藏权限都有一个共性—权限针对某一类用户设置,能够针对多个用户同时生效。如果希望对某个指定的用户进行单独的权限限制,这时候就需要使用文件的访问控制列表(ACL)

11.1 setfacl命令

用于管理文件的ACL权限规则,全称:set file ACL

语法格式:setfacl [参数] 文件

参数:
-m:修改权限
-M:从文件中读取权限
-x:删除某个权限
-b:删除全部权限
-R:递归目录

例如:为普通用户test单独设置/root/目录权限

setfacl -Rm u:test  /root

查看文件是否设置了acl,如果文件权限的最后一个.变成了+,就表示设置了acl。

11.2 getfacl命令

getfacl:get file ACL,查看文件的acl权限规则

例如:getfacl /root

11.3 针对用户组设置

例如:对文件/etc/fstab设置test组有读写权限
setfacl  -m g:test:rw /etc/fstab

清空acl:例如清空/etc/fstab文件的test组acl

setfacl -x g:test /etc/fstab

11.4 acl规则备份与恢复

比如:备份恢复 home的acl

cd  /home
getfacl -R home > backup.acl  #getfacl备份目录权限目录不能使用绝对路径
setfacl  --restore backup.acl

分类: Linux系统基础