• Linux之权限管理


    一、文件基本权限

    1) 基本权限的修改

    第一位“-”为文件类型(-代表文件;d代表目录;l代表软链接文件即快捷方式),后面每3位一组。

    -rw-r--r--

    rw-   u所有者

    r--   g所属组(相同身份、相同权限)

    r--   o其他人

    r读 w写 x执行

    1、 chmod命令

    chmod [选项] 模式 文件名

    选项

    -R:递归

               模式

                                [ugoa][+-=][rwx]

                                [mode=421]

    2、 修改权限的方式

    chmod  u+x test.txt(给所有者执行权限)

    chmod g+w,o+w test.txt(给所属组和其他人写权限。)

    chmod a=rwx text.txt(给所有全部的人读、写、执行权限。)

    chmod u-x cangls.av(取消所有者的执行权限。)

    chmod g-w,o-w cangls.av(取消所属组和其他人的写权限。)

    3、 权限的数字表示

    r----4

    w----2

    x----1

    rwxr-xr-x

    7  5  5

    拓展:

    000 ---:无权限(换算成八进制就是0)

    001 --x:执行(换算成八进制就是1)

    010 -w-:写(换算成八进制就是2)

    011 -wx:写和执行(换算成八进制就是3)

    100 r--:只读(换算成八进制就是4)

    101 r-x:读和执行(换算成八进制就是5)

    110 rw-:读写(换算成八进制就是6)

    111 rwx:读写执行(换算成八进制就是7)

    计算机只识别0和1,有电信号代表1,无电信号代表0,三个短横线(---),无非就是一个短横线上有值或者没值,都没值就用000代表,如上表示。2位相当于4进制,3位相当于8进制,4位相当于16进制。

    2) 权限的作用

    1、权限对文件的作用

    r:读取文件内容(cat  more  tail  head)

    w:编辑、新增、修改文件内容(vi  echo)

    #但是不包括删除文件

    x:可执行

    注:

    为什么文件有写权限不代表有删权限?因为文件名存在目录储存块(block)里(Linux中一切皆文件),文件数据存在文件储存块里,要删除文件数据,意味着要删除文件名,而文件名储存位置在更高一级(目录中),所以没有删除权限。要想进行删除操作,必须对目录储存块进行操作。

    文件夹<----文件<----文件数据

    2、权限对目录的作用

    r:可以查询目录下文件名  (ls)

    w:具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切(touch rm mv cp)

    x: 可以进入目录   (cd)

    总结:

    对文件来讲 最高权限是x

    对目录来讲 最高权限是w

    例如:图片中tomcat-7所属组和其他人是没有w(写)权限的。

     因此可以看出在此目录下创建文件或者目录都是没有权限的,被提示:Permission Denied(权限被拒绝)

    但是tomcat-7子目录logs的所属组是有w权限,进入logs目录下创建文件或者目录是被允许的。

    注:对目录来讲赋予权限,就只有0,5,7,赋其他的权限没有意义。因为只有执行权限才可以进入这个目录,不赋予执行权限其他权限都没有意义,例如:赋4,1,6都是没有意义的权限

    3) 其他权限命令

    1、 修改文件的所有者

    chown 用户名 文件名

    例如:chown ds abc.txt

    2、 修改文件的所属组

    chgrp 组名 文件名

    例如:chgrp group1 abc.txt

    chown root:root 123

    等价于

    chown root 123  chgrp root 123

    分配文件基本权限时,核心原则:在最小权限情况下能够实现要求即可。

     

    二、文件默认权限

    1) 查看默认权限的命令

    umask

    查看默认权限

    0022

    第一位0:文件特殊权限

    022:文件默认权限

    2) 文件的默认权限

    #文件默认不能建立为执行文件,必须手工赋予执行权限

    #所以文件默认权限最大为666

    #默认权限需要换算成字母再相减

    #建立文件之后的默认权限,为666减去umask值

    例如:

    文件默认最大权限666  umask值022

    -rw-rw-rw-  减去  -----w--w-  等于  -rw-r--r--

    例如:

    文件默认最大权限666  umask值033

    -rw-rw-rw-  减去  -----wx-wx  等于  -rw-r--r--

    3) 目录的默认权限

    #目录默认权限最大为777

    #默认权限需要换算成字母再相减

    #建立文件之后的默认权限,为777减去umask值

    例如:

    文件默认最大权限777  umask值022

    -rwxrwxrwx  减去  -----w--w-  等于  -rw-r--r--

    4) 修改umask值

    临时修改

    [root@localhost ~]# umask 0002

    永久修改

    [root@localhost ~]# vi /etc/profile(该文件称为环境变量配置文件)

    三、ACL权限

    1) ACL权限简介与开启

    1、 ACL权限简介

    在linux中文件和文件夹的用户身份就这三个:

    所有者、所属组、其他权限。

    有时候三个身份不够用,这时候就需ACL权限用来解决用户身份不足的问题。

    2、 查看分区ACL权限是否开启

    首先我们查看有哪些分区

    [zm@localhost ~]# df -h

    Filesystem            Size  Used Avail Use% Mounted on

    /dev/sda3              16G  2.4G   13G  16% /

    tmpfs                 935M  228K  935M   1% /dev/shm

    /dev/sda1             291M   37M  240M  14% /boot

    /dev/sda2             251M   45M  165M  23% /home

    其中tmpfs是一种基于内存的文件系统。根分区是sda3

    [root@localhost ~]# dumpe2fs -h /dev/sda3

    #dumpe2fs命令时查询指定分区详细文件系统信息的命令

    选项:

    -h  仅显示超级块中信息,而不显示磁盘块的详细信息。

    执行中该命令,显示出来的超级块中可以看到有一行

    Default mount option :user_xattr acl

    从中可以看到包含了acl权限,说明分区支持ACL权限,可以使用ACL命令

    3、 临时开启分区ACL权限

    [root@localhost ~]# mount -o remount,acl /

    #重新挂载根分区,并挂载加入acl权限

    4、 永久开启分区ACL权限

    [root@localhost ~]# vi /etc/fstab

    #该文件会影响linux系统的启动,千万谨慎修改。

    UUID=c2ca6f57-b15c-43ea=bca0-f239083d8bd2  /  ext4

    Defaults,acl  1(启动是否需要检测) 1(启动是否需要备份)

    #加入acl

     

    [root@localhost ~]# mount -o remount /

    #重新挂载文件系统或重启系统,使修改生效

    2) 查看与设定ACL权限

    1、 查看ACL命令

    [root@localhost ~]# getfacl 文件名     //查看acl权限

    # file:av

    # owner:tony

    # group:stu

    user::rwx(所有者)

    user:lw:r-x

    group::rwx(所属组)

    mask::rwx

    other::---(其它人)

    2、 设定ACL权限的命令

    [root@localhost ~]# setfacl 选项 文件名     //设定ACL权限的命令;

    选项:

    -m:设定ACL权限;

    -x:删除指定的ACL权限;

    -b:删除所有的ACL权限;

    -d:设定默认ACL权限;

    -k:删除默认ACL权限;

    -R:递归设定ACL权限;

    3、 给用户设定ACL权限

    [root@localhost ~]# useradd tony

    [root@localhost ~]# groupadd stu

    [root@localhost ~]# mkdir /av

    [root@localhost ~]# chown tony:stu /av

    [root@localhost ~]# chmod 770 /av

    [root@localhost ~]# useradd lw

    [root@localhost ~]# setfacl –m u:lw:rx /av

    #给用户st赋予r-x权限,使用“u:用户名:权限”格式

    4、 给用户组设定ACL权限

    [root@localhost ~]# groupadd tgroup2(添加一个组)

    [root@localhost ~]# setfacl -m g:tgroup2:rwx /av

    #为组tgroup2分配ACL权限。使用“g:组名:权限”格式

    3) 最大有效权限与删除ACL权限

    1、 最大有效权限mask

    mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和

    mask的权限“相与”(逻辑与运算)才能得到用户的真正权限

    #逻辑与运算:

    A

    B

    and

    r

    r

    r

    r

    -

    -

    -

    r

    -

    -

    -

    -

     

    2、 修改最大有效权限

    [root@localhost ~]# setfacl -m m:rx 文件名

    #设定mask权限为r-x。使用“m:权限”格式

    3、 删除ACL权限

    [root@localhost ~]# setfacl -x u:用户名 文件名

    #删除指定用户的ACL权限

    [root@localhost ~]# setfacl -x g:组名 文件名

    #删除指定用户组的ACL权限

    [root@localhost ~]# setfacl -b 文件名

    #删除文件所有的ACL权限

    4) 默认ACL权限和递归ACL权限

    1、 递归ACL权限

    ①    递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。

    ②    setfacl -m u:用户名:权限 -R 目录名。

    ③    递归权限仅能赋予目录,不能赋予文件。

    2、 默认ACL权限

    ①    默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么父目录中所有新建的子文件都会继承父目录的ACL权限。

    ②    setfacl -m d:u:用户名:权限 -R目录名。

     

    四、文件特殊权限

    1) SetUID

    1、 功能

    #只有可以执行的二进制程序才能设定SUID权限

    #命令执行者对该程序拥有x(执行)权限

    #命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件属主)

    #SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

    #如果对这个文件没有执行权限,然后赋予SetUID权限,s会变成大S。

    [root@localhost ~]# chmod 4644 abc

    [root@localhost ~]# ll

    -rwSr--r--. 1 root root  1498  7月 1  12:02  abc

    #在SetUID权限里,大S是不能正确使用的。

    2、 设定SetUID的方法

    • 4代表SUID

             #chmod 4755 文件名

             #chmod u+s 文件名(u代表所有者,s代表SetUID)

             #chmod 0755 文件名(取消SUID权限)

             #chmod u-s 文件名

    • u所有者

    g所属组(相同身份、相同权限)

    o其他人

    u+s:SUID权限

    g+s:GUID权限

    o+s:SBIT

    3、 举例

    [root@localhost ~]# ll /etc/shadow   (保存所有用户密码的文件)

    ----------. 1 root root  1498  7月 1  12:02  /etc/shadow

    #权限都为零,可见只有root用户和超级用户才能查看、修改这个文件。

    #但普通用户可以修改自己的密码,shadow权限又是零,是怎么做到的呢?

    [root@localhost ~]# ll /usr/bin/passwd 

    -rwsr-xr-x. 1 root root /usr/bin/passwd

    #原因就是passwd这个指令有SetUID权限,权限范围可以看出任何用户都有执行权限。任何用户在执行该命令的时候,会以root身份或者所有者身份来执行。

    #也就是说,只有文件具有SetUID权限,命令执行时当前用户身份才会切换到文件的所有者身份(类似灵魂附体)

    #既然这样,那不就能修改其他用户的密码了吗?

    #实际上linux限制了 passwd后面不能加其他参数,只有根用户才能指定用户名称。普通用户输入passwd 直接回车,修改当前用户的密码

    #cat命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容

    [root@localhost ~]# ll /bin/cat

    -rwxr-xr-x 1 root root  47976  6月 22  2017  / bin/cat

    4、 危险的SetUID

    #关键目录应严格控制写权限。比如“/”、“/usr”等

    #用户的密码设置要严格遵守密码三原则(复杂性、易记忆性、时效性)

    #对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限

    参考下面SUID与SGID检测脚本:

    #!/bin/bash

    find / -perm -4000 -o -perm -2000 > /tmp/setuid.check

    #搜索系统中所有拥有SUID和SGID的文件,并保存到临时目录中

    for i in $(cat /tmp/setuid.check)

    #做循环,每次循环取出临时文件中的文件名

    do

        grep $i /root/suid.log > /dev/null

        #比对这个文件名是否在模板文件中

        if[ "$?" != "0" ]

        #检测上一个命令的返回值,如果不为0,证明上一个命令报错

    then

        echo "$i isn't in listfile!" >> /root/suid_log_$(data+%F)

        #如果文件名不在模板文件中,则输出错误信息,并把错误写到日志中

     

         fi

    done

     

    rm -rf /tmp/setuid.check

    #删除临时文件

     

     

    2) SetGID

    1、 SetGID针对文件的作用

    只有可执行二进制程序才能设定SGID权限

    命令执行者要对该程序拥有x(执行)权限

    命令执行执行程序时,组身份升级为该程序文件的属组

    SetGID权限只在程序执行过程中有效

    [root@localhost ~]# ll /usr/bin/locate 

    -rwx--s--x 1 root slocate   /usr/bin/locate

     

    [root@localhost ~]# ll /var/lib/mlocate/mlocate.db 

    -rw-r----- 1 root slocate   /var/lib/mlocate/mlocate.db

    #/usr/bin/locate是可执行二进制程序,可以赋予SGID

    #执行用户lamp对/usr/bin/locate命令拥有执行权限

    #执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对

    /var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库

    #命令结束,lamp用户的组身份返回为lamp组

    2、 SetGID针对目录的作用

    普通用户必须对此目录必须拥有r和x权限,才能进入此目录

    普通用户在此目录中的有效组会变成此目录的属组

    若普通用户对此目录拥有w权限,新建的文件的默认属组是这个目录的属组

    3、 设定SetGID

    • 2代表SGID

    chmod g+s 文件名

    chmod 2755 文件名

    4、 取消SetGID

    chmod g-s 文件名

    chmod 0755 文件名

    3) Sticky BIT

    1、 SBIT粘着位作用

    • 粘着位目前只对目录有效
    • 普通用户对该目录拥有w和x权限,即普通用户可以在此目录有写入权限
    • 如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件

    2、 设置粘着位

    chmod 1755 目录名

    chmod o+t 目录名

    3、 取消粘着位

    chmod 0777 目录名

    chmod o-t 目录名

    注:如果没有特殊需求,特殊权限尽量少修改,特别是SetUID和SetGID。

     

    五、不可改变位权限

    1) chattr命令

    charrt [+-=] [选项] 文件名或目录名

    [+-=]

    +:增加权限

    -:删除权限

    =:等于某权限

    [选项]:常用的选项包括i和a

    i(insert):将此文件锁定

    如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下文件的数据,但不能建立和删除文件。

    a(append):冻结此文件

    如果对文件设置a属性,那么只能在文件中增加数据,但不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立和修改文件,但不允许删除。(添加内容只能用 echo >>输出重定向到文件中;禁止用vi,因为不能判断是修改还是增删内容)

    2) 查看文件系统属性

    lsattr 选项 文件名

    选项:

    -a 显示所有文件和目录

    -d 若目标是目录,仅列出目录本身的属性,而不是子文件的

    六、sudo权限

    1) sudo权限

    1、root把本来只能超级用户执行的命令赋予普通用户执行

    2、sudo的操作对象是系统命令

    2) sudo使用

    1、[root@localhost ~]# visudo  

    #实际修改的是/etc/sudoers文件

     

    2、运行上述命令,其中有这么一句话

    ##Allow root to run any commands anywhere

    ##Allows people in group wheel to run all commands

    root  ALL=(ALL)  ALL

    #用户名 被管理主机的地址=(可使用的身份)授权命令(绝对路径)

    3、 举例1

    普通用户(如usr1)是不能执行shutdown命令的。授权普通用户可以重启服务器

    [root@localhost ~]# visudo

    #在最后面添加以下命令,保存退出

    user1  ALL=(ALL) /sbin/shutdown –r now(写的越详细,权限越小)

    [root@localhost ~]# su -user1

    [root@localhost ~]$ sudo -l(查看可用的sudo命令)

    [user1@localhost ~]$ sudo /sbin/shutdown -r now

    #普通用户执行sudo赋予的命令

    举例2

    授权普通用户可以添加其它用户

    [root@localhost ~]# visudo

    #在最后面添加以下命令,保存退出。授予用户设定密码的权限

    user1  ALL=(ALL) /usr/sbin/useradd

    user1  ALL=(ALL) /usr/sbin/passwd

                     [user1@localhost ~]$ sudo /usr/sbin/useradd 用户名

                     [user1@localhost ~]$ sudo /usr/sbin/passwd 用户名

               这样授予的权限是很危险的,如果passwd后面不加用户名会以root身份执行

    命令,需写详细点,如:

    user1 All=/usr/bin/passwd

    [A-Za-z]*,  !/usr/bin/passwd "",  !/usr/bin/passwd  root

    #该命令中间注意空格,顺序不能颠倒。第一个是正则表达式,第二个感叹号是

    取反的意思,双引号里面空格是表达passwd后面不能有空格。

    4、# %wheel  ALL=(ALL)  ALL

    #%组名 被管理主机的地址=(可使用的身份)授权命令(绝对路径)

  • 相关阅读:
    phpfpm进程数设置多少合适
    GitLab的安装及使用教程
    男人的中年危机坏在哪?(转载)
    让敏捷落地,从“认识自我”开始
    优化你的架构设计
    工作中的那点事儿是工作经验,还是思路给了你生存的能力(原创)
    窗口过程处理WndProc遇到的问题
    CodeBlocks 10.0+OpenCV 2.4.0配置方法
    OpenCV在VS2010下永久性配置
    Win8下的STCISP下载问题解决
  • 原文地址:https://www.cnblogs.com/huhyoung/p/6670275.html
Copyright © 2020-2023  润新知