Linux之权限
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之权限相关的知识,希望对你有一定的参考价值。
基础权限
- 文件权限修改工具(chmod)
- chmod
修改文件权限位 chmod [OPTIONS] MODE[,MODE] FILES OPTIONS: -R 递归更新 --reference=RFILE 引用指定文件的权限位 MODE表示方法: 字母表示法 rwxrwxrwx 数字表示法 777 作用对象: 属主,使用‘u‘表示 属组,使用‘g‘表示 其他人,使用‘o‘表示 所有人,使用‘a‘表示 操作符号: + 添加权限位 - 删除权限位 = 左侧作用对象,右侧指定MODE(两侧留空为000) 示例: 设置权限 chmod 644 FILE chmod u=rw,g=r,o=r FILE 修改权限 chmod a+w FILE
- chmod
- 文件属主属组管理工具(chown,chgrp)
- chown
change file owner and group chown [OPTIONS] [OWNER[:GROUP]] FILES chown [OPTIONS] [OWNER[.GROUP]] FILES options: -R 递归修改 --reference=RFILE 引用文件的属主属组 示例: 修改属主 chown sadan FILE chown -R sadan DIR 修改属组 chown .sadan FILE chown -R .sadan DIR 修改属主属组 chown sadan:sadan FILE chown sadan:sadan DIR
- chgrp
修改文件属组 常用于当作用对象无用户 chgrp [options] GROUP FILE OPTIONS: -R 递归修改 --reference=RFILE 引用文件属组 示例: 设置属组 chgrp sadan FILE chgrp -R sadan FILE
- chown
- 遮罩码信息
- 权限位的计算方式
linux权限位有默认值,文件和目录的默认值不同. 为了防止文件有执行权限,文件的默认值为666. 目录的默认值为777. 新创建文件的权限位是由默认值与umask值直接的逻辑运算求得. 简单理解为: 新文件权限=默认权限-mask
- umask
mask是权限遮罩码,用于挡掉指定的权限位.而当原文件要挡掉的权限位不存在时,需要将其重新加回原文件权限位. umask 显示或设置mask值 umask 显示当前shell的mask值 umask MODE 设置mask权限 root和普通用户的umask默认值不同,其设置的文件为/etc/bashrc,有效脚本为: UID大于199且用户名和主要组名相同的用户设置为002,其它设置为022. if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then umask 002 else umask 022 fi 示例1: # umask 025 # umask 0025 # touch a # ll a -rw-r---w-. 1 root root 0 Aug 31 07:52 a 以上结果642,正常计算666-025=641 rw-rw-rw- 默认权限 ----w-r-x umask值 rw-r---w- 结果 默认权限中没有x权限,umask中有x权限,由于umask目的是为了遮住某些权限位, 因此减去没有的x时,需要重新将其添加回去.即6-5+1=2,得642. 示例2: # umask 025 # ll /etc/fstab -rw-r--r--. 1 root root 899 Aug 28 2017 /etc/fstab # cp /etc/fstab /tmp # ll /tmp/fstab -rw-r-----. 1 root root 899 Aug 31 07:57 fstab 正常计算,默认权限-umask为644-025=620,实际显示结果为640. 原因,使用cp复制文件时,默认权限不为666,而是文件自身的权限. 总结: 权限位的计算由默认权限-mask值 当默认权限中遮去不存在的权限位时,减去后需要再加回来 使用cp命令复制文件时,默认权限位是文件自身的权限位
- 权限位的计算方式
特殊权限
- SUID
SUID是linux特殊权限位之一,作用位置owner的权限位,使用‘u‘设置.SUID的表示方法为s,或4xxx. 当用户使用带有此权限的工具去对文件进行操作时,临时使用工具自身的属主去操作文件. 如下: sadan --> cat(sadan) --> /etc/shadow 此过程使用sadan为属主去访问shadow文件 sadan --> cat(root) --> /etc/shadow 此cat添加suid权限,cat自身的属主为root,因此最后是以root为属主去访问shadow文件 注意: SUID只对二进制的可执行文件有效.可以对任何文件设置其权限,但无效.
- SGID
SGID是linux特殊权限位之一,作用位置group的权限位,使用‘g‘设置.SGID的表示方法为s,或2xxx. 作用对象为二进制的可执行文件 当用户使用带有此权限的工具去对文件进行操作时,临时使用工具自身的属组去操作文件. 作用对象为目录 用户在此目录下创建的所有文件的属组都为此目录的属组
- Sticky
Sticky是linux特殊权限位之一,作用位置other的权限位,使用‘t‘设置.Sticky的表示方法为t,或1xxx. 作用对象为目录 此目录下的所创建的文件只有文件的属主能够删除,其他人无法删除.
- 特殊权限的修改
添加suid,设置suid chmod u+s FILE chmod 4xxx FILE 删除suid chmod u-s FILE 添加sgid,设置sgid chmod g+s FILE chmod 2xxx FILE 删除sgid chmod g-s FILE 添加sticky,设置sticky chmod o+t FILE chmod 1xxx FILE 删除sticky chmod o-t FILE
- 特殊权限的显示
示例: # ll total 0 ----------. 1 root root 0 Aug 31 06:29 file1 ---x--x--x. 1 root root 0 Aug 31 06:29 file2 # chmod u+s file1 file2 # chmod g+s file1 file2 # chmod o+t file1 file2 # ll total 0 ---S--S--T. 1 root root 0 Aug 31 06:29 file1 ---s--s--t. 1 root root 0 Aug 31 06:29 file2 以上总结: 当原文件有x权限时,特殊权限位显示为小写.无x权限时,则显示为大写.
文件属性权限
- 设置文件属性(chattr)
修改文件属性 chattr [options] +|- ATTR FILE options: -R 递归设置 ATTR: i 设置此权限后,文件只读(不能删除,修改) a 设置此权限后,文件不能删除,修改,可附加内容
- 显示文件属性(lsattr)
显示文件属性信息 lsattr [OPTIONS] FILE -R 递归显示
ACL
- acl启用
acl(access control list),用于灵活控制权限 要使用acl功能首先要启用此功能,acl功能在挂载磁盘时启用,CentOS7上挂载时会自动开启此功能. 查看默认挂载选项 # tune2fs -l /dev/sda1 |grep acl Default mount options: user_xattr acl 手动挂载时开启 # mount -o acl /dev/DEVICE /MOUNT_DIR ACL生效顺序: owner --> acl_owner --> group,acl_group(谁的权限大就使用谁的权限位) --> other
- acl设置和查看(setfacl,getfacl)
- setfacl,getfacl命令
setfacl 设置文件ACL setfacl [options] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ... setfacl --restore=file options: -b 清空ACL规则及结构 -k 删除默认ACL -R 递归操作 --set-file=-|FILE ‘-‘表示标准输出,根据stdin或文件内容设置acl规则 例:getfacl file1 | setfacl --set-file=- file2 -m|-x : ‘-m‘设置acl规则,‘-x‘删除指定acl规则(从命令行获取acl_spec) -M|-X : 同‘-m‘和‘-x‘,从文件或标准输出获取acl_spec acl_spec: [d:] [u:]uid|username [:perms] [d:] g:gid|groupname [:perms] [d:] m[:] [:perms] [d:] o[:] [:perms] u: 设置对象为owner g: 设置对象为group o: 设置对象为other d: 设置默认acl m: 设置mask perms 权限位 getfacl 显示文件acl规则 getfacl [options] file ... -R 递归查看
- 权限生效顺序
- 1 验证owner与acl_owner顺序 分别设置owner与acl_onwer权限为400,000.实验其结果,再将权限设置交换,再次验证其结果. 1.1 owner 400 acl_owner 000 设置相关环境 # echo 123 > /tmp/a # cd /tmp # chmod 400 a # chown liubei a # ll a -r--------. 1 liubei root 4 Aug 31 09:44 a # setfacl -m u:liubei:--- a # getfacl a|grep user user::r-- user:liubei:--- 进入liubei用户查看文件: # su - liubei $ cat /tmp/a 123 1.2 owner 000 acl_owner 400 # chmod 000 a # setfacl -m u:liubei:r-- a # getfacl a|grep user user::--- user:liubei:r-- 进入liubei用户查看文件: # su - liubei # cat /tmp/a cat: a: Permission denied 结论: owner优先于acl_owner - 2 验证group与acl_group顺序 实验说明: 分别设置group,acl_group权限为050,040,查看结果.再将权限设置交换,查看结果. 2.1 group 050 acl_group 040 设置相关环境 # vim /tmp/a.sh #!/bin/bash echo hello # cd /tmp # chmod 050 a.sh # chgrp liubei a.sh # setfacl -m g:liubei:r-- # getfacl a.sh |grep group # group: liubei group::r-x group:liubei:r-- 切换liubei验证结果 # su - liubei $ cd /tmp $ cat a.sh #!/bin/bash echo hello $ ./a.sh hello 2.2 group 040 acl_group 050 设置相关环境 # chmod 040 a.sh # setfacl -m g:liubei:r-x a.sh # getfacl a.sh |grep group # group: liubei group::r-x group:liubei:r-x 切换liubei验证结果 # su - liubei $ cd /tmp $ cat a.sh #!/bin/bash echo hello $ ./a.sh hello 结论: group和acl_group根据权限大小来决定谁生效. - 3 结果 owner > acl_owner > group,acl_group(权限大小) > other 此处不证明other与acl_other
- acl中的mask作用
acl中mask代表了acl的最高权限上限. 其mask影响acl_user,group,acl_group,acl_other的权限位. 其权限必须在mask权限范围内才可生效. mask在设定其它类型的acl规则时,会根据所有权限进行逻辑与后的值进行更新. 例: 设置acl_owner为-w-,再将mask值修改为rwx. 现在添加一个acl_group为r--,再次查看mask. # touch a # chmod 700 a # setfacl -m u:liubei:-w- a # setfacl -m m:rwx a # getfacl a |grep -E ‘user|group|mask‘ # group: root user::rwx user:liubei:-w- group::--- mask::rwx 此时mask值为rwx # setfacl -m g:liubei:r-- a # getfacl a|grep -E ‘user|group|mask‘ # group: root user::rwx user:liubei:-w- group::--- group:liubei:r-- mask::rw- 此时mask值变为rw- 大于mask的无效acl示例: # echo 123 > /tmp/a ;cd /tmp # chmod 000 a # chgrp liubei a # ll a total 0 ----------. 1 root root 0 Aug 31 10:54 a # setfacl -m g:liubei:r-- a 此时用liubei用户查看a # su - liubei $ cat /tmp/a 123 接着修改mask值为--- # setfacl -m m:--- a # getfacl a|grep group # group: liubei group::--- group:liubei:r-- #effective:--- 此时再次使用liubei用户查看a # su - liubei $ cat /tmp/a cat: a: Permission denied 注意: #effective:--- 表示的是权限大于mask的权限位会失效,当其他小于的权限位依然会有效. 如 #effective:-w- 表示只生效了w权限 建议: mask最后设置 临时将所有用户都设为0权限,直接将mask设为---
- default作用
默认acl的设置是为了能够在目录下创建的文件继承其acl规则. 默认acl规则只对未来创建的文件生效,不对当前已存在文件生效. 示例: # cd /tmp # mkdir a # touch a/b # chgrp -R liubei a # setfacl -Rm d:g:liubei:rwx a # getfacl -R a # file: a/ # owner: root # group: liubei user::rwx group::r-x other::r-x default:user::rwx default:group::r-x default:group:liubei:rwx default:mask::rwx default:other::r-x # file: a//b # owner: root # group: liubei user::rw- group::r-- other::r-- 没有默认acl # touch a/c # getfacl a/c # file: a/c # owner: root # group: root user::rw- group::r-x #effective:r-- group:liubei:rwx #effective:rw- 默认acl生成 mask::rw- other::r--
- setfacl,getfacl命令
- acl备份和恢复
主要的文件操作命令cp和mv都支持ACL,只是cp命令需要 加上-p 参数. 但是tar等常见的备份工具是不会保留目录 和文件的ACL信息 导出规则 getfacl -R /tmp/dir1 > acl.txt 清空规则 setfacl -R -b /tmp/dir1 恢复规则 setfacl -R --set-file=acl.txt /tmp/dir1 setfacl --restore acl.txt 查看规则 getfacl -R /tmp/dir1 总结: 备份的规则只能在原目录中生效
命令总结:
chmod,chown,chgrp,umask,chattr,lsattr,setfacl,getfacl
本文出自 “12064120” 博客,请务必保留此出处http://12074120.blog.51cto.com/12064120/1962907
以上是关于Linux之权限的主要内容,如果未能解决你的问题,请参考以下文章
Linux之acl库的安装与使用(限制Linux某用户的访问权限)