zoukankan      html  css  js  c++  java
  • Linux权限管理

    1、基本权限

    文件权限位,10位:-rwxr-xr-- 第一位表示文件类型,后面3组就是权限,第一组是u所有者,第二组是g所属组,第三组是o其他人  r 读,w 写 ,x 执行

    权限修改:chmod [选项] 模式 文件名

    选项-R表示递归全部赋予命令指定权限

    比如:chmod u+x abc.avi 给当前用户可执行权限

    chmod g+w,o+w abc.avi

    减权限:chmod u-x,g-w abc.avi

    不用考虑之前的,直接对应赋予对应组权限:chmod u=rwx,g=rw abc.avi

    给所有用户赋权限:chmod a=rwx abc.avi 三组权限都一样,一般不常用

    常用的数字方式:chmod 755 abc.avi

    chmod 644 abc.avi 使用比较灵活,r=4,w=2,x=1,二进制指数,避免的歧义和重复

     

    读权限r:对于普通文件,有r权限就可以查看文件内容,如果对目录有读权限,那么可以查看目录下的文件列表

    写权限w:对于普通文件,有w权限就可以用vi vim echo编辑文件内容,但是不能删除文件

    文件的数据本身属于文件本身的权限控制,文件名称属于目录存放的数据

    如果对目录有w权限,就可以修改文件的名称或者删除文件,以及修改目录名称,在目录下面进行任何的操作

    执行权限x:对于文件可以运行可执行的脚本;如果对目录有x权限,那么可以进入目录,cd进去

     

    对于文件来说最高权限是执行,对目录来说最高权限是写

     

    对目录来讲 只有0 5 7是有意义的

    这些权限限制对root用户是没有用的,root用户可以操作任何权限的目录和文件

     

    chown改变文件所有者

    chown user1 abc 然后权限仍然是:755这样user1用户权限是7,就可以正常访问了

    chgrp group abc 是修改文件的所属组

    chown user1:group1 abc 可以同时修改用户和组,冒号前面是用户,后面是组

    同样加-R是递归修改,-v查看修改过程详细信息

     

    对于web服务器等服务端平台,实际开发过程中分配权限的核心原则是:在最小权限下能够满足要求即可,符合最小权限原则

     

    umask 查看默认权限:root用户:0022 普通用户:0002 (文件刚建立时的默认权限,根据这个可以分析默认情况下文件和目录的权限)

    第一位0代表特殊权限

    文件默认权限是不能执行的,所以最大权限是666,所以文件的默认权限是666换算成字母减去umask值换算成字母相减就是rw-rw-rw-  减去 --- -w- -w- = rw-r--r-- = 644

    如果umask是033,则rw-rw-rw- 减去 --- -wx -wx = (空减去x仍为空,所以仍然为644) rw-r--r-- = 644

    暂时修改umask值:umask 0033

    目录的最大权限是777,所以仍然是:rwxrwxrwx 减去 --- -w- -w- = 755

    umask值最小,权限最大,umask值最大,权限最小

     

    永久修改umask值,配置文件和环境变量在同一个文件:/etc/profile

    这里面的if语句是用来判断普通用户还是root用户的,修改这个文件可以永久修改umask值

     

    2、特殊权限

    ACL权限:任何目录都只能有一个用户和一个组,某些特殊要求下需要ACL权限,ACL权限是为了解决用户身份不够用的情况

    原来ACL是为了挂载分区使用的

     

    dumpe2fs -h /dev/sda5 列出超级块信息,可以查看acl权限的存在状态

    临时给分区赋予acl权限,重新挂载即可,比如根分区:mount -o remount,acl /

    如果分区默认没有acl权限,设置默认挂载需要修改配置文件:/etc/fstab

    即把后面的defaults添加修改为defaults,acl

     

    查看文件的acl权限:getfacl 文件名 默认是没有的,查看只显示普通权限

    设置权限:setfacl 选项 文件名

    添加ACL权限:setfacl -m u:lw:rx av 给用户lw设置av文件为rx权限,这样再使用ls -l查看最后一位从之前的.变成了+

    然后通过getfacl av可以看到多了一行user:lw:r-x这就是acl权限,如果是给组设置就用g

    还有一行mask::rwx这是指控制用户最高权限,需要和实际的权限进行与运算得到的才是用户真正的权限

    r && r=r r && - = - - && r = - - && - = -,所以实际权限为:r-x && rwx = r-x 还是一样的

    修改mask值:setfacl -m m:rx av

    这时候就算设置:setfacl -m u:lw:rwx av 最后用户lw的权限仍然是r-x

    权限可以设置多个用户

    删除指定用户权限:setfacl -x u:lw av 同样删除组是用g:组名

    删除文件所有的acl权限,所有用户和组的权限都会被删除:setfacl -b av

     

    递归设置目录下所有文件都有对应用户的acl权限:setfacl -m u:lw:rx -R av

    但是上面方法导致av下所有的文件都有x可执行权限,这样文件权限就太高了,不可避免的导致了权限溢出

    默认情况下目录默认mask为rwx,文件是r-x

     

    给目录设置默认acl权限,以后该目录下所有新建文件或者目录都会继承这个acl权限

    设置默认acl权限命令:setfacl -m d:u:lw:rw -R /home/av

    设置后使用getfacl查看配置都变成了默认的,设置默认acl只会对之后产生的文件赋予acl权限,之前已经有的文件不会被设置权限

    递归权限设置当前存在的文件,默认权限设置以后目录新放进去的文件

     

    默认权限和递归权限都是针对目录来说的,对普通文件没有任何意义

     

    sudo是用户操作命令的权限,重点是针对于命令,而其他都是针对用户操作所有文件的权限

    超级用户应该赋予权限,普通用户才可以使用

    通过命令visudo可以配置权限,相当于修改配置文件/etc/sudoers

     

    user ALL=(ALL) ALL

    user是要赋予权限给哪个用户,ALL是被管理主机的地址,(ALL)是可使用的身份,ALL是授权使用的命令的绝对路径(一定是绝对路径)

    如果是本地一台主机,ALL和本地IP作用一样

    %group ALL=(ALL) ALL

    这里是修改组名

    命令可以带参数,写的越详细限制就越严格,只写命令代表可以执行所有的参数

    比如执行visudo打开文件定位到最后一样添加:user1 ALL=(ALL) sbin/shutdown -r now

    这样就给user1用户赋予了重启计算机的权限

    普通用户通过命令:sudo -l 回车后按提示输入密码可以查看自己可以执行哪些命令,否则默认没有sudo权限

    普通用户执行命令必须严格执行(必须写绝对路径):sudo /sbin/shutdown -r now 这样才可以正确执行

     

    添加visudo也可以写成:user1 ALL=/usr/sbin/useradd 效果是相同的

    比如更改密码添加:user1 ALL=/usr/bin/passwd 这样一定是不可以的!这样普通用户一旦得到权限,就有可能更改root用户的密码,所以应该使用正则表达式匹配

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

    这样就可以更改一般用户密码,但是不能更改root用户密码了,注意上面逗号后面必须加空格,

    这样用户在执行上面设置的命令时,身份是root用户,一定要注意这个关系

     

    某些特殊的权限是系统内部使用的权限,一般不太常用,比如SetUID,SetGID等,强烈建议不要修改,对服务器影响很大

    umask第一位是特殊权限的定义

    只有可执行的文件才可以设置SUID权限,如果文件不可执行则没有任何意义

    对可执行文件赋予SUID可以写成:chmod 4775 abc 第一位补充一个4,这样文件的权限就设置为rwsrwxr-x了,s就代表SUID权限,此时文件颜色变为红色,表示警告,如果没有r权限 ,那么文件权限会变为S权限,大写的S代表错误,所以s=r+S才可以正确执行

    命令执行者必须可执行文件有x执行权限才可以执行s权限,

    系统中passwd命令就有s权限,所以普通用户可以间接的通过passwd的s权限提升为所有者即root用户,对/etc/shadow密码文件进行修改,修改完毕,权限回归(灵魂附体只在普通用户执行带s权限的命令的过程中有效),如果文件没有SUID权限,则普通用户权限不会提升

    设置SUID权限的命令是:chmod 4775 文件名或者chmod u+s 文件名

    取消SUID权限的命令是:chmod 0775 文件名或者chmod u-s 文件名

    设置SGID权限的命令是:chmod g+s 文件名或者chmod 2775 文件名,作用和前面一致,提升用户组的权限

     

    正常情况下严格控制文件,不要手动设置SetUID权限,系统中定期检查是否出现不常见的SUID权限的文件,如果出现服务器就有可能被注入后门,要尽快清除

    清除方法如下:

    首先系统正常情况下设置模板文件保存系统中所有带SUID权限的文件:

    find / -perm -4000 -o -perm -2000 > /root/suid.log

    然后编写脚本,(注意:shello脚本空格严格区分,注意关键词间的空格间隔):

    #!/bin/bash
    find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
    for i in $(cat /tmp/setuid.check)
    do
    grep $i /root/suid.log > /dev/null
    if [ "$?" != "0" ]
    then
    echo "$i isn't in listfile!" >> /root/suid_log_$(date +%F)
    fi
    done
    rm -rf /tmp/setuid.check

    然后执行脚本:

    chmod 755 suid_check.sh

    ./suid_check.sh

    当脚本执行完毕后,在root目录下就会出现suid_log_当前日期这样一个文件,这个时候打开这个文件,里面就是所有除系统默认之外的拥有SUID权限的文件,只需要把列表文件删除即可

     

    SGID权限既可以对可执行文件设置也可以对目录设置,

    如果对于文件SGID和SUID相似,只有可执行权限的文件才可以设置SGID权限,

    chmod g+s abc或者chmod 2777 abc,设置后组权限有个s,只有普通用户执行时权限提升为组权限,执行完毕同样权限回归

    比如普通用户可以执行locate命令提升组为slocate从而搜索数据库文件/var/lib/mlocate/mlocate.db

     

    如果对于目录赋予权限,普通用户必须对目录有r和x权限,如果此时目录也有SUID权限,如果普通用户进入目录时,用户在此目录中的组权限就是该目录的所属组,用户如果对该目录有w权限,则用户在该目录下新建的文件或者目录所属组都是用户的所属组,而不是用户本身的所属组

    SGID权限比SUID权限稍微安全一些,同样不建议随便使用

     

    SBIT权限只针对目录有效,如果用户和用户组外其他用户对目录有rwx权限,即7权限,即可以查看并且在目录中创建文件,

    首先建立目录,设置权限为chmod 777 abc

    默认情况下其他用户虽然不能修改abc目录下root用户和组建立的文件内容,但是由于对目录有写权限,所以可以删除abc下面的文件,当设置SBIT粘着位之后,那么其他用户就算对目录拥有rwx权限,但是也不能删除这个目录下root用户创建的文件了,而只能删除自己的文件

    设置SBIT权限,chmod o+t abc,设置后第三组其他用户权限变为rwt,t就代表SBIT

    /tmp目录就拥有SBIT权限,默认情况下所有用户都拥有新建文件的权限等,默认情况下对指定文件没有写权限,所以不能删除也不能对其他用户的文件有任何操作,这样就发挥临时目录的作用

    在web服务器目录中,不要设置目录权限为777,虽然这样方便,最好的方法是要更合理的调整用户符合分配最小权限原则,够用即可

     

     

    之前设置给目录设置SBIT权限后,虽然目录下文件不能删除,但是可以修改内容,用不可改变位权限可以解决这个问题

     

    不可改变位设置:

    对于文件和目录都生效:chattr +i abc

    通过lsattr abc可以查看这个文件具体的权限,可以看到+i后权限里面除了e还多出来一个i

    通过lsattr -d abc可以查看目录的不可改变位权限

    给普通文件设置i权限后,所有用户包括root都不能修改该文件的内容或者删除文件,但是root用户本身可以赋予或者取消该权限设置,同样拥有控制权

    如果给目录设置i权限后,只能修改目录下文件内的内容,不能建立和删除下面的文件也不能对文件重命名

    取消i权限:chattr -i abc

     

    a权限,对文件或者目录设置a权限:chattr +a abc

    给文件赋予a属性,属性中会多一个a,则文件里面只能追加内容,但是不能删除文件也不能减少内容,用vi/vim追加是无效的,会被系统禁止,但是可以用 echo abcd >> abc这样的方式正确追加

    如果对目录设置a属性,则只可以在目录中建立新文件,但是不能删除或者修改旧文件名,但可以修改文件内容,但是会有警告,已经建立的新文件也无法删除

    取消a权限:chattr -a abc

     

    i和a权限同样不建议随便使用,还是建议灵活使用系统的基本权限以及默认权限,必要时再使用特殊权限,提高系统的稳定性和安全性。

  • 相关阅读:
    ubuntu用mentohust连接ruijie
    vim系统剪切板
    JSP 页面中用绝对路径显示图片
    response.setContentType与 request.setCharacterEncoding 区别
    安装mysql数据库要注意的
    eclipse link方式安装插件安装不上
    Windows程序调用dll
    DP 问题
    LeetCode Repeated Substring Pattern
    LeetCode Number of Segments in a String
  • 原文地址:https://www.cnblogs.com/wxisme/p/5198910.html
Copyright © 2011-2022 走看看