zoukankan      html  css  js  c++  java
  • Linux

    Linux - 权限管理(文件权限)

    一:基本权限

     

    1.基本权限介绍

     

    基本权限类型

    类型全拼释义权限位
    r read 可读 4
    w write 可写 2
    x execute 可执行 1
     

    权限的归属

    归属字母
    属主 u
    属组 g
    其他用户 o
     

    2.设置权限

     

    修改属主、属组

    # 修改文件:1.txt的 属主为:darker 属组为:human
    [root@localhost ~]# chown darker.human 1.txt
    
    
    # 修改文件:1.txt的 属主为:darker 
    [root@localhost ~]# chown darker 1.txt
    
    
    # 修改文件:1.txt的 属组为:human
    [root@localhost ~]# chown .human 1.txt
    
    
    # 递归修改目录:file1的 属主为:darker 属组为:human
    [root@localhost ~]# chown -R darker.human file1

    修改u、g、o对应的权限

    # 加减法
    # 修改文件:1.txt的权限为:属主为u 属组为w
    [root@localhost ~]# chmod u+x,g-w 1.txt
    
    
    # 赋值法
    # 修改文件:1.txt的权限为:所有用户为rwx
    [root@localhost ~]# chmod a=rwx 1.txt
    
    # 修改文件:1.txt的权限为:-
    [root@localhost ~]# chmod a=- 1.txt
    
    # 修改文件:1.txt的权限为:属主属组为rw 其他用户为r
    [root@localhost ~]# chmod ug=rw,o=r 1.txt
    
    
    # 数字
    # 修改文件:1.txt的权限为:所有用户的权限为rwx
    [root@localhost ~]# chmod 777 1.txt
    
    # 递归修改目录:file1的权限为:所有用户的权限为rwx
    [root@localhost ~]# chmod 777 file1

    注意:把某一个非属主用户添加到文件的属组里,他就拥有了该组的权限,而不再是其他人

     

    权限对文件/目录的意义

     

    文件:ls -l 文件名

    权限释义
    r 可以cat读取文件内容
    w 可以修改文件
    x 可以执行文件代码,如果该文件的代码是编译好的结果
    那么只有x权限即可执行
    但如果该文件的代码是一个解释型的脚本程序
    则需要配合r权限才可执行
     

    目录:ls -dl 文件名

    权限释义
    r 可以ls浏览文件下的内容
    w 可以在目录下创建新文件or目录
    x 可以执行目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行
    可以正常cd切换到目录下
    涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级
     

    对文件夹的操作(不操作文件内容),需要当前用户具备的权限

    • 对沿途所有文件夹有x权限
    • 对目标文件夹有r或w权限
    权限释义
    r 可以浏览
    w 可以创建、删除、移动子文件和子目录
     

    对文件的操作(操作文件内容),需要当前用户具备的权限

    • 对沿途所有文件夹有x权限
    • 对目标文件有r或w权限
    权限释义
    r 可以读取文件内容
    w 可以修改文件内容
    注意点:

    vim修改的原理是将原文件删掉,然后再将内容的内容覆盖写入了新文件,新文件名重命名为原文件名

     

    验证vim修改的原理

    # (root用户)切换到/usr/local目录
    [root@localhost local]# cd /usr/local
    
    
    # (root用户)递归创建test01/dir1目录
    [root@localhost local]# mkdir -p test01/dir1
    
    
    # (root用户)递归修改目录test01权限为733
    [root@localhost local]# chmod -R 733 test01
    
    
    # (root用户)在test01目录下创建1.txt并写入内容“123”
    [root@localhost local]# echo "123" > test01/1.txt
    
    
    # (root用户)查看1.txt的内容
    [root@localhost local]# cat test01/1.txt
    123
    
    
    # (root用户)查看test01目录下的文件1.txt的详情信息:其他用户只有(r)读的权限
    [root@localhost local]# ll test01/1.txt
    -rw-r--r--. 1 root root 4 Nov 25 10:02 test01/1.txt
    
    
    # (root用户)查看test01目录下的文件1.txt的iNode信息
    [root@localhost local]# stat test01/1.txt
      File: ‘test01/1.txt’
      Size: 4               Blocks: 8          IO Block: 4096   regular file
    Device: fd00h/64768d    Inode: 23609       Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: unconfined_u:object_r:usr_t:s0
    Access: 2020-11-25 10:02:58.471562017 -0500
    Modify: 2020-11-25 10:02:58.471562017 -0500
    Change: 2020-11-25 10:02:58.471562017 -0500
     Birth: -
    
    
    
    # 切换到其他用户/用其他用户登录
    PS C:UsersDarker> ssh darker@192.168.50.101
    darker@192.168.50.101's password:
    [darker@localhost ~]$ whoami
    darker
    
    
    # (普通用户)用vim打开/usr/local/test01目录下的1.txt
    [darker@localhost ~]$ vim /usr/local/test01/1.txt
    123
    ~  
    ~ 
    ~ 
    "/usr/local/test01/1.txt" [readonly] 1L,   4C   1,1   All    # [readonly] 只读
    
    # 按i进入插入模式
    -- INSERT -- W10: Warning: Changing a readonly file
    
    
    # (普通用户)修改1.txt的内容,强制保存并退出
    456
    Esc
    :wq!
    
    
    
    # 回到原来的root用户的窗口
    # (root用户)查看1.txt的内容
    [root@localhost local]# cat test01/1.txt
    456
    
    
    # (root用户)查看test01目录下的文件1.txt的详情信息:属主和属主变了
    [root@localhost local]# ll test01/1.txt
    -rw-r--r--. 1 darker darker 4 Nov 25 10:21 test01/1.txt
    
    
    # (root用户)查看test01目录下的文件1.txt的iNode信息
    [root@localhost local]# stat test01/1.txt
      File: ‘test01/1.txt’
      Size: 4               Blocks: 8          IO Block: 4096   regular file
    Device: fd00h/64768d    Inode: 23609       Links: 1
    Access: (0644/-rw-r--r--)  Uid: ( 1000/  darker)   Gid: ( 1000/  darker)
    Context: unconfined_u:object_r:usr_t:s0
    Access: 2020-11-25 10:30:54.822530748 -0500
    Modify: 2020-11-25 10:21:17.823541511 -0500
    Change: 2020-11-25 10:21:17.824541511 -0500
     Birth: -

    结论

    vim修改文件时:会将原文件删除,生成新的文件,属主和主组会变成修改的那个用户和用户所在的组

     

    二:特殊权限

    权限权限位
    SUID 4
    SGID 2
    SBIT 1
     

    SUID

     

    1.疑问

    普通用户既不是root也不属于root组,因此 它对/etc/shadow文件没有任何权限(全是---
    # 查看/etc/shadow信息
    [darker@localhost ~]# ll /etc/shadow
    ----------. 1 root root 970 Nov 24 07:29 /etc/shadow
    但是:普通用户为何可以用passwd直接修改密码?并且修改的是/etc/shadow文件,如何实现的?
    [darker@localhost ~]$ ll `which passwd`
    -rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd
    这里可以看到,本应为rwx的第三个x变成了s,这就是s权限
     

    2.s权限的特殊之处

    • SUID权限仅对二进制可执行文件有效(对目录无效)
    • 如果执行者对于该二进制可执行文件具有x的权限,执行者将具有该文件的所有者的权限
    • 本权限 仅在执行该二进制可执行文件的过程中有效
     

    3.权限设定的方法

    • 字母表示法
    chmod u+s 可执行文件    # 给属主添加s权限
    chmod u-s 可执行文件    # 删除属主的s权限
    • 数字表示法(第1位4表示SUID,后3位表示普通权限 rwx
    chmod 4755 可执行文件    # 添加SUID权限到二进制可执行文件
    chmod 0xxx ...            # 可以删除文件的SUID(但是无法删除目录的SUID)

    4.实例

    # (root用户)查看which cat
    [root@localhost ~]# ll `which cat`
    -rwxr-xr-x. 1 root root 54048 Nov 20  2015 /usr/bin/cat
    
    
    # (普通用户)查看/etc/shadow:没有权限(普通用户虽然是r-x,但是无法直接查看)
    [darker@localhost local]$ cat /etc/shadow
    cat: /etc/shadow: Permission denied
    
    
    # (root用户)修改 which cat 权限
    [root@localhost ~]# chmod u+s `which cat`    # 或者 chmod 4755 `which cat`
    
    
    #(root用户) 再次查看which cat
    [root@localhost ~]# ll `which cat`
    -rwsr-xr-x. 1 root root 54048 Nov 20  2015 /usr/bin/cat
    
    
    # (普通用户)查看/etc/shadow:有权限了
    [darker@localhost local]$ cat /etc/shadow
    root:$6$Jvw3z/jmU1ASO4P1$vpTJ5OGEtfBOmIpjyK55k87iQPHXCC3.kKOFW9jkyslqC2DMdN7SZdT/zYRfmQ4hBAQXG6CQ4kKdRQ8eFqChf.::0:99999:7:::
    bin:*:16659:0:99999:7:::
    daemon:*:16659:0:99999:7:::
    adm:*:16659:0:99999:7:::
    lp:*:16659:0:99999:7:::
    ...

    5.上例的工作原理

    环境前提:
        Linux中有1个二进制程序:cat,属组属组都是root
        Linux中有一个系统文件:/etc/shadow,属组属组是: root:root
        有一个普通用户:darker
        普通用户:darker 属于其他用户,对二进制程序:cat 有执行(x)的权限
        普通用户:darker 对系统文件:/etc/shadow 没有任何权限
        
        
    默认情况下:
        普通用户:darker 执行二进制程序:cat
        系统会创建1个:cat进程
        该进程的属主属组是该程序的发起者:darker,也就是: darker:darker
        cat进程 访问系统文件:/etc/shadow
        cat进程的属主和属主:darker:darker    /etc/shadow文件的属主和属主:root:root
        二者的属主属组不匹配,所以被拒绝访问了:Permission denied
        
        
    给二进制程序:cat 设置SUID之后:
        普通用户:darker 执行二进制程序:cat
        系统会创建1个:cat进程
        执行者对于该二进制可执行文件具有 x 的权限,执行者将拥有该文件的属组的权限
        该进程属主是程序的发起者:darker,属组是cat原来的:root,属主属组就是:darker:root
        cat进程 访问系统文件:/etc/shadow
        cat进程的属主和属主:root:darker    /etc/shadow文件的属主和属主:root:root
        二者的属主匹配,可以正常访问

    SGID

     

    1.权限设定的方法

    • 字母表示法
    chmod g+s 文件/目录        # 给文件/目录的属组添加s权限
    chmod g-s 文件/目录        # 删除文件/目录的属组的s权限
    • 数字表示法(第1位2表示SGID,后3位表示普通权限 rwx
    chmod 2755 文件/目录    # 给文件/目录的属组添加s权限
    chmod 0755 文件/目录    # 删除文件/目录的属组的s权限
    chmod 755 文件/目录        # 同上

    2.文件权限位的表示

    [root@localhost ~]# ll 1.txt
    -rwxr-sr-x. 1 root root 3243 Nov 25 15:41 1.txt

    3.SGID相关说明

    作用在二进制可执行文件上时:

    执行有SGID权限的程序时,该用户将继承该程序的属组权限

    作用在目录上时:

    该目录下所有用户新建的文件 都会自动继承该目录的属组

    当一个用户对某一目录有执行权限时,该用户就可以在该目录下建立文件

    如果该目录同时用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录的属组

     

    4.实例

    # (root用户)切换到/usr/loca/目录 并创建目录:test02
    [root@localhost ~]# cd /usr/local
    [root@localhost local]# mkdir test02
    
    
    # (root用户)查看目录:test02 的信息
    [root@localhost local]# ls -dl test02/
    drwxr-xr-x. 2 root root 6 Nov 25 14:19 test02/
    
    
    # !测试(root用户)在目录:test02 下创建文件:1.txt 并查看该文件的信息
    [root@localhost local]# touch /usr/local/test02/1.txt
    [root@localhost local]# ll /usr/local/test02/1.txt
    -rw-r--r--. 1 root root 0 Nov 25 14:19 /usr/local/test02/1.txt
    
    # !测试(普通用户)在目录:test02 下创建文件:2.txt 并查看该文件的信息
    [darker@localhost ~]$ touch /usr/local/test02/2.txt
    [darker@localhost ~]$ ll /usr/local/test02/2.txt
    -rw-rw-r--. 1 darker darker 0 Nov 25 14:20 /usr/local/test02/2.txt
    
    
    # (root用户)修改目录:test02 的权限
    [root@localhost local]# chmod 2773 test02
    
    
    # (root用户)再次查看目录:test02 的信息
    [root@localhost local]# ls -dl test02/
    drwxr-sr-x. 2 root root 6 Nov 25 14:20 test02/
    
    
    # !测试(root用户)在目录:test02 下创建文件:3.txt 并查看该文件的信息
    [root@localhost local]# touch /usr/local/test02/3.txt
    [root@localhost local]# ll /usr/local/test02/3.txt
    -rw-r--r--. 1 root root 0 Nov 25 14:21 /usr/local/test02/3.txt
    
    # !测试(普通用户)在目录:test02 下创建文件:4.txt 并查看该文件的信息
    [darker@localhost ~]$ touch /usr/local/test02/4.txt
    [darker@localhost ~]$ ll /usr/local/test02/4.txt
    -rw-rw-r--. 1 darker root 0 Nov 25 14:21 /usr/local/test02/4.txt

    SBIT

    SBIT 是 the restricted deletion flag or sticky bit 的简称,有时也称为Sticky,粘滞位

    SBIT 与 SUID 和 SGID 的关系并不大

     

    1.权限设定的方法

    • 字母表示法
    chmod o+t 文件/目录        # 给文件/目录的其他用户设置Sticky
    chmod o-t 文件/目录        # 删除文件/目录的其他用户的Sticky
    • 数字表示法(第1位1表示添加Sticky位,后3位表示普通权限 rwx
    chmod 1755 文件/目录        # 给文件/目录的其他用户设置Sticky
    chmod 0755 文件/目录        # 删除文件/目录的其他用户的Sticky
    chmod 755 文件/目录            # 同上

    2.文件权限位的表示

    • 文件other位有x权限,并且用t代替了,表示被设置了Sticky
    • 如果other位没有x权限,会显示为大写T,表示有故障(权限无效)
    [root@localhost local]# ls -dl test03
    drwxr-xr-t. 2 root root 18 Nov 25 14:34 dir01

    3.相关说明

    • 对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件/目录
    • 只能作用在目录上,普通文件设置无意义,而且会被Linux内核忽略
    • 用户在设置 Sticky 权限的目录下新建的目录不会自动继承Sticky权限
     

    4.实例

    # (root用户)切换到 /usr/loca/目录
    [root@localhost ~]# cd /usr/local
    
    
    # (root用户)递归创建test03目录及2个子目录dir1和dir2
    [root@localhost local]# mkdir -p test03/dir{1,2}
    
    
    # (root用户)创建2个用户:user01、user02
    [root@localhost local]# useradd user01
    [root@localhost local]# useradd user02
    
    
    # (root用户)分别设置dir1和dir2的属主属组为user01和user02
    [root@localhost local]# chown -R user01:user01 test03/dir1
    [root@localhost local]# chown -R user02:user02 test03/dir2
    
    
    # (root用户)查看目录:test03的信息
    [root@localhost local]# ls -dl test03
    drwxr-xr-x. 4 root root 28 Nov 25 15:37 test03
    
    [root@localhost local]# ll test03
    total 0
    drwxr-xr-x. 2 user01 user01 6 Nov 25 15:37 dir1
    drwxr-xr-x. 2 user02 user02 6 Nov 25 15:37 dir2
    
    
    # (root用户)修改目录:test03 的权限
    [root@localhost local]# chmod 1777 test03
    
    
    # (root用户)查看目录:test03的信息
    [root@localhost local]# ls -dl test03
    drwxrwxrwt. 4 root root 28 Nov 25 15:37 test03
    
    [root@localhost local]# ll test03
    total 0
    drwxr-xr-x. 2 user01 user01 6 Nov 25 15:37 dir1
    drwxr-xr-x. 2 user02 user02 6 Nov 25 15:37 dir2
    
    
    
    # 切换到普通用户:user01
    [root@localhost local]# su - user01
    
    
    # !测试(普通用户)切换到test03目录
    [user01@localhost ~]$ cd /usr/local/test03
    
    
    # !测试(普通用户)查看当前目录下的信息
    [user01@localhost test03]$ ll
    total 0
    drwxr-xr-x. 2 user01 user01 6 Nov 25 15:37 dir1
    drwxr-xr-x. 2 user02 user02 6 Nov 25 15:37 dir2
    
    
    # !测试(普通用户)用户user01将dir1重命名为dir11
    [user01@localhost test03]$ mv dir1 dir11
    
    # !测试(普通用户)用户user01将dir2重命名为dir22
    [user01@localhost test03]$ mv dir2 dir22
    mv: cannot move ‘dir2’ to ‘dir22’: Operation not permitted
    
    
    # !测试(普通用户)用户user01在dir11目录中创建文件:1.txt
    [user01@localhost test03]$ touch dir11/1.txt
    
    # !测试(普通用户)用户user01在dir2目录中创建文件:2.txt
    [user01@localhost test03]$ touch dir2/2.txt
    touch: cannot touch ‘dir2/2.txt’: Permission denied

    5.注意点

    • SBIT 目前只对目录有效,用来阻止非文件的所有者删除文件:比较常见的例子就是/tmp 目录
    • 权限信息中最后一位 t 表示该目录被设置了 SBIT 权限
    • SBIT 对目录的作用是:当用户在该目录下创建 新文件或目录时,仅有自己和 root 才有权力删除,主要作用于一个共享的文件夹(目录)
     

    三:chattr

     

    引言

    你是否遇到过文件或目录具有可读写权限,但是使用root用户删除、修改时提示"Operation not permitted"的情况?

    可能是由chattr设置了文件的隐藏保护权限导致

    通过chattr命令修改文件或目录属性能够提高系统的安全性

    与chmod命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制是由chattr命令改变的。

     

    说明

    这两个命令在工作中用的比较少,经常用到的场景就是解决"Operation not permitted"问题

     

    chattr 命令语法

     

    语法

    chattr [+-=] [ASacdistu] File/Directory

    选项说明

    选项释义
    +-= 分别为 [+ 增加] [- 减少] [= 设定] 指定属性
    A 当设定了 A 这个属性时,文件或目录的存取时间atime (访问时间) 将不可被修改
    S 这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中!
    可以有效的避免数据流失!
    a 文件将只能增加数据,而不能删除,只有 root 才能设定这个属性
    C 这个属性设定之后,将会自动的将此文件『压缩』
    在读取的时候将会自动解压缩出来,但是在储存的时候,将会先进行压缩之后再储存
    d 当 dump (备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)具有 dump 功效!
    i 指定文件不能被删除、改名、也无法写入或新增数据!对于系统安全性有相当大的帮助!
    j 当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在 journal 中!
    但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了日志了,所以这个属性无效!
    s 当文件设定了 s 参数时,他将会被完全的移除出这个硬盘空间
    u 与 s 相反的
    当使用 u 来设定文件时,则数据内容其实还存在磁盘中,可以使用来 undeletion
     

    chattr 使用实例

     

    1.设置指定文件的隐藏属性,使其无法删除、修改

    # 添加"i"隐藏属性后,就无法更动config.conf这个文件了
    chattr +i /home/config/config.conf 

    2.取消文件的删除、修改保护权限

    # 解除"i"这个隐藏属性
    chattr -i /home/config/config.conf 

    lsattr 命令语法

     

    语法

     lsattr [-aR] File/Directory

    选项说明

    选项释义
    -a 将隐藏文件的属性也列出来
    -R 连同子目录的数据也一并列出来
     

    lsattr 使用实例

     

    查看指定文件隐藏属性

    # 查看文件:file.txt的隐藏属性
    lsattr file.txt

    四:umask

     

    1.新建文件、目录的默认权限是由umask决定的

     

    ① uid>199并且属主与属组相等的用户下,umask: 0002

    • 文件:664
    • 目录:775
     

    ② 除1之外的其他用户下,比如root用户,umask: 0022

    • 文件:664
    • 目录:755
     

    ③ 默认权限(在umask的影响下)

    • 文件默认权限:666
    • 目录权限默认:777
     

    2.权限的计算方法

     

    文件权限的计算方法:偶数位直接相减,奇数位相减后加1

    文件的起始权限值umask值操作计算后的文件权限值
    666 022 (每位如果都是偶数) 直接相减 644
    666 033 (每位如果有奇数或偶数) 相减(奇数位相减后在其原奇数 位加1) 644
    666 325(每位如果有奇数或偶数) 相减(奇数位相减后在其原奇数 位加1) 442
     

    目录权限的计算方法:直接相减即可

    文件的起始权限值umask值操作计算后的文件权限值
    777 022 相减 755
    777 033 相减 744
    777 325 相减 452
     

    3.设置umask

     

    临时设置umask

    [root@localhost local]# umask 000    # 设置umask为000

    永久设置umask

    # 用vim编辑/stc/profile
    [root@localhost local]# vim /etc/profile    # 或者:vim /etc/bashrc
    
    
    # 在最后添加如下代码
    if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
    umask 002 //表示uid大于等于199的默认umask值,表示普通用户
    else
    umask 022 //表示uid小于199的默认umask值,表示root
    fi
  • 相关阅读:
    设计模式系列
    Python3 系列之 可变参数和关键字参数
    设计模式系列
    【HANA系列】SAP HANA ODBC error due to mismatch of version
    【FICO系列】SAP FICO FS00修改科目为未清项目管理
    【FIORI系列】SAP OpenUI5 (SAPUI5) js框架简单介绍
    【HANA系列】SAP HANA SQL获取当前日期加若干天后的日期
    【HANA系列】SAP HANA SQL获取本周的周一
    【HANA系列】SAP HANA SQL获取当前日期
    【HANA系列】SAP HANA SQL获取当前日期最后一天
  • 原文地址:https://www.cnblogs.com/ltyc/p/14056855.html
Copyright © 2011-2022 走看看