Linux系统之文件权限管理

一、什么是权限?

  • 在Linux系统中,当我们不同用户在创建文件或目录时,被创建的文件或目录都有各自的所属主和所属组,不同用户对于某些文件拥有不同的权限。在我们Linux系统中,账户可分为超级用户、系统用户、普通用户三类。对于超级用户来说,其拥有最高权限,具备系统中的所有权限;对于系统用户来说,其主要作用是支撑整个系统的运行,方便系统管理;而对于普通户来说,其权限是有限的,只能对自己目录下的文件进行相关操作。
  • 当用户登录系统时,用户的每一步操作都是由shell进程来代替执行的。shell进程是以某个登录系统的用户和身份启动的。在我们linux服务器上有严格的权限等级,如果权限过高而导致误操作会增加服务器的风险。因此当我们拥有较高权限时,应谨慎赋予Linux系统中相关文件的操作权限。

二、基本权限

2.1 权限对象(ugo)

首先来看一下下面的截图,通过ll命令以长格式的形式来当前目录下问价的相关信息,其中红圈部分就是文件对应的权限。不同的权限有对文件执行不同的权利,比如可读、可写或可执行。每个文件的权限分别对应着u、g、o。接下来解释一下这三个英文字母的含义。
在这里插入图片描述
(1)ugo解释
在Linux系统中,不同用户创建的文件都会对应有不同的权限,而且不同用户创建的文件或目录都有各自的属主、属组、其他人及相应的权限等。也就是以什么用户登录,那么创建的文件或目录就会成为该文件或目录的属主和属组,如下图所示。
在这里插入图片描述
而属主、属组、其他人对应的就是我们的u、g、o,接下来看一下他们对应的关系:

权限的对象 说明
u 文件(目录)的所属主
g 文件(目录)的所属组
o 其他人

(2)案例解释
了解ugo后,那么他们具体的对应位置在哪呢?在继续看一下他们的具体位置:

-rw-r--r--. 1 root root  838 Aug 13 18:48 passwd
     -           rw-          r--           r--         root       root       passwd    
   文件类型    属主(u)权限    属组(g)权限    其他人(o)权限     属主        属组        文件名 

说明:

  • 属主对应有属主权限;
  • 属组对应有属组权限;
  • 至于其他人权限,那是针对其他普通用户对该普通文件的权限。

2.2 权限类型(rwx)

权限共有三种类型,分别是读(r)、写(w)、执行(x),每种权限对应有相应的数字表示:

权限类型 数字表示 针对文件 针对目录
r(read) 4 可读取文件内容 可列出目录内容
w(write) 2 可更改文件内容 可创建或删除目录中任一文件
x(execute) 1 可作为命令执行文件 可访问目录中内容

2.3 权限赋予

对文件或目录赋予权限使用了两个命令,分别是:chown、chmod。

命令 功能
chown 改变文件或目录的所属主及所属组
chmod 给文件或目录设置访问权限

(1)语法:

chown  属主.属组  文件(目录)
chmod  权限对象(ugo)  赋值符  权限类型  文件(目录)

(2)实例1:使用符号表示

chown zrs.it 123.txt       --给123这个文件修改属主和属组(前提用户和组得存在)
chmod u+x 123.txt          --给123这个文件属主增加执行权限

(3)实例2:使用数字表示

chmod 644 123.txt
chmod 755 123.txt

说明:这三个数字分别表示属主权限、属组权限、其他人权限。

其中644中的6表示由读写权限组成,因为:r(4)+w(2)=6,表示属主有读写权限,另两个数一次类推。

2.4 umask掩码

首先我们得知道,目录默认的权限是777,文件默认的权限是666。对于目录来说执行权限是很重要的,比如进入目录是需要具有执行权限见得,而对于文件来说,一般都是用于数据的记录操作,所以不需要执行权。因此在默认情况下,用户创建的目录默认开放所有权限,而如果用户创建的是文件,则默认没有执行权限(x),故其权限默认为666。我们先来看一umask值。
在这里插入图片描述
从上图上课看到root用户的umask为022,也就是说,对于当前用户没有拿掉权限,group用户和other用户都被拿走了w权限,所以用户在进行创建目录和文件的时候,默认权限会进行减法操作:

666-022=644    --root用户新建文件时默认权限
777-022=755    --root用户新建目录时默认权限 

因此umask此时显得是非常重要,它是用来控制文件和目录的默认权限。**要注意的是:**我们在计算文件或目录的默认值时不是以十进制方式去计算的,而是使用对应的二进制做的减法运算。umask的值是可以被设置的,其配置文件一般在/etc/profile(对于root)或/home/.bash_profile或home/.profile(对于普通用户)。有两种修改配置方法。
(1)通过修改配置文件使umask永久生效

vim /etc/profile

在这里插入图片描述
(2)使umask临时生效

umask 权限补码
umask 044

比较简单,这里不再演示。

三、高级权限

3.1 suid权限

suid权限仅对二进制命令文件生效,执行者对该二进制文件有执行权,当对二进制命令文件进行suid提权时,执行者将拥有该二进制命令文件所有者的权限。接下来看个列子。

语法:chmod u+s 可执行二进制命令文件
chmod u+s /usr/bin/cat

在这里插入图片描述
执行suid权限后,通过ll命令可观察到该二进制命令文件的所属主权限(u)部分的执行权限(x)变成了s,说明对该二进制命令文件提权成功,从上图可看到,提权后普通用户拥有该命令所有的权限。

在这里还有一个叫做sudo的权限,所起的作用和suid一样,只不过权限赋予方式和执行方式不一样而已。而且该权限较suid来说具有针对性,它可以针对某个或某些用户进行sudo授权,同时也是对普通用户提权的手段之一,接下来看一下相关测试实例。

(1)未对其他用户sudo提权时
在这种情况下,如果切换到xiaojie这个普通用户来执行touch命令,在根下(/)新建文件时是没有权限的。如下图所示:
在这里插入图片描述
(2)当通过visudo给xiaojie用户提权时
其操作方法为:直接使用visudo进入文件,并对xiaojie用户添加权限,该权限为:xiaojie用户可以root身份使用touch命令。

语法:用户  ALL=(ALL)  NOPASSWD=二进制命令的绝对路径

在这里插入图片描述
添加完后保存并退出(:wq),再次切换到xiaojie用户,使用touch命令在根下创建123.txt文件。

sudo touch /123.txt     --在根下创建123.txt文件
ls /123.txt             --查看是否创建成功

在这里插入图片描述
最终看到的效果是执行成功的,说明对xiaojie普通用户提权成功。

3.2 sgid权限

sgid权限仅对目录生效,当给目录执行sgid提权时,若执行者在该目录下新建文件或目录(前提是被提权的目录对其他用户要具备w权限),则本地用户或其他用户创建的文件或目录将会继承被sgid提权目录的属组。接下来看一下下面的测试。
(1)添加测试目录并sgid提权

mkdir /home/test          --创建测试目录
chown .IT /home/test/     --修改属组
chmod g+s /home/test/     --添加sgid权限

在这里插入图片描述
(2)切换其他用户并在/home/test创建目录

su - xiaojie
mkdir /home/test/hello

在这里插入图片描述

3.3 sticky权限

该权限目前只对目录生效,而且是针对其他人(other)来设置的,其操作方法和suid、sgid类似,只是功能不同而已。其作用是:当对某一个目录提权时,当其他用户在被提权的目录下新建目录或文件时,仅有自己和root用户才能删除创建的文件,各普通用户之间是没有权利删除的。接下来看一下下面的测试。
(1)创建测试目录

mkdir /home/sticky
chmod o+t /home/sticky/

在这里插入图片描述
(2)切换其他用户,并在/home/sticky目录下新建测试文件
在这里插入图片描述
结论在图中已经标红。

四、chattr隐藏权限

有一种隐藏权限,添加该权限后连root用户都无法执行相应操作,包括删除、恶意添加内容等。尽管我们上面的sticky权限给目录提权后,可以防止其他用户对我文件的恶意删除,但并能防止别人对我的文件进行编辑、篡改等。显然这样的提权并非安全,因此给大家引出了chattr权限,实际上这是文件的一种属性权限,我们可以通过lsattr命令来查看某个文件的的属性,看某个文件是否添加chattr隐藏权限,该权限属性有三种,分别是a、i和A,接下来看看它们的用法及测试案例。

属性类型 说明
a 系统只允许在该文件中追加数据,不允许任何覆盖或截断这个文件
i 系统不允许对这个文件做任何的修改
A 告诉系统不要修改这个文件的最后访问时间
语法:chattr [+-=] [选项] 文件名
说明:
+     --添加权限
-     --解除权限
=     --等于某权限

(1)对a权限做测试

mkdir test_a             --创建测试文件
chattr +a test_a         --添加a权限
rm -rf test_a            --删除该文件(肯定是无法删除的)
echo "123"  >  test_a    --覆盖文件内容(肯定是无法覆盖的)
echo "123"  >>  test_a   --向文件追加内容(这步可以实现)

在这里插入图片描述
上图测试结果表明,添加a权限后的文件只能对其进行新内容的追加,无法对其做其他修改。
(2)对i权限做测试

mkdir test_i             --创建测试文件
chattr +i test_i         --添加i权限
rm -rf test_i            --删除该文件(肯定是无法删除的)
echo "123"  >  test_i    --覆盖文件内容(肯定是无法覆盖的)
echo "123"  >>  test_i   --向文件追加内容(肯定是无法追加)

在这里插入图片描述
通过该例子可看出,无法对具有i权限的文件做任何修改,但可查看文件里的内容。
(3)对A权限做测试

mkdir test_A             --创建测试文件
chattr +A test_A         --添加A权限
rm -rf test_A            --删除该文件(可删除)
echo "123"  >  test_A    --覆盖文件内容(可覆盖)
echo "123"  >>  test_A   --向文件追加内容(可追加)
stat /root/chattr/test   --访问但不会改变文件访问时间

在这里插入图片描述

五、总结

  • 权限可分为基本权限、高级权限、chattr安全权限。对于基本权限来说,就是简单的对相应的目录或文件赋予权限,可以用字符表示,也可用数字表示,不同数字代表不同权限。
  • 目录默认的目录时777,文件默认权限时666。此处会引出一个umask掩码,其作用就是控制目录和文件的默认权限(保证目录和文件的安全性),因此在创建目录和文件时,目录默认的权限是755,文件默认的权限是644。
  • 给普通用户提权的手段有suid和sudo两种,其中suid是针对二进制命令的提权,提权后,执行者将拥有该二进制命令文件所有者的执行权限。对于sudo,它具有针对性的对某些用户进行提权,比如针对某个用户或者某些用户,甚至所有用户对某个或某些命令的执行权限(也是拥有该二进制命令文件所有者的执行权限)。
  • 对于目录有写权限(w),则可以在目录中创建、删除新文件,与目录中文件拥有什么权限无关。因此,对于目录来说:应小心赋予写权限(w);对于文件来说:应小心赋予执行权限(x),因为具有执行权限的某个恶意文件可能会危害到计算机安全。
  • 还有就是一种被隐藏的安全权限,当我们使用root用户都无法删除某个文件时,这就要考虑这个文件是否被赋予了a或i的权限,可通过lsattr命令来查看文件的属主。其实这种权限是为了防止root用户的误操作删除某些重要的系统配置文件。

猜你喜欢

转载自blog.csdn.net/IT_ZRS/article/details/108219061
今日推荐