五、文件权限管理

本文绝大部分参考骏马金龙

https://www.cnblogs.com/sstjustdoit/p/9954791.html

一、文件/目录的权限

1.文件的权限

每个文件都有其所有者(u:user)、所属组(g:group)和其他人(o:other)对它的操作权限,a:all则同时代表这3者。权限包括读(r:read)、写(w:write)、执行(x:execute)。在不同类型的文件上读、写、执行权限的体现有所不同,所以目录权限和普通文件权限要区分开来。

(1)在普通文件上:

r:可读,可以使用类似cat等命令查看文件内容;读是文件的最基本权限,没有读权限,普通文件的一切操作行为都被限制。

w:可写,可以修改其内容;

x:可执行,可以把此文件提请内核启动为一个进程 。(表示文件可由特定的解释器解释并运行)

  可以理解为windows中的可执行程序或批处理脚本,双击就能运行起来的文件。

 

(2)在目录上:

r:可以使用ls查看此目录中的所有文件;读是文件的最基本权限,没有读权限,目录的一切操作行为都被限制。

w:可以在此目录创建或删除文件/子目录;

x:可cd进入此目录,可使用ls -l查看文件的详细信息。可以理解为windows中双击就进入目录的动作。

X:只给目录x权限,不给文件x权限

如果目录没有x权限,其他人将无法查看目录内文件属性(只能查看到文件类型和文件名,至于为什么,见后文),所以一般目录都要有x权限。而如果只有执行却没有读权限,则权限拒绝。

一般来说,普通文件的默认权限是644(没有执行权限),目录的默认权限是755(必须有执行权限,否则进不去),链接文件的权限是777。当然,默认文件的权限设置方法是可以通过umask值来改变的。

2.权限的表示方式

权限的模式有两种体现:数字体现方式和字符体现方式。

权限的数字表示:"-"代表没有权限,用0表示,用1表示有权限
所以,用二进制表示:
rwx
111
转换为8进制:
r----4
w---2
x----1

111为4+2+1=7,举一反三:

  • rwx(111):7
  • rw-(110):6
  • r-x(101):5
  • r--(100):4
  • -wx(011):3
  • -w-(010):2
  • --x(001):1

文件权限示意图

3.权限的修改chmod:

能够修改权限的人只有文件所有者和超级管理员。

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...    #用rfile的文件权限模式替代file的权限模式
    -R 递归修改,只对当前已存在的文件有效

(1)使用数字方式修改

chmod 777 /data/filea

(2)使用字符方式修改权限

chmod [ugoa][+ - =] [权限字符] 文件/目录名
"+"是加上权限,"-"是减去权限,"="是直接设置权限

chmod u+x /data/file  #表示给user用户添加x权限
chmod g-w /data/file   # 表示给group去除w权限
chmod a+r  /data/file  # 表示给全部人添加r权限
chmod  o=r  /data/file  # 给予other用户r权限
chmod u+r,g-w,o=r

4.chown、chgrp

(1)chown - change file owner and group

注意,对于链接文件而言,默认不会穿过链接修改源文件,而是直接修改链接文件本身,这和chgrp的默认是不一样的。

chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...

选项说明:
    --reference=RFILE:引用某文件的所有者和所属组的值作为新的所有者和所属组
    -c  显示过程,但只当所有者或所属组被修改时才显现
    -v  显示过程, verbose
    -R:递归修改。注意,当指定-R时,且同时指定下面某一个选项时对链接文件有不同的行为
       -H:如果chown的文件参数是一个链接到目录的链接文件,则穿过此链接文件修改其源目录的所有者和所属组
       -L:目录中遇到的所有链接文件都穿越过去,修改它们的源文件的所有者和所属组
       -P:不进行任何穿越,只修改链接文件本身的所有者和所属组。(这是默认值)
       这3项若同时指定多项时,则最后一项生效

chown root:root /data/a1 #将/data/a1 的拥有者和所属组改为root
chown songtai /data/a2 #只修改所有者
chown :sst /data/a3 #只修改所属组
注意: :可替换. 他们可以互相转换

(2)chgrp - change group ownership

更改文件和目录的所属组,要求组已经存在。

注意,对于链接文件而言,修改组的作用对象是链接的源文件,而非链接文件本身

chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE...

选项说明:
-R:递归修改
--reference=dest_file  file_list:引用某文件的group作为文件列表的组,即将file文件列表的组改为dest_file的组

 


示例:
chgrp sales testfile
chown root:admins testfile
chmod u+wx,g-r,o=rx file
chmod -R g+rwX /testdir
chmod 600 file
chown mage testfile

二、umask 说明

umask值用于设置用户在创建文件时的默认权限。对于root用户(实际上是UID小于200的user),系统默认的umask值是022;对于普通用户和系统用户,系统默认的umask值是002。

默认它们的设置是写在/etc/profile和/etc/bashrc两个环境配置文件中。
执行umask num可以临时修改umask值为num,但这是临时的,要永久有效,需要写入到环境配置文件中,全局设置umask在/etc/bashrc;普通用户设置umask在~/.bashrc。至于写入到/etc/profile、/etc/bashrc、~/.bashrc还是~/.bash_profile中,看你自己的需求了。不过一般来说,不会去永久修改umask值,只会在特殊条件下临时修改下umask值。

grep -C5 -R "umask002"  /etc/  | grep "umash 022"  /etc
/etc/bashrc-        umask 022
/etc/csh.cshrc-    umask 022
/etc/profile-       umask 022

umask相关设置如下:
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
       umask 002
else
      umask 022
fi

 

umask是如何决定创建文件的默认权限的呢?

如果创建的是目录,则使用777-umask值,如root的umask=022,则root创建目录时该目录的默认权限为777-022=755,而普通用户创建目录时,权限为777-002=775.

如果创建的是普通文件,在Linux中,深入贯彻了一点:文件默认不应该有执行权限,否则是危险的。所以在计算时,可能会和想象中的结果不一样。如果umask的三位都为偶数,则直接使用666去减掉umask值,因为6减去一个偶数还是偶数,任何位都不可能会有执行权限。如root创建普通文件时默认权限为666-022=644,而普通用户创建普通文件时默认权限为666-002=664。

如果umask值某一位为奇数,则666减去umask值后再在奇数位上加1。如umask=021时,创建文件时默认权限为666-021=645,在奇数位上加1,则为646。

注:当umask是奇数时,目录不会加1,而文件会加1。

三、SUID、SGID、Sticky

前提:进程有属主和属组;文件有属主和属组

(1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限

(2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组

(3) 进程访问文件时的权限,取决于进程的发起者

(a) 进程的发起者,同文件的属主:则应用文件属主权限

(b) 进程的发起者,属于文件属组;则应用文件属组权限

(c) 应用文件“其它”权限

1.SUID

suid只针对可执行文件,即二进制文件。它的作用是对某个命令(可执行文件)授予所有者的权限,命令执行完成权限就消失。一般是提权为root权限。SUID设置在目录上无意义。

权限设置:
chmod  u+s  FILE...
chmod  u-s   FILE...
例如:

ll -d  /etc/shadow
----------. 1 root root 1251 Nov 14 10:32 /etc/shadow
但是,
ll -d /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

可见,passwd有s权限,所以其能修改密码。这个权限就是suid权限。
其中的"s"权限就是suid,它出现在所有者位置上(是root),其他用户执行passwd命令时,会暂时拥有所有者位的rwx权限,也就是root的权限,所以能向/etc/shadow写入数据。

suid必须和x配合,如果没有x配合,则该suid是空suid,仍然没有执行命令的权限,所有者都没有了x权限,suid依赖于它所以更不可能有x权限。空的suid权限使用大写的"S"表示。

数字4代表suid,如4755。

2.SGID

默认情况下,用户创建文件时,其属组为此用户所属的主组

一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组

一般针对二进制文件和目录。

  • 针对二进制文件时,权限升级为命令的所属组权限。
  • 针对目录时,目录中所建立的文件或子目录的组将继承默认父目录组,其本质还是提升为目录所属组的权限。此时目录应该要有rx权限,普通用户才能进入目录,如果普通用户有w权限,新建的文件和目录则以父目录组为默认组。
权限设定:
chmod g+s FILE...
chmod g-s  FILE...

以2代表sgid,如2755,和suid组合如6755。

3.Sticky

具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权。那么,如果在目录设置Sticky 位,就只有文件的所有者或root可以删除该文件。
注意:sticky 设置在文件上无意义!!只有设置在目录上才有意义。

权限设定:
chmod o+t DIR...
chmod o-t  DIR...

 

4.其他补充:

  1. suid/sgid/sticky的标志位都作用在x位,当原来的x位有x权限时,这些权限位则为s/s/t,如果没有x权限,则变为S/S/T。例如,/tmp目录的权限有个t位,使得该目录里的文件只有其所有者本身能删除。

    SUID: user,占据属主的执行权限位
    s: 属主拥有x权限
    S:属主没有x权限
    SGID: group,占据属组的执行权限位
    s: group拥有x权限
    S:group没有x权限
    Sticky: other,占据other的执行权限位
    t: other拥有x权限
    T:other没有x权限

  2. 特殊权限的数字法:
chmod 4777 /tmp/a.txt   #赋予suid权限
chmod 2777 /data          #赋予sgid权限
chmod 1777 /data          #赋予sticky权限
  1. 设定文件的特定属性:
chattr +i 不能删除、改名、更改  (-i取消该特定设定)
chattr +a  只能能追加内容  (-a 取消该设定)
lsattr  显示特定属性

 

四、访问控制列表:ACL权限

在计算机相关领域,所有的ACL(access control list)都表示访问控制列表。

文件的owner/group/others的权限就是一种ACL,它们是基本的ACL。很多时候,只通过这3个权限位是无法完全合理设置权限问题的,例如如何仅设置某单个用户具有什么权限。这时候需要使用扩展ACL。

扩展ACL是一种特殊权限,它是文件系统上功能,用于解决所有者、所属组和其他这三个权限位无法合理设置单个用户权限的问题。所以,扩展ACL可以针对单一使用者,单一档案或目录里的默认权限进行r,w,x的权限规范。

需要明确的是,扩展ACL是文件系统上的功能,且工作在内核,默认在ext4/xfs上都已开启。

CentOS7默认创建的xfs和ext4文件系统具有ACL功能

CentOS7之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加:

tune2fs –o  acl/dev/sdb1
mount  –o  acl/dev/sdb1 /mnt/test

1.设置和查看ACL

1.1

setfacl [options] u:[用户列表]:[rwx] 目录/文件名    # 对用户设置使用u
setfacl [options] g:[组列表]:[rwx]   目录/文件名    # 对组设置使用g

选项说明:
-m:设定ACL权限(modify)
-x:删除指定的ACL权限,可以指定用户、组和文件来删除(remove)
-M:写了ACL条目的文件,将从此文件中读取ACL条目,需要配合-m,所以-M指定的是modify file
-X:写了ACL条目的文件,将从此文件中读取ACL条目,需要配合-x,所以-X指定的是remove file
-n:不重置mask
-b:删除所有的ACL权限
-d:设定默认ACL权限,只对目录有效,设置后子目录(文件)继承默认ACL,只对未来文件 有效
-k:删除默认ACL权限
-R:递归设定ACL权限,只对目录有效,只对已有文件有效
posted @ 2019-08-05 16:16  幻落之瞳  阅读(563)  评论(0编辑  收藏  举报