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