文件权限介绍
什么是权限
- 权限是用来约束用户能对系统所做的操作
- 或者说,权限是某个指定的用户具有特定的系统资源使用权力
为什么需要权限
linux
是一个多用户系统,对于每一个用户来说,个人隐私的保护十分重要,所以需要进行权限划分- 安全性:降低误删除风险、减少人为造成故障以及数据泄露等风险
- 数据隔离:不同的权限能看到、以及操作不同的数据
- 职责明确:电商场景客服只能查看投诉、无法查阅店铺收益,运营则能看到投诉以及店铺收益
权限与用户的关系
- 在
linux
系统中,权限是用来定义用户能做什么,不能做什么- 针对文件定义了三种身份,分别是属主
owner
、属组group
、其他人others
- 每种身份又对应三种权限,分别是读
read
、写write
、执行excute
- 针对文件定义了三种身份,分别是属主
- 当一个用户访问文件流程如下
- 判断用户是否为文件属主,如果是则按属主权限进行访问
- 判断用户是否为文件属组,如果是则按属组权限进行访问
- 如果不是文件属主、也不是文件属组,则按其他人权限进行访问
权限中rwx的含义
linux
中权限是由rwxr-xr-x
这9位字符来表示- 主要控制文件的属主
user
、属组group
、其他用户other
字母 | 含义 | 二进制 | 八进制权限表示法 |
---|---|---|---|
r-- | 读取权限 | 100 | 4 |
-w- | 写入权限 | 010 | 2 |
--x | 执行权限 | 001 | 1 |
--- | 没有权限 | 000 | 0 |
- 文件权限示例1:
rwxrw-r-- alice hr file1.txt
- 文件权限示例2:
rw-r----- root dev file2.txt
- 文件权限示例3:
rwxr--rwx jack ops file3.txt
修改文件权限
修改权限的意义
- 简单来说就是:赋予某个用户或组-->能够以何种方式(读写执行)-->访问文件
如何修改权限
- 修改权限使用
chmod(change mode)
命令来实现- 对于
root
用户而言,可以修改任何人的文件权限 - 对于普通用户仅仅只能变更属于自己的文件权限
- 对于
UGO方式
- 给所有人添加文件读写执行权限
chmod a=rwx file
- 取消文件的所有权限
chmod a=-rwx file
- 属主读写执行,属组读写,其他人无权限
chmod u=rwx,g=rw,o=- file
- 属主属组读写执行,其他人读权限
chmod ug=rwx,o=r file
NUM方式
- 设定文件权限644,
rw-r--r--
chmod 644 file
- 设定文件权限600,
rw-------
chmod 600 file
- 设定目录权限为755,
rwxr-xr-x
chmod -R 755 dir
权限设定案例
- 场景1:针对
hr
部门的访问目录/data/hr
设置权限,要求如下:- 1.超级管理员
root
用户和hr
组的员工可以读、写、执行 - 2.其他用户或者组没有任何权限
- 1.超级管理员
groupadd hr
useradd hr01 -G hr
useradd hr02 -G hr
mkdir /home/hr
chgrp hr /home/hr
chmod 770 /home/hr
- 场景2:
在linux
中权限设定对文件和对目录的影响是有区别的
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
读取权限(r) | 具有读取\阅读文件内容权限 | 具有浏览目录及子目录 |
写入权限(w) | 具有新增、修改文件内容的权限 | 具有增加和删除目录内的文件 |
执行权限(x) | 具有执行文件的权限 | 具有访问目录的内容(取决于目录中文件权限) |
权限对文件的影响
验证r权限
- 使用
root
身份,新建文件- 切换普通用户
- 测试普通用户对该文件是否拥有可读权限
- 测试普通用户对该文件是否拥有执行和删除权限
echo "data" > /opt/file
ll /opt/file
-rw-r--r-- 1 root root 5 4月 9 09:53 /opt/file
# 切换普通用户
su - test
# 查看
[test@wordpress ~]$ cat /opt/file
data
# 删除
[test@wordpress ~]$ rm -f /opt/file
rm: cannot remove "/opt/file": Permission denied
验证w权限
- 修改权限只有
w
- 测试能否查看文件
- 测试能否写入数据至文件
- 测试能否删除文件
# 修改权限
[root@wordpress opt]# chmod 642 /opt/file
-rw-r---w- 1 root root 5 4月 9 09:53 /opt/file
# 查看
[test@wordpress ~]$ cat /opt/file
cat: /opt/file: Permission denied
# 写入
[test@wordpress ~]$ vim /opt/file # 权限不足
[test@wordpress ~]$ echo "data2" >> /opt/file
[root@wordpress ~]# cat /opt/file
data
data2
# 删除
[test@wordpress ~]$ rm -f /opt/file
rm: cannot remove "/opt/file": Permission denied
验证x权限
- 修改权限只有
x
- 测试能否查看文件
- 测试能否写入数据至文件
- 测试能否删除文件
- 测试是否能执行文件
# 修改权限
[root@wordpress opt]# chmod 641 /opt/file
-rw-r----x 1 root root 11 4月 9 10:05 /opt/file
# 查看
[test@wordpress ~]$ cat /opt/file
cat: /opt/file: Permission denied
# 写入
[test@wordpress ~]$ vim /opt/file # 权限不足
[test@wordpress ~]$ echo "data3" >> /opt/file
-bash: /opt/file: 权限不够
# 删除
[test@wordpress ~]$ rm -f /opt/file
rm: cannot remove "/opt/file": Permission denied
# 执行(因为没有读,所以无法执行)
[test@wordpress ~]$ /opt/file
bash: /opt/file: 权限不够
文件权限总结
- 1.读取权限
r
:具有读取、阅读文件内容权限- 只能使用查看类命令
cat、head、tail、less、more
- 只能使用查看类命令
- 2.写入权限
w
:具有新增、修改文件内容的权限- 使用
vim
会提示权限拒绝,但可强制保存,会覆盖文件的所有内容 - 使用
echo
命令重定向的方式可以往文件写入数据,>>
可以追加内容 - 使用
rm
无法删除文件,因为删除文件需要查看上级目录是否有w
的权限
- 使用
- 3.执行权限
x
:具有执行文件的权限- 单独的执行权限什么用都没有
- 如果普通用户需要执行文件,需要配合
r
权限
- 4.文件权限设定常见组合
- 文件
r
权限,只给用户查看,无其他操作 - 文件
rw
权限,可以查看和编辑文件内容 - 文件
rx
权限,允许查看和执行文件,但不能修改文件 - 文件
rwx
权限,能读、能写、能执行、不能删除
- 文件
权限对目录的影响
验证r权限
- 使用
root
身份,新建目录,修订权限为774- 在目录中创建一个普通文件
- 测试是否能查看目录中内容
- 测试是否能进入该目录
mkdir /data
echo "123" > /data/file
chmod 774 /data/
# 测试查看目录内容
[test@wordpress ~]$ ls /data/
ls: 无法访问/data/file: 权限不够
file
# 测试进入目录
[test@wordpress ~]$ cd /data/
-bash: cd: /data/: 权限不够
验证w权限
- 使用
root
身份,修订权限为722- 测试是否能查看目录中内容
- 测试是否能删除目录中文件
# 修订权限
chmod 772 /data/
# 测试查看
[test@wordpress ~]$ ls /data/
ls: 无法打开目录/data/: 权限不够
# 测试进入
[test@wordpress ~]$ cd /data/
-bash: cd: /data/: 权限不够
# 测试删除
[test@wordpress ~]$ rm -f /data/file
rm: 无法删除"/data/file": 权限不够
验证x权限
- 使用
root
身份,修订权限为771- 测试是否能查看目录中内容
- 测试是否能进入目录中
# 修订权限
chmod 771 /data/
# 测试查看
[test@wordpress ~]$ ls /data/
ls: 无法打开目录/data/: 权限不够
# 测试进入
[test@wordpress ~]$ cd /data/
[test@wordpress data]$
目录权限小结
- 1.读取权限
r
:具有浏览目录及子目录权限- 使用
ls
命令浏览目录及子目录,但同时也会提示权限拒绝 - 使用
ll
命令浏览目录及子目录,文件属性会带问号,并且只能看到文件名[test@wordpress ~]$ ll /data/ ls: 无法访问/data/file: 权限不够 总用量 0 ????????? ? ? ? ? ? file
- 使用
- 2.写入权限
w
:具有增加、删除或修改目录内文件名权限,需要x
权限配合- 可以在目录内创建文件,删除文件(跟文件本身权限无关)
- 不能进入目录、不能复制目录、不能删除目录、不能移动目录
- 3.执行权限
x
:具有进入目录的权限- 只能进入目录
- 不能浏览、复制、移动、删除
- 4.目录权限设定小结
- 目录
rx
权限,允许浏览目录内文件以及子目录,不允许在该目录下创建文件、删除文件 - 目录
rw
权限,能查看目录,能往目录写入文件,但无法进入目录(使用情况太少) - 目录
rwx
权限
- 目录
修改文件所属关系
修改文件所属关系的意义
- 修改文件所属关系的意义是什么
- 假设:
alice
用户现在有很多房产,希望将其中一套出售给jack
用户变现 - 1.通过
root
用户变更属主关系,将房产默认属主身份alice
修改为jack
- 2.修改完成后该房产拥有人则为
jack
用户,而不再是alice
用户
- 假设:
如何修改文件的所属关系
- 可以使用
chown(change owner)、chgrp(change group)
命令实现chown
能变更文件的属主和属组chgrp
仅能变更文件的属组
chown(change owner)
-
准备环境,创建文件和目录
mkdir /data
-
修改属主为
bin
chown bin /data
-
修改属组为
adm
chown .adm /data
-
修改目录属主为
root
,属组为root
,并进行递归授权
chown -R root.root /data
chgrp(change group)
- 修改属组为
adm
chgrp adm /data
修改文件所属关系场景
基于httpd场景说明
基于httpd场景实践
-
安装
httpd
yum install httpd systemctrl start httpd
-
在默认站点目录创建文件,修订其权限,然后验证是否能访问成功
echo "new web site" > /var/www/html/index.html chmod 600 /var/www/html/index.html
-
无法访问,解决权限不足,有如下两种方式:
# 方法一: chmod 777 /var/www/html/index.html # 方法二: ps -ef | grep httpd chown apache.apache /var/www/html/index.html chmod 600 /var/www/html/index.html
权限相关练习
- 场景1,需求如下
- 1.创建
project_a,project_b
两个组 - 2.创建用户
a1、a2、b1、b2
四个用户 - 3.将用户
a1、a2
添加到project_a
组,用户b1、b2
添加到project_b
组 - 4.所有目录以及文件都保存在
/all
目录下 - 5.在
/all
目录下创建两个项目目录,分别为project_a、project_b
- 6.在每个项目下创建一个与用户同名的目录
- 7.各个项目之间不可以互相访问(
project_a
项目不可以访问project_bb
项目) - 8.相同部门用户之间可以互相查看文件内容,但不可以修改,用户自己创建的文件自己可以修改
- 1.创建
# 需求1-需求3
groupadd project_a
groupadd project_b
useradd a1 -G project_a
useradd a2 -G project_a
useradd b1 -G project_b
useradd b2 -G project_b
# 需求4-需求6
mkdir /all
mkdir /all/{project_a,project_b} -p
mkdir /all/project_a/{a1,a2} -p
mkdir /all/project_b{b1,b2} -p
# 需求7
chmod -R 750 /all/project_a
chmod -R 750 /all/project_b
# 需求8
chown -R a1.project_a /all/porject_a/a1/
chown -R a2.project_a /all/porject_a/a2/
chown -R b1.project_b /all/porject_b/b1/
chown -R b1.project_b /all/porject_b/b2/
文件特殊权限
- 此前我们已经学习过
r、w、x
这三种权限,但在查询系统文件时会发现有一些其他权限的字母- 比如:
/usr/bin/passwd
文件,属主应该是x
的权限位出现了s
- 比如:
/usr/bin/locate
文件,属组应该是x
的权限位出现了s
- 比如:
/tmp
目录,其他人应该是x
的权限位出现了t
- 比如:
特殊权限SUID
SUID产生背景
在linux
系统中,每个普通用户都可以更改自己的密码,这是合理的设置。但是用户的秘密信息存储在/etc/shadow
文件中,也就是说,普通用户在更改自己密码时会更新/etc/shadow
文件的内容
但/etc/shadow
文件不允许任何人修改,那为什么普通用户可以修改自己的权限呢?
[root@wordpress ~]# ll /etc/shadow
---------- 1 root root 794 4月 10 20:51 /etc/shadow
其实,普通用户可以修改自己的密码在于passwd
命令本身,该命令拥有特殊权限SetUID
也就是属主的权限位的执行权限上是s
,那如何解释特殊权限SetUID
:当一个执行文件设置SetUID
后,用户在执行这个文件时将以文件所有者的身份来执行。
- 当我们使用普通用户
xxx
执行passwd
命令时会发生什么变化呢?- 1.由于
passwd
命令拥有suid
特殊权限(在命令属主权限位有一个s
) - 2.所以
passwd
命令在执行的过程中,会以命令的属主身份运行该命令(也就是root
身份) - 3.总结:
xxx
-->passwd
-->转换为命令属主身份root
执行-->操作/etc/shadow
信息变更
- 1.由于
SUID配置语法
chmod u+s /usr/bin/cat
chmod 4755 /usr/bin/cat
SUID作用总结
- 1.让普通用户对可执行的二进制文件,临时拥有二进制文件的所属主权限
- 2.如果设置的二进制文件没有执行权限,那么
suid
的权限就是大S
- 3.特殊权限
suid
仅对二进制可执行程序有效,其他文件或目录则无效 - 注意:
suid
相对危险,不建议对vim
或rm
进行suid
设定操作
特殊权限SGID
什么是SGID
SGID
设置二进制可执行文件,命令在执行的过程中,会以命令的属组身份运行该命令SGID
设置在目录上,这时候在该目录下新建的文件/目录自动继承父目录的属组
SGID配置语法
chmod g+s /dir
chmod 2755/dir
SGID场景说明
- 需求描述
- 系统有两个用户,分别为
ex1
和ex2
,这两个用户都拥有example
附加组 - 这两个用户需要共同拥有
/data/code
目录的开发权 - 互相之间能修改彼此的文件,且该目录不允许其他人查阅
groupadd example useradd ex1 -G example useradd ex2 -G example mkdir /data/code chgrp example /data/code chmod 770 /data/code/ chmod 2770 /data/code
- 系统有两个用户,分别为
特殊权限SBIT
什么是SBIT
一旦目录被赋予了粘滞位Sticky(SI TI KI)
,除了root
可以删除目录中的所有文件,普通用户对该目录就算拥有了w
权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件
SBIT配置示例
需求:默认情况下/tmp
不是粘滞位,如何将此目录设置为粘滞位
chmod 1755 /tmp
chmod o+t /tmp
SBIT使用场景
后期当我们要初始化mysql
服务时,服务会创建一些临时文件存储至/tmp
目录下,当初始化完毕后,自己会清理掉里面的数据,别人无法清理。(如果这个目录不是粘滞位,那么初始化mysql
就会报错)
- 编写
shell
脚本模拟此场景- 模拟
mysql
初始化创建文件至/tmp
目录 - 模拟普通用户登录系统删除
mysql
的初始化文件 - 如果普通用户删除成功,则初始化失败(因为
mysql
服务创建的文件,需要自行销毁) - 如果普通用户删除失败,则
mysql
服务尝试删除,删除成功,则初始化成功
- 模拟
SBIT作用总结
- 让所有普通用户对该目录具有写入权限,并且能实现每个用户只能删除自己的文件
- 粘滞位目录表现在
others
的x
位,用t
表示,如果没有执行权限则显示为T
- 粘滞位目录的属主以及
root
用户有权删除目录中的内容,其他用户无权限删除
特殊权限相关练习
- 需求如下:
- 假如你是一个员工组的团队领导,为
zzz
公司工作 - 公司要求你创建一个
dir_zzz
目录 - 让
ops
组成员都能在该目录下创建或访问文件 - 但是除了文件创建者之外的其他人不能删除文件
- 假如你是一个员工组的团队领导,为
# 赋予权限
chgrp ops /dir_zzz
chmod g+s /dir_zzz
chmod o+t /dir_zzz
文件特殊属性
什么是特殊属性
这类文件属性凌驾于rwx
基础权限之上,是一种高级属性
特殊属性的作用
- 创建一个文件,不允许被修改、移动、删除,包括
root
也不行,适合/etc/passwd
- 创建一个文件,仅允许往文件里面追加数据,不允许修改、移动、删除,适合
sudo
审计日志
特殊属性如何配置
linux
系统通过chattr
来实现特殊属性的配置- 命令格式:
chattr [+-=] [选项] 文件或目录名
a
:可对文件进行追加内容i
:锁定文件,不允许其他操作
-
配置
/etc/passwd
文件,不能改、不能追加、不能删除# 赋予i权限 chattr +i /etc/passwd # 验证权限 rm -f /etc/passwd rm: cannot remove '/etc/passwd': Operation not permitted
-
配置
/var/log/secure
文件,只能追加写入日志,不允许手动修改,也不允许删除# 赋予a权限 chattr +a /var/log/secure lsattr /var/log/secute ------a--------- /var/log/secure # 测试追加数据 echo "hello" >> /var/log/secure # 不能删除,不能修改 rm -f /var/log/secure rm: cannot remove '/var/log/secure': Operation not permitted
-
如果想取消特殊属性,需要使用
root
身份chattr -i /etc/passwd chattr -a /var/log/secure
特殊属性场景示例
- 模拟病毒篡改站点,然后使用
chattr
锁住文件,让病毒程序无法篡改,然后追踪并杀死病毒程序- 安装并启动
httpd
服务 - 模拟病毒脚本篡改网页内容
- 锁定篡改文件,然后找出病毒,将其杀死
- 安装并启动
-
安装
http
服务,然后启动yum install httpd systemctl start httpd
-
编写病毒脚本,尝试篡改网页内容
cat /usr/bin/virus #!/usr/bin/bash web_site=/var/www/html/index.html while true do # 模拟入侵 echo"我是病毒的code" > $(web_site) sleep 10 # 将这个脚本放入定时任务中 echo "*/1 * * * * /bin/bash -x /usr/bin/virus &>/tmp/vinus.log" > /var/spool/cron/root # 将脚本锁住 chattr +i /usr/bin/virus done
-
锁定篡改文件,然后杀死病毒
chattr +i /var/spool/cron/root echo "hello web server" /var/www/html/index.html chattr +i /var/www/html/index.html kill $(ps -ef | grep virus | grep -v grep | awk '{print $2}')
文件默认权限
什么是默认权限
-
默认权限:指用户在创建文件或目录时,默认分配给文件或目录的访问权限
默认权限的由来
-
背景
- 用户创建一个文件的默认访问权限为:
rw-rw-rw-
(八进制值666) - 用户创建一个目录的默认访问权限为:
rwxrwxrwx
(八进制值777) - 但最终创建出来的文件权限是644,目录是755,为什么目录不是777,文件不是666呢?
- 用户创建一个文件的默认访问权限为:
-
分析
- 因为系统创建文件或目录受
UMASK
控制,比如UMASK
设置为:022 - 那么创建出来的文件权限是644,目录是755
- 目录:777 - 022 = 755,最终创建出来的目录权限
- 文件:666 - 022 = 644,最终创建出来的文件权限
- 因为系统创建文件或目录受
-
结论
UMASK
表示要减掉的权限
系统默认权限配置文件
-
为什么默认
root
用户的UMASK
为022,在系统哪个配置文件有设定呢- 当用户登录系统时,会加载
/etc/profile
环境变量文件 - 在该配置文件中有一条
UMASK
的判断语句 - 如果用户
UID
小于199那么将UMASK
初始化为022 - 如果用户
UID
大于199并且组名称和用户名称一致,那么将UMASK
初始化为002
- 当用户登录系统时,会加载
-
UMASK
判断语句如下:vim /etc/profile if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then umask 002 else umask 022 fi
默认权限的计算公式
# 假设umask的值为:022(所有位数为偶数)
# 文件的起始权限值
666 - 022 = 644
777 - 022 = 755
# 假设umask的值为:045(其他用户组位为基数)
# 计算出来的权限,由于umask的最后一位数字是5,所以在其他用户组位再加1
666 - 045 = 621 + 1 = 622
777 - 045 = 732
# umask所有位数为偶数时
# umask044
# mkdir d044 目录权限为 777 - 044 = 733
# touch f044 文件权限为 666 - 044 = 622
# umask部分位数为奇数时
# umask023
# mkdir d023 目录权限为 777 - 023 = 754
# touch f023 文件权限为 666 - 023 = 643 + 001 = 644
# umask部分位数为奇数时
# umask032
# mkdir d032 目录权限为 777 - 032 = 745
# touch f023 文件权限为 666 - 032 = 634 + 010 = 644
# umask所有位数为奇数时
# umask035
# mkdir d023 目录权限为 777 - 035 = 742
# touch f023 文件权限为 666 - 035 = 631 + 011 = 642
留言