内容目录

文件权限介绍

什么是权限

  • 权限是用来约束用户能对系统所做的操作
  • 或者说,权限是某个指定的用户具有特定的系统资源使用权力

为什么需要权限

  • linux是一个多用户系统,对于每一个用户来说,个人隐私的保护十分重要,所以需要进行权限划分
    • 安全性:降低误删除风险、减少人为造成故障以及数据泄露等风险
    • 数据隔离:不同的权限能看到、以及操作不同的数据
    • 职责明确:电商场景客服只能查看投诉、无法查阅店铺收益,运营则能看到投诉以及店铺收益

权限与用户的关系

  • linux系统中,权限是用来定义用户能做什么,不能做什么
    • 针对文件定义了三种身份,分别是属主owner、属组group、其他人others
    • 每种身份又对应三种权限,分别是读read、写write、执行excute

file

  • 当一个用户访问文件流程如下
    • 判断用户是否为文件属主,如果是则按属主权限进行访问
    • 判断用户是否为文件属组,如果是则按属组权限进行访问
    • 如果不是文件属主、也不是文件属组,则按其他人权限进行访问

权限中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.其他用户或者组没有任何权限
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)
  1. 准备环境,创建文件和目录
    mkdir /data

  2. 修改属主为bin
    chown bin /data

  3. 修改属组为adm
    chown .adm /data

  4. 修改目录属主为root,属组为root,并进行递归授权
    chown -R root.root /data

chgrp(change group)
  • 修改属组为adm
    chgrp adm /data

修改文件所属关系场景

基于httpd场景说明

file

基于httpd场景实践
  1. 安装httpd

    yum install httpd
    systemctrl start httpd
  2. 在默认站点目录创建文件,修订其权限,然后验证是否能访问成功

    echo "new web site" > /var/www/html/index.html
    chmod 600 /var/www/html/index.html
  3. 无法访问,解决权限不足,有如下两种方式:

    # 方法一:
    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-需求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后,用户在执行这个文件时将以文件所有者的身份来执行。
file

  • 当我们使用普通用户xxx执行passwd命令时会发生什么变化呢?
    • 1.由于passwd命令拥有suid特殊权限(在命令属主权限位有一个s
    • 2.所以passwd命令在执行的过程中,会以命令的属主身份运行该命令(也就是root身份)
    • 3.总结:xxx-->passwd-->转换为命令属主身份root执行-->操作/etc/shadow信息变更
SUID配置语法
chmod u+s /usr/bin/cat
chmod 4755 /usr/bin/cat
SUID作用总结
  • 1.让普通用户对可执行的二进制文件,临时拥有二进制文件的所属主权限
  • 2.如果设置的二进制文件没有执行权限,那么suid的权限就是大S
  • 3.特殊权限suid仅对二进制可执行程序有效,其他文件或目录则无效
  • 注意:suid相对危险,不建议对vimrm进行suid设定操作

特殊权限SGID

什么是SGID
  • SGID设置二进制可执行文件,命令在执行的过程中,会以命令的属组身份运行该命令
  • SGID设置在目录上,这时候在该目录下新建的文件/目录自动继承父目录的属组
SGID配置语法
chmod g+s /dir
chmod 2755/dir
SGID场景说明
  • 需求描述
    • 系统有两个用户,分别为ex1ex2,这两个用户都拥有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作用总结
  • 让所有普通用户对该目录具有写入权限,并且能实现每个用户只能删除自己的文件
  • 粘滞位目录表现在othersx位,用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:锁定文件,不允许其他操作
  1. 配置/etc/passwd文件,不能改、不能追加、不能删除

    # 赋予i权限
    chattr +i /etc/passwd
    # 验证权限
    rm -f /etc/passwd
    rm: cannot remove '/etc/passwd': Operation not permitted
  2. 配置/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
  3. 如果想取消特殊属性,需要使用root身份

    chattr -i /etc/passwd
    chattr -a /var/log/secure

特殊属性场景示例

  • 模拟病毒篡改站点,然后使用chattr锁住文件,让病毒程序无法篡改,然后追踪并杀死病毒程序
    • 安装并启动httpd服务
    • 模拟病毒脚本篡改网页内容
    • 锁定篡改文件,然后找出病毒,将其杀死
  1. 安装http服务,然后启动

    yum install httpd
    systemctl start httpd
  2. 编写病毒脚本,尝试篡改网页内容

    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
  3. 锁定篡改文件,然后杀死病毒

    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
最后修改日期: 2024年12月8日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。