• 08-Linux特殊权限


    1. 特殊权限概述

    在査询系统文件权限时会发现除了三种普通权限: r()、w() x(执行)
    外出现了一些其他权限字母, 比如:s.
    
    • 1
    • 2
    [root@kid dir]# ll /usr/bin/passwd  
    -rwsr-xr-x. 1 root root 27856 Apr  1  2020 /usr/bin/passwd
    
    
    • 1
    • 2
    • 3
    在属主本来应该是 x(执行)权限的位置出现了一个小写s, 这是什么权限?
    这种权限称作 SetUID 权限, 也叫作 SUID的特殊权限.
    
    • 1
    • 2

    2. 特殊权限SUID

    SUID ==> SetUID
    
    • 1
    2.1 问题引出
     Linux 系统中, 每个普通用户都可以更改自己的密码, 这是合理的设置.
    问题是, 普通用户的信息保存在 /etc/passwd 文件中, 用户的密码在/etc/shadow 文件中, 
    也就是说, 普通用户在更改自己的密码时修改了 /etc/shadow文件中的加密密码,
    但是文件权限显示, 普通用户对这两个文件其实都是没有写权限的, 那为什么普通用户可以修改密码呢?
    
    • 1
    • 2
    • 3
    • 4
    [root@kid dir]# ll /etc/passwd 
    -rw-r--r--. 1 root root 1279 Sep  1 17:01 /etc/passwd
    [root@kid dir]# ll /etc/shadow  
    ----------. 1 root root 1748 Sep  1 17:01 /etc/shadow
    
    • 1
    • 2
    • 3
    • 4
    2.2 谜底
    其实, 普通用户可以修改自己的密码在于 passwd 命令.
    该命令拥有特殊权限 SetUID, 也就是在属主的执行权限上显示是s.
    可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,
    用户在执行这个文件时将以文件所有者的身份来执行.
    
    PS: 当普通用户使用 passwd 命令更改自己的密码时, 
    实际上是在用 passwd 命令所有者 root 的身份在执行 passwd 命令, 
    root当然可以将密码写入 /etc/shadow 文件, 所以普通用户也可以修改 /etc/shadow 文件, 
    命令执行完成后, 该身份也随之消失.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    2.3 演示
    举个例子, 有一个普通用户, 她可以修改自己的权限, 因为 passwd 命令拥有 SetUID 权限,
    但是她不能査看 /etc/shadow文件的内容, 因为査看文件的命令( cat)没有 SetUID 权限.
    
    • 1
    • 2
    # 创建用户
    [root@kid ~]# useradd lamp
    # 设置密码
    [root@kid ~]# passwd lamp
    Changing password for user lamp.
    New password: 123
    BAD PASSWORD: The password is shorter than 8 characters
    Retype new password: 123
    passwd: all authentication tokens updated successfully.
    # 切换用户
    [root@kid ~]# su - lamp
    # 自己可以修改自己的密码, 从而改变/etc/shadow中的数据  
    [lamp@kid ~]$ passwd
    Changing password for user lamp.
    Changing password for lamp.
    (current) UNIX password: 321
    New password: 123
    BAD PASSWORD: The password is too similar to the old one
    New password: 321
    BAD PASSWORD: The password is too similar to the old one
    New password: 321
    BAD PASSWORD: The password is too similar to the old one
    passwd: Have exhausted maximum number of retries for service
    
    # 但无法使用cat命令查看/etc/shadow  
    [lamp@kid ~]$  cat /etc/shadow  
    cat: /etc/shadow: Permission denied
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    用一张示意图来理解上述过程↓
    
    • 1

    img

    lamp 用户对 passwd 命令拥有 x(执行)权限.  
    lamp 用户在执行 passwd 命令的过程中, 会暂时切换为 root 身份, 所以可以修改 /etc/shadow 文件.  
    命令结束, lamp 用户切换回自己的身份.  
    PS: cat命令没有 SetUID权限, 所以使用 lamp 用户身份去访问 /etc/shadow 文件, 当然没有相应权限了.  
    
    • 1
    • 2
    • 3
    • 4
    # 查看passwd命令的类型
    [root@kid ~]# type passwd
    passwd is /bin/passwd
    # 查看passwd命令的权限
    [root@kid ~]# ll /bin/passwd
    -rwsr-xr-x. 1 root root 27856 Apr  1  2020 /bin/passwd
    
    # 查看cat命令的类型
    [root@kid ~]# type cat
    cat is /bin/cat
    # 查看cat的权限
    [root@kid ~]# ll /bin/cat
    -rwxr-xr-x. 1 root root 54080 Aug 20  2019 /bin/cat
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    2.4 SUID权限设置
    SUID授权方法:
     	权限字符s(S),  chmod 4755 directory
    	数字是4000     chmod u+S  directory
    * 用户位置上的x位上设置.
    
    • 1
    • 2
    • 3
    • 4
    suid的作用: 
    1. 让普通用户对可执行的二进制文件, 临时拥有所属主的权限.  
    2. 如果设置的二进制文件没有执行权限, 那么suid的权限显示就是大S.  
    3. 特殊权限suid仅对二进制可执行程序有效, 其他文件或目录则无效.  
    注意: suid极度危险, 不信可以尝试对vim或rm进行设定SetUID.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    [root@kid ~]# touch 1.txt
    [root@kid ~]# ll
    total 4
    -rw-r--r--. 1 root root    0 Sep  1 20:33 1.txt
    -rw-------. 1 root root 1263 Aug 26 19:24 anaconda-ks.cfg
    [root@kid ~]# chmod 4777 1.txt 
    [root@kid ~]# ll
    total 4
    -rwsrwxrwx. 1 root root    0 Sep  1 20:33 1.txt
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    [root@kid ~]# touch 2.txt
    [root@kid ~]# chmod u=rws 2.txt 
    [root@kid ~]# ll
    -rwSr--r--. 1 root root    0 Sep  1 20:34 2.txt
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. 特殊权限SGID

    SGID ==> SetUID
    
    • 1
    3.1 SGID的作用
    SGID的作用
    1. 针对用户组权限位修改, 用户创建的目录或文件所属组和该目录的所属组一致.  
    2. 当某个目录设置了sgid后, 在该目录中新建的文件不在是创建该文件的默认所属组  
    3. 使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单.
    
    • 1
    • 2
    • 3
    • 4
    3.2 SGID授权设置
     SGID授权方法:
        数字2000      chmod 2755  directory   
        权限字符s(S)  chmod  g+s  directory  
    * 用户属组位置上的x位上设置.
    
    • 1
    • 2
    • 3
    • 4
    3.3 演示
    将目录设置为sgid后, 如果在该目录下创建文件, 都将与该目录的所属组保持一致.
    
    • 1
    # 新建目录  
    [root@kid ~]# mkdir dir3
      
    # 给测试目录赋予SetGID权限, 检查SetGID是否生效  
    [root@kid ~]# chmod g+s dir3 && ll -d dir3
    drwxr-sr-x. 2 root root 6 Sep  1 20:47 dir3
    ...
      
    # 给目录777权限 (x权限还在)
    [root@kid ~]# chmod 777 dir3
    [root@kid ~]# ll
    drwxrwsrwx. 2 root root    6 Sep  1 20:47 dir3
    ...
    
    # 设置/root目录的权限让普通用户可进入这个目录
    [root@kid ~]# chmod o=rx /root
    
      
    # 切换成普通用户, 并进入该目录  
    [root@bgx ]# su - qq  
    
      
    # 普通用户创建文件, 检查文件的信息  
    [qq@kid ~]$ touch /root/dir3/a.txt
    # 看属组
    [qq@kid ~]$ ll /root/dir3/a.txt
    -rw-rw-r--. 1 qq root 0 Sep  1 21:04 /root/dir3/a.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    4. 特殊权限SBIT

    SBIT = Sticky(SI TI KI)
    
    • 1
    4.1 Sticky作用
    Sticky(SI TI KI)粘滞位的作用:(只能作用于目录)
    
        1. 让多个用户都具有写权限的目录, 并让每个用户只能删自己的文件.  
        2. 特殊sticky目录表现在others的x位, 用小t表示, 如果没有执行权限是T  
        3. 一个目录即使它的权限为”777”如果是设置了粘滞位, 除了目录的属主和”root”用户有权限删除,
           除此之外其他用户都不允许删除该目录.
           
           普通用户对该目录拥有 w  x 权限, 即普通用户可以在此目录中拥有写入权限.
           如果没有粘滞位, 那么普通用户拥有 w权限, 就可以删除此目录下的所有文件, 包括其他用户建立的文件.
           如果被赋予了粘滞位, 除了 root 可以删除所有文件, 普通用户就算拥有w权限, 
           也只能删除自己建立的文件, 而不能删除其他用户建立的文件.
           
    * 设置目录, 限制该目录的文件不能被其他用户删除, 如果文件没有, 是可以删除这个目录的.
      如果还有文件直接删除目录肯定是不运行, rm删除命令先删了文件才删目录的...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    4.2 sticky授权设置
    sticky授权方法:
        数字2000		 chmod 1755  directory
        权限字符t(T)	chmod o+t  directory
    * 其他用户位的x位上设置.
    
    • 1
    • 2
    • 3
    • 4
    4.3 演示
    # 创建目录
    [root@kid ~]# mkdir dir4
    # 添加粘滞位权限
    [root@kid ~]# chmod 1777 dir4
    [root@kid ~]# ll
    drwxrwxrwt. 2 root root 6 Sep  1 21:45 dir4
    ...
    
    # 在目录下创建文件
    [root@kid ~]# touch dir4/1.txt
    [root@kid ~]# ll dir4
    -rw-r--r--. 1 root root 0 Sep  1 21:45 1.txt
    ...
    
    # 设置/root目录的权限让普通用户可以操作这个目录
    [root@kid ~]# chmod o=rwx /root
    
    # 切换用户
    [root@kid ~]# su - qq
    [qq@kid ~]$ rm -rf /root/dir4/1.txt 
    # 不允许操作;操作不允许;不允许的操作
    rm: cannot remove ‘/root/dir4/1.txt’: Operation not permitted
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    5. 权限属性chattr

    chatrr 只有 root 用户可以使用, 用来修改文件系统的权限属性, 建立凌驾于 rwx 基础权限之上的授权.  
    chatrr 命令格式:chattr [+-=] [选项] 文件或目录名
    选项: 
    	+ 增加权限 -减少权限 =等于某个权限  
    	a:让文件或目录仅可追加内容  
    	i:不得任意更动文件或目录  
    
    查看权限属性限制命令: lsattr 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    # 创建文件并设置属性  
    [root@kid ~]# touch file_a file_i 
    # 查看权限属性限制  
    [root@kid ~]# lsattr file_a file_i  
    ---------------- file_a
    ---------------- file_i
      
    # 使用chattr设置属性
    [root@kid ~]# chattr +a file_a  
    [root@kid ~]# chattr +i file_i  
    [root@kid ~]# lsattr file_a file_i  
    -----a---------- file_a  
    ----i----------- file_i  
      
    # a权限, 无法写入和删除文件, 但可以追加数据, 适合/etc/passwd这样的文件 
    # 覆盖式写入内容
    [root@kid ~]# echo "aa" > file_a  
    bash: file_a: Operation not permitted  
    # 删除文件
    [root@kid ~]# rm -f file_a  
    rm: cannot remove ‘file_a’: Operation not permitted 
    # 追加
    [root@kid ~]# echo "aa" >> file_a  
      
    # i权限, 无法写入, 无法删除, 适合不需要更改的重要文件加锁  
    [root@kid ~]# echo "i" > file_i  
    bash: file_i: Permission denied  
    [root@kid ~]# echo "i" >> file_i  
    bash: file_i: Permission denied  
    [root@kid ~]# rm -f  file_i  
    rm: cannot remove ‘file_i’: Operation not permitted  
      
    # 解除限制  
    [root@tianyun ~]# chattr -a file_a 
    [root@tianyun ~]# chattr -i file_i 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    6. 进程掩码umask

    6.1 umask是什么?
    当我们登录系统之后创建一个文件总是有一个默认权限的, 比如:
    目录755、文件644、那么这个权限是怎么来的呢?
    这就是umask干的事情, umask设置了用户创建文件的默认权限.
    
    • 1
    • 2
    • 3
    6.2 umask是如何改变创建新文件的权限
    系统默认umask为022, 那么当我们创建一个目录时, 
    目录起始权限=777-当前系统umask的值=777-022=755. 
    文件起始权限=666-当前系统umask的值=666-022=644.
    
    • 1
    • 2
    • 3
    6.3 umask涉及哪些配置文件
    umask涉及到的相关文件
    /etc/bashrc
    /etc/profile
    ~/.bashrc
    ~/.bash_profile  
    shell (vim,touch) –umask–> 会影响创建的新文件或目录权限  
    vsftpd服务如果修改–umask–> 会影响ftp服务中新创建文件或创建目录权限  
    useradd如果修改umask–> 会影响用户HOME家目录权限
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    6.4 实例
    # 假设umask值为:045(其他用户组位为奇数)  
    6 6 6  -   0 4 5 = 6 2 1  
       
    # umask所有位全为偶数时  (044)
    命令: mkdir d044  目录 (目录权限为733)  
    命令: touch f044  文件 (文件权限为622 ) 
      
    # umask部分位为奇数时   (023)
    命令: mkdir d023  目录 (目录权限为754)  
    命令: touch f023  文件 (文件权限为644)  
      
    # umask值的所有位为奇数时  (035)
     
    命令: mkdir d035  目录 (目录权限为742)  
    命令: touch f035   文件 (文件权限为642)     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    # 查看当前用户的umask权限  
    [root@kid ~]# umask  
    0022  
    [root@kid ~]# touch file1
    [root@kid ~]# mkdir dir1
    [root@kid ~]# ll -d file1  dir1/  
    drwxr-xr-x. 2 root root 6 Sep  1 22:34 dir1/
    -rw-r--r--. 1 root root 0 Sep  1 22:33 file1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    6.5 修改umask值
    # 修改 shell umask 值(临时生效)
    [root@kid ~]# umask 000  
    [root@kid ~]# mkdir dir000  
    [root@kid ~]# touch file000  
    [root@kid ~]# ll -d dir000 file000  
    drwxrwxrwx. 2 root root 6 Sep  1 23:08 dir000
    -rw-rw-rw-. 1 root root 0 Sep  1 23:09 file000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    通过 umask 决定新建用户 HOME 目录的权限, 不同的配置文件中的配置作用的范围不一同.
    需要修改其他的创建目录或文件初始权限, 需要找对对应的配置文件进行配置.
    
    • 1
    • 2
    [root@kid ~]# vim /etc/login.defs  
    # 默认
    UMASK 077  
    # 不改动退出
    # 新建用户
    [root@kid ~]# useradd dba 
    # 查看用户目录权限
    [root@kid ~]# ll -d /home/dba/  
    drwx------. 2 dba dba 62 Sep  1 23:28 /home/dba/
    
    # 修改UMASK为000
    [root@tianyun ~]# vim /etc/login.defs  
    UMASK 000  
    # 保存退出
    # 新建用户 dbb
    [root@kid ~]# useradd dbb  
    [root@kid ~]# ll -d /home/dbb/  
    drwxrwxrwx. 2 dbc dbc 62 Sep  1 23:30 /home/dbb/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    编译源码报build/make/core/artifact_path_requirements.mk:26: error: Build failed.解决方法
    开源不止,创新澎湃 | 2023开源产业生态大会六大专题抢“鲜”看!
    2021年12月电子学会图形化一级编程题解析含答案:下雨
    ORB-SLAM系列算法相关介绍(综合版)
    从零开始,小白也能学会的创建Git仓库实操
    【pandas小技巧】--花哨的DataFrame
    ASEMI整流二极管MR754参数,MR754图片,MR754应用
    jdk动态代理----实战例子
    pNA修饰肽:Z-FLE-pNA,Z-Phe-Leu-Glu-pNA,CAS号: 104634-10-8
    Linux内核中ideapad-laptop.c文件全解析7
  • 原文地址:https://blog.csdn.net/qq_46137324/article/details/126653400