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