Linux基础知识 ·

Linux权限管理

[隐藏]

权限划分的基本理念

在计算机中,无论是出于安全还是隐私,我们都需要划分各类的权限来便于管理,现在让我们来整理一下Linux中的权限管理

我们知道Linux中,每个用户都有自己的账户,都有自己的用户组,而有了用户与用户组的概念之后,我们就可以针对文件,依据账户和用户组划分权限,这就有了所有者与所属组的权限划分,而既不是文件所有者,又不是文件所属组的用户,就归为文件的其他人。这就是Linux中权限划分的基本理念,基于这个理念我们延展出了一套权限划分管理机制,现在让我们来看看详细的权限管理:

Linux文件属性

通过ls -al ,我们可以查看当前文件夹的所有文件的权限与属性。

我们来看看各个属性代表了什么:

 

1.文件类型。

-:文件(普通文件、纯文本文件ASCII、二进制文件、数据格式文件)。

d:目录。

l:链接文件。

b:块设备文件。

c:字符设备文件。

s:套接字文件。

p:管道文件。

2.权限。

3.连接数。

表示有多少文件链接到此i-node。

4.文件所有者。

5.文件所属组。

6.文件大小,默认单位为B。

7.文件创建时间或最近一次修改时间。

8.文件名。

权限的表示方式

在上述格式中,我们了解到在文件类型标识符后的9位为该文件的权限,而权限分别为读权限(read)、写权(write)限、执行权限(execute),对应表示表示为r、w、x,所有者、所属组、其他人,每个类别对应三种权限,依次合起来就有了9位标示符,若是对应类别没有相应权限,则用“-”标示,细心的朋友发现后面还有一个“.”,这个点则是衍生出来表述ACL状态。

其实我们可以用数字来表述三种权限:

r:4

w:2

x:1

而权限又分为了三组,所以在平时我们使用数字表示权限时,则可以将其累加组合起来。

例如:rwxr-xr--

所有者权限为读写执:rwx=4+2+1=7

所属组权限为读和执:r-x=4+1=6

其他人权限位读权限:r=4

组合起来就可以表述为764,注意依次为所有者、所属组、其他人,顺序不能乱。

这就是Linux中,基础的权限表述方式。

目录与文件权限的意义

目录是一种特殊文件,可以抽象的理解为它只是一个映射表,映射着其内文件的位置信息,目录本身并不存放数据。而它与数据文件的权限区别又是怎样的呢?

权限对文件的意义

文件是实际含有数据的地方,包括一般文本文件、数据库文件、二进制可执行文件等等,它的意义如下:

读权限(read):可读取此文件的实际内容。

写权限(write):可以编辑、新增、或是修改该文件的内容。

执行权限(execute):改文件具有可被系统执行的权限。

权限对目录的意义

目录主要的内容是记录文件名列表,而文件名则和i-node节点关联,所以如果针对目录是,权限的意义如下:

读权限(read):可读取目录结构,查询其内文件名数据。

写权限(write):拥有修改该目录结构列表的权限(新建、删除、重命名、移动之类改变文件目录结构操作)。

执行权限(execute):目录只是记录文件名,无法执行,在此代表了能否进入此目录,并对目录内容进行操作(若只有读写权限,而无执行权限,同样无法对此目录内拥有权限的文件进行操作)。

chmod:改变文件权限

了解完基础权限之后,我们再来学习如何改变文件的权限,chmod是一个更改文件权限的命令,下面是其用法说明:

 

例如给file1这个文件其他人添加读和写权限:

则可以 chmod o+rw file1 这样修改

也可用数字修改 chmod 666 file1

取掉相应权限,可以用“-”来操作,或者也可以用数字来操作。

chmod常用选项有:

-R:递归操作,改变文件夹权限时,递归改变其文件夹内的文件权限(若加执行权限用大写的“X”可以跳过文件,只对文件夹生效,但是若文件之前就有执行权限,则不会跳过)。

-v:显示过程。

chown:改变文件所有者

chown  选项  账户名称  文件或目录【改变文件的所有者】

chown  选项  账户名称:组名称 文件或目录【改变文件的所有者与所属组】

通过“.”或者“:”分隔,我们可以一并修改文件的所有者和所属组,若符号后省略所属组,则默认使用所设所有者的主组,若省略所有者,则默认不改动所有者。

常用选项:

-R:递归改变,连同子目录下的所有文件都修改。

-h:若目标是链接文件,则仅改变链接文件本身。

-v:显示过程。

chgrp:改变文件所属组

chgrp  选项  组名  文件或目录

常用选项:

-R:递归改变,连同子目录下的所有文件都修改。

-h:若目标是链接文件,则仅改变链接文件本身。

-v:显示过程。

umask:文件默认权限

当我们创建文件的时候,都有着权限,而它们的权限设定又是怎么来的呢?这就与umask有关了,基本上,umask就是指定“当前用户在新建文件或目录时候的权限默认值”,那么如何得知或设置umask值呢?可以通过以下方式:

  • 新建文件默认权限:

若用户创建文件时默认没有执行权限,也是就是最大权限为:rw-rw-rw-[666]

而我的umask=0022,其中与一般权限有关的是后三位【022】=----w--w-,默认最大权限减去umask便是创建文件时的默认权限:

rw-rw-rw-  新建文件默认最大权限

----w--w-  umask

rw-r--r--    得出新建文件的默认权限

  • 新建目录默认权限:

用户新建目录时,最大权限为:rwxrwxrwx[777]

rwxrwxrwx  新建目录默认最大权限

----w--w-   umask

rw-r-xr-x    得出新建目录的默认权限

从上我们可以看出,umask表示的是创建文件或目录时需要拿掉的权限,而我们用所对应的默认最大权限减掉umask,得到的权限便是创建时的默认权限啦。

文件隐藏属性管理:chattr、lsattr

chattr 命令的作用很大,其中一些功能是由Linux内核版本来支持的,如果Linux内核版本低于2.2,那么许多功能不能实现。另外,通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/var目录。并且此命令只能变存放在ext2、ext3、ext4、xfs、ubifs、reiserfs、jfs等文件系统上的文件或目录属性,而且此命令默认只有root才能设置。

  • chattr [+-=]参数 文件或目录,命令接[+-=]来表示添加、删除、仅有后面的参数。

常用选项:

a:文件数据只能追加,不可删除、覆盖、修改。若目录有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。

i:文件将不能进行任何修改,也不能删除。若目录有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。

A:即Atime,告诉系统不要修改对这个文件的最后访问时间(atime)。

S:即Sync,一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘。

d:当dump程序执行时,该文件或目录不会被dump备份。

s:彻底删除文件,不可恢复,因为是从磁盘上删除,然后用0填充文件所在区域。

u:当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复删除这个文件,用来防止意外删除文件或目录。

c:将文件或目录压缩后存放。

  • lsattr【显示文件隐藏属性】

常用参数:

-a:连同显示隐藏文件。

-d:如果是目录,则仅列出目录属性而非目录内的文件。

-R:连同子目录内内容一同显示。

特殊权限:SUID、SGID、SBIT

前面我们一直提到文件的基础权限r、w、x,而基于其上衍生出更为详细与方便的特殊权限SUID、SGID、SBIT。

  • SetUID
  1. 作用于文件所有者的执行(x)权限位。
  2. 仅对可执行的二进制程序文件有效。
  3. 对此文件有执行权限(x)。
  4. 此权限仅在执行本程序执行过程中有效。
  5. 执行者将具有此程序的所有者的权限。
  • SetGID

作用于文件时:

  1. 作用于文件所属组的执行(x)权限位。
  2. 对可执行进制的二进制程序文件有效。
  3. 对此文件有执行权限(x)。
  4. 执行者在执行过程中将获得此程序用户组的支持(临时加入此用户组)。

作用于目录时:

  1. 当用户对此目录有执行(x)与读权限(r)。
  2. 则在此目录中用户的有效用户组将会变成该目录的用户组。
  3. 若用户在此目录创建文件或目录时,那么用户所创建的新文件的用户组将会是该目录的用户组
  • Sticky Bit
  1. 作用于目录其他人的执行(x)权限位。
  2. 仅对目录有效。
  3. 当用户能够在此目录创建文件或目录时(至少具有w,x),其文件只有自己与root有权利进行删除、重命名、移动等操作。

acl的使用

通过前面的了解,文件针对三种用户(所有者、所属组、其他人)划分了三种(读、写、执行)权限,而基于其上的特殊权限(SUID、SGID、SBIT)也做了了解,其中并不能针对某一单一用户或某一用户组来设定特定的权限需求,此时就需要使用ACL这个机制了。

ACL:Access Control List

  • ACL可以针对哪些方面来控制权限呢?其主要针对如下:
  1. 用户:可以针对用户设置权限。
  2. 用户组:针对用户组设定权限。
  3. 默认属性(mask):针对文件夹内新建文件或目录时的默认权限。

如何启动acl

ACL是传统的UNIX-like操作系统权限的恩爱支持项目,因此要使用ACL必须要有文件系统的支持才行,目前绝大多数的文件系统都支持ACL的功能,包括ReiserFS、EXT2/EXT3/ETX4、JFS、XFS等等。

查看文件系统是否开启ACL,可以使用 dumpe2fs -h 设备路径

Default mount options: user_xattr acl 可以看到默认以开启ACL

如果默认没有加上ACL,可以手动添加:

mount -o remount,acl 设备路径  或   tune2fs -o acl  设备路径

这样就能加入了,若是想要每次开机都生效,需要写入配置文件:/etc/fstab

setfacl:设置acl权限

setfacl 选项 参数 文件或目录名

常用选项:

  1. -m:添加后续参数。
  2. -x:删除后续参数。
  3. -b:删除所有acl设置参数。
  4. -k:删除默认的acl参数。
  5. -R:递归设置acl,若执行权限写为大写“X”,则仅对文件夹设置x权限。
  6. -d:设置默认acl参数,只对目录有效,在该目录新建的数据会引用此默认值。【子目录继承】

后续参数:

u:用户名:权限

g:用户组名:权限

m:权限(mask)【新建文件权限无法超越此值,若设置超过此值,便会自动减去其相应权限。】

getfacl:查看acl权限

getfacl 选项

常用选项:

-R:递归显示。

-l:显示链接文件指向的文件。

-n:数字标示用户和用户组。

当设置了ACL权限之后,基本权限位后的小点“.”会变成“+”号。

 

参与评论