文件权限

image

修改文件的所属

文件的权限主要针对三类对象进行定义

owner 属主, u
group 属组, g
other 其他, o

每个文件针对每类访问者都定义了三种权限

r Readable
w Writable
x eXcutable

  • 注意:当判断一个用户对一个文件有什么权限时(先不考虑后面的ACL权限),是从左往右先看是否是属主,再看是否是属组。
  • 只要判断出当前用户是属主,则不再往后看后面的权限,即使后面属组设置的权限比属主还大(这样设置本身就不合理),同理 属组和其他用户也是这样判断。

文件:

r 可使用文件查看类工具获取其内容
w 可修改其内容
x 可以把此文件提请内核启动为一个进程

目录:

r 可以使用ls查看此目录中文件列表
w 可在此目录中创建文件,也可删除此目录中的文件
x 可以使用ls -l查看此目录中文件元数据(须配合r),可以cd进入此目录
X 只给目录x权限,不给文件x权限

修改文件的属主:chown

chown [OPTION]... [OWNER][:[GROUP]] FILE...
用法说明:
OWNER
OWNER:GROUP
:GROUP

  • 注意:上面分别是更改属主,属组,其中冒号也可用.替换
    -R: 递归
    chown [OPTION]... --reference=RFILE FILE...
  • 注意:递归修改这个命令如果不小心敲错,把根下面的所有文件的所属修改掉了,则造成无法挽回的后果,慎用.

cc### 修改文件的属组:chgrp
chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...
-R 递归

修改文件权限

模式法:

chmod [OPTION]... OCTAL-MODE FILE...
-R: 递归修改权限
chmod [OPTION]... MODE[,MODE]... FILE...
MODE:
修改一类用户的所有权限
u= g= o= ug= a= u=,g=
修改一类用户某位或某些位权限
u+ u- g+ g- o+ o- a+ a- + -
chmod [OPTION]... --reference=RFILE FILE...
参考RFILE文件的权限,将FILE的修改为同

数字法:

权限项 文件类型 执行 执行 执行
字符表示 (d|l|c|s|p) (r) (w) (x) (r) (w) (x) (r) (w) (x)
数字表示 4 2 1 4 2 1 4 2 1
权限分配 属主 属主 属主 属组 属组 属组 其他用户 其他用户 其他用户
  • 注意:如果所有者的权限什么都没有,那么当这个文件的所有者进行访问或者操作这个文件时,即使后面的属组和其他有权限也无法操作;但因为这个文件属于所有者,他可以先把文件的权限给更改后再进行操作即可.
  • 注意:文件的所有者可以更改文件的权限,但是不能更改文件的属主和属组
  • chmod a-x /bin/chmod :这个命令将会改掉chmod权限,则无法再使用这个进程,没事别这样乱用。

示例

chgrp sales testfile
chown root:admins testfile
chown zhang testfile
chown .zhang testfile
chmod u+wx,g-r,o=rx file
chmod -R g+rwX /testdir
chmod 600 file
chmod a= file (改为什么权限都没有)

特殊权限1

  • X(大写):利用chmod -r a+X 文件夹 :只增加文件夹的x权限而不增加文件的x权限避免风险
  • 要注意如果文件本身的三个x权限中如果其中已经至少有了一个x权限,则X权限也会加上文件的x权限,它是根据文件本身是否有其他的x权限来判断的

一些操作的注意点

  • 文件如果只有写的权限,则可以往里面写内容,但是不能看,可以用 >> 重定向写入,但是nano ,cat打不开它。注意和下面文件夹的相关权限区分。
  • 要复制一个文件(目录也是),最小权限是要有读权限,其他权限可以不需要
  • 在文件夹中,能不能创建和删除一个文件,是要看这个文件夹对于当前登录用户的权限,而不需要看这个需要创建或者删除的文件的权限(不论它对于任何人是什么权限,哪怕是属于其他人的文件,只要当前登录的用户对这个文件夹有写的权限,都可以删除它里面的任何文件)(前提是对这个文件夹必须要有x权限,不然即便有了w权限也无法操作)
  • 原因是删除和创建文件相当于在目录索引节点对应的数据存放位置修改数据(也就是索引节点中的指针对应的存放数据块位置),这个内容就是文件夹内的文件名称和对应的节点编号(类比于文件的话,就相当于是文件中的字符)因为有写的权限,所以可以删除和创建
  • 用户对文件夹只有x执行权限的话,可以cd进入文件夹,但是不能用ls查看里面的文件(相当于ls ~,因为没有r权限,肯定不行).但是如果已经知道里面的文件名,可以用ll 文件名 命令来查看这些已知文件的元数据
  • 但是如果用户对于这个文件夹没有x权限,则无法进入也无法查看里面的文件的元数据,也无法进行其他的对于它里面的文件的修改删除等操作,即使提前知道它里面文件的文件名
  • 如果再有了wx没有r,则可以有创建文件和删除文件的能力.
  • 如果对于一个文件夹只有r权限,则可以用ls命令查看它,会显示出此目录内的文件名,ll命令也可以使用,但无法查看里面文件的各种元数据
04:07[root@centos7 /data]# chmod o=r dirautest/

04:09[zhang@centos7 /data]$ ls dirautest/
ls: cannot access dirautest/11.t: Permission denied
ls: cannot access dirautest/22.t: Permission denied
ls: cannot access dirautest/33.t: Permission denied
11.t  22.t  33.t

04:08[zhang@centos7 /data]$ ll dirautest/
ls: cannot access dirautest/11.t: Permission denied
ls: cannot access dirautest/22.t: Permission denied
ls: cannot access dirautest/33.t: Permission denied
total 0
-????????? ? ? ? ?            ? 11.t
-????????? ? ? ? ?            ? 22.t
-????????? ? ? ? ?            ? 33.t

-如果想要查看目录的元数据 ll 目录 -d ,则要看当前用户对此目录的上一级目录权限有没有x权限,原理同上(因为目录也是个文件,相当于上一级目录里面的一个文件)(并不需要对目录的r权限,r权限可以用ls和ll不查看元数据只查看文件名列表,w权限可以创建删除)

  • 因此总结,对于文件夹想要w,必须前提有x;有了x可以cd进去和用ll查看已知文件名的文件元数据,这个命令的实现不需要考虑要查看的文件本身的权限,(要查看的文件本身的权限r对应的是查看这个文件内保存的信息,w修改它保存的信息,x则是二进制执行);同时没有x只有r则只能查看文件名列表,看不到元数据,也无法对里面的文件进行其他的任何操作,就只能看个名相当于。

例如:对于cp /etc/fstab /data/dir,需要什么权限?fstab是个文件,dir是个目录
1,cp要有x权限
2,etc要有x权限 ,fstab要有r权限
3,data要有x权限,dir要有wx权限

  • 总结:拷贝的时候,对于要拷贝的文件只要有r权限即可,前面的文件夹都只需要有x权限;对于要拷贝到的地方目录要有wx权限,它上级的目录都要有x权限(可以看出不论要对文件夹里面的文件作出任何操作,比如cp read write 执行等等,都要上级文件夹有x权限)
  • 同理:假设目标目录文件夹有了wx权限且它的上级目录有了x权限,经过测试发现:cp -a命令
    对于要拷贝的文件夹本身,不需要任何权限,这个文件夹可以直接在要拷贝到的目标目录里创建一个同名空文件夹,并保留原来的属性(前提是目标目录没有这样的同名文件夹),然后对于里面的文件,如果想要拷贝首先这个文件夹要有x权限,然后文件要有r权限;而对于里面的文件夹同理,不需要任何权限会直接创建一个新的空文件夹,然后和上面的同理)
  • 由此可见对于文件夹的拷贝,创建空文件夹并不需要任何权限,只是对于里面的文件则要这个文件夹本身x,文件要r,递归的文件也是这个规则)
  • cp -f 强行覆盖一个文件,本质是删除再创建,只看文件夹的wx权限,不看这个要覆盖的文件的权限
  • root账号不受权限限制,除了x执行权限之外

上面仅仅列出了cp ,cat 等其他命令也同理

这样做的好处就是可以隐藏部分文件,比如网站建设

附加操作:恢复被删除的家目录

删除前可以先新创建一个用户观察家目录里面有的文件和权限

  1. 先创建一个同名家目录文件夹
  2. cp -a /etc/skel/. /home/同名家目录文件夹
    • 前两步也可以直接cp -a /etc/skel /home/同名家目录文件夹
  3. chown -R 用户名.组名 同名家目录文件夹
  4. chmod 700 /home/同名家目录文件夹

umask

文件夹:umask+default=777
文件:umask+default=666, 但注意如果default计算结果为奇数,则每隔奇数+1

非特权用户umask是 002
root的umask 是 022
umask: 查看
umask munber:设定umask
示例:umask 002
umask u=rw,g=r,o=
umask –S 模式方式显示
umask –p 输出可被调用
例如:umask -p >> ~/.bashrc
如果.bashrc中有多个umask,则后面的生效,因为把前面的覆盖了
全局设置: /etc/bashrc (这里面也可以查看到之前的默认设置)
用户设置:~/.bashrc (echo umask ### >> .bashrc 或者nano, 然后用 source ~/.bashrc)

特殊权限2

SUID, SGID, Sticky

  • 分别对应u g o 的x位置,换为s
  • suid 4 sgid 2 sticky 1 ,写在普通权限前面
  • 比如用户可以间接用命令passwd修改shadow,但是不能对shadow直接任何操作,本来参照fd的安全上下文,是不能访问的
    11:32[root@centos7 /data]# ll `which passwd`
    -rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

    Linux安全上下文

    前提:进程有属主和属组;文件有属主和属组
    (1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有
    执行权限
    (2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
    (3) 进程访问文件时的权限,取决于进程的发起者
    (a) 进程的发起者,同文件的属主:则应用文件属主权限
    (b) 进程的发起者,属于文件属组;则应用文件属组权限
    (c) 应用文件“其它”权限

可执行文件加上s后,SUID,SGID会改变上面的进程的上文所属,表现为原来进程的属主和属组
  • s或者t小写表示进程所属有x权限,大写表示没有
  • 当u上有s的时候,则任何人利用这个程序的时候就会将上文属主切换到程序所有者,然后根据这个所有者来判断是否有权限操作
  • SUID作用在二进制可执行文件上才有意义
  • SGID则是作用在所有组的执行位置
  • 大写的S则是没有执行权限,就是x没有,但它因为本来就是为了执行二进制程序用的,所以基本上没有大S这种,没有意义.
sticky
  • Sticky 则是作用于目录的o上的执行位置上表现为t,为了让目录里面的文件只能自己删自己的,不能删除别人的。注意小t是把原来的x权限给遮住了,但是x权限仍然存在。/tep 就是这种文件夹
  • 注意,在不修改主组的前提下,如果用户在这个文件夹内创建一个文件,则它的所属永远是属于这个用户以及这个用户的主组
  • 如果新开一个工程,把这个文件夹当做存放资料的目录,想要用户之间相互修改文件数据,因为不能用o+w(这样这个文件所有的其他人也能修改了)的方式来修改文件权限;所以可以创建一个小组,把这个文件夹内的文件属于这个组,然后把参与这个工程项目的用户也添加到这个组内,只修改组的权限即可
  • 但是还有一个问题就是组内的成员新创建的文件仍然属于他自己的主组,不可能每次新建一个文件就改文件属组,所以仍需要一步,就是把这个整个文件夹的所属组改成这个小组,同时注意加上小g+s
  • 这样在这个组内新创建的文件(执行了x和s)就会属于这个组了
  • 唯一需要注意点就是如果在这里新创建文件夹,sgid可以继承,但是t权限则不会继承,在这个文件夹内的文件虽然属于这个小组,但是用户可以删除其他人的文件了(前提是这个文件夹创建时有了w权限)
12:09[root@centos7 ~]# groupadd devops
12:09[root@centos7 ~]# useradd zhang1
12:10[root@centos7 ~]# useradd zhang2
12:10[root@centos7 ~]# useradd zhang3
12:10[root@centos7 ~]# usermod -aG devlops zhang1
12:10[root@centos7 ~]# gpasswd -a zhang2 devlops
Adding user zhang2 to group devlops
12:11[root@centos7 ~]# groupmems -g devlops -a zhang3
12:19[root@centos7 ~]# groupmems -g devlops -l
zhang1  zhang2  zhang3 
12:11[root@centos7 ~]# mkdir /data/devposdir
12:15[root@centos7 ~]# ll /data/devposdir -d
drwxr-xr-x. 2 root root 6 Mar 14 12:15 /data/devposdir
12:22[root@centos7 ~]# chmod g+ws,o=rxt  /data/devposdir/
12:22[root@centos7 ~]# ll /data/devposdir/ -d
drwxrwsr-t. 2 root devlops 6 Mar 14 12:15 /data/devposdir/

总结

suid:
作用于二进制可执行的文件的所有者位上,功能:执行此文件的用户将临时继承此文件所有者的权限,做用于目录无意义
sgid:
1)作用于二进制可执行的文件的所属组位上,功能:执行此文件的用户将临时继承此文件所属组的权限
2)作用于目录的所属组位上(其实它也必须得包含x执行功能),功能:此目录中新建文件的所属组将自动从此目录继承
sticky:
作用于目录,功能:此目录的文件只能被所有者删除,作用于文件无意义

注意:root账号不受限制

对于所有用户包括root账户限制,设置特殊属性

chattr +i 文件:不能删除,改名,更改,可以查看
chattr +a 文件:只能追加内容
lsattr 文件:显示特定属性
去掉可以用-号

权限是依赖于文件系统(fat32就没有权限)

访问控制列表

ACL:Access Control List,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设置权限
CentOS7默认创建的xfs和ext4文件系统具有ACL功能,CentOS7之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加
tune2fs –o acl /dev/sdb1
mount –o acl /dev/sdb1 /mnt/test
ACL生效顺序:所有者,自定义用户,所有组和自定义组,其他人

  • 注意:ACL判断权限的时候只要找到了靠前的所属,后面的就不再寻找了,直接使用靠前的所属的权限,和判断默认权限的方法相同
  • 判断顺序:先判断是否是文件的OWNER,如果是,则执行OWNER的权限后结束,如果不是OWNER,则判断是否是ACL的USER,如果是则执行USER权限后结束,如果不是ACL的USER,则判断是否属于GROUP,如果是,则取组的权限,然后停止,如果不是则判断是否是ACL GROUP,是的话就执行ACL组权限,如果不属于任何GROUP,则执行OTHER。
  • 修改了ACL之后,在ll中显示的则是umask值,如果用chmod g 来修改,则更改的是umask值,这时候已经改不了group权限了

指令:

mount -o acl /directory
setfacl -m o::#### 所有人都设置权限
getfacl file |directory
setfacl -m u:wang:rwx file|directory
setfacl -Rm g:sales:rwX directory:递归设置文件夹下面的权限,这样的好处是可以暂时设置某用户权限,然后不用的时候再全部取消,十分方便。
setfacl -M file.acl file|directory:从文件中设置,按照格式
setfacl -m g:salesgroup:rw file| directory
setfacl -m d:u:wang:rx directory:设置目录默认权限,则新建的文件都会继承这个acl权限,类似于SGID
setfacl -x u:wang file |directory:删除权限,即使全部删除,ll仍然会有+号,所以最好用setfacl -b file 或者setfacl -bR directory
setfacl -X file.acl directory:按照格式删除acl
getfacl 可看到特殊权限:flags

一些需要注意的地方:

  • ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权
    限),而非传统的组权限
  • 通过ACL赋予目录默认x权限,目录内文件也不会继承x权限
  • base ACL 不能删除
  • setfacl -k dir 删除默认ACL权限,对应-d的那个命令
  • setfacl -RM d:x:xxx:xxx dir :默认选项的权限只是针对新创建的文件,它可以与对文件夹本身的权限不同,比如:
setfacl -Rm g:apps:rwx /testdir/dir
setfacl -Rm d:g:apps:rw /testdir/dir
  • setfacl –b file1清除所有ACL权限
  • getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2
  • cp -a 或者cp -p复制包含ACL的文件,不丢失ACL属性

  • mask只影响除所有者和other的之外的人和组的最大权限
  • Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective
    Permission),用户或组的设置必须存在于mask权限设定范围内才会生效 setfacl -m mask::rx file
  • --set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含
    UGO的设置,不能象-m一样只是添加ACL就可以
  • 示例:setfacl --set u::rw,u:wang:rw,g::r,o::- file1
备份和恢复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 :用这个的时候 acl.txt必须在要还原的目录下
getfacl -R /tmp/dir1

  • 注意:用getfacl -R 目录 :如果用绝对路径则会多出来一行 ,因此最好不要用绝对路径