Linux从青铜到王者-文件权限管理详解

251 阅读11分钟

这是我参与更文挑战的第7天, 活动详情查看:更文挑战

权限的基础概念

本文我们来讨论一下Linux操作系统中文件的普通权限。 Linux权限是操作系统用来限制对资源访问的一种机制。 权限一般分为三种:

  • 执行

在Linux操作系统中,每个进程都是以某个身份(用户)来运行的,进程的权限与这个用户的权限一样,用户的权限越大,进程的权限就越大。

这里需要明确,文件的权限主要是针对三类对象进行定义:

owner:属主,u  group:属组,g  other :其它,o

每个文件针对上述三个对象,都定义了三种权限:

权限对应的操作对象权限说明
r文件文件的可读指的是可以用grep等类似的命令查看
w文件可以写,指的是可以用vim修改或者删除此文件
x文件可执行,可以以命令的形式运行
r目录可以对此目录使用ls查看所有内容
w目录可以在目录中创建文件也可以删除
x目录可以使用cd切换到此目录同时可以查看目录内的详细信息

这里需要单独提一下 权限的二进制与十进制的转换.如下表:

在这里插入图片描述

接下来我们看看权限管理的命令

权限管理命令

1)chmod

作用: 修改权限 用法: chmod mode file 操作符 + 添加权限 - 减少权限 = 直接给一个权限

参数:

-c : 若该文件权限确实已经更改,才显示其更改动作
-f : 若该文件权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
--help : 显示辅助说明
--version : 显示版本

举例:

1) 查看文件的权限
[root@zmgaosh zip]# ll 
总用量 8
drwxr-xr-x 2 root root 4096 6月  20 20:26 etc
-rw-r--r-- 1 root root  685 6月  20 20:25 passwd.zip

在这个例子中,文件夹etc 的权限为
r: 4 w:2 x:1 rwx =7 r_x = 5 所以etc的权限是755 而文件passwd.zip 的权限为 644

2) 授予用户对于etc目录有rwx权限
[root@zmgaosh zip]# ll  #查看当前目录
总用量 8
drwxr-xr-x 2 root root 4096 6月  20 20:26 etc
-rw-r--r-- 1 root root  685 6月  20 20:25 passwd.zip
注意目录的权限
[root@zmgaosh zip]# ll etc/
总用量 4
-rw-r--r-- 1 root root 1317 6月  20 15:16 passwd
#查看目录里文件的权限,目前是rw-
[root@zmgaosh zip]# chmod -R u+rwx etc  #授予目录及目录里的内容所有者为rwx的权限
[root@zmgaosh zip]# ll
总用量 8
drwxr-xr-x 2 root root 4096 6月  20 20:26 etc
-rw-r--r-- 1 root root  685 6月  20 20:25 passwd.zip
[root@zmgaosh zip]# ll etc/
总用量 4
-rwxr--r-- 1 root root 1317 6月  20 15:16 passwd #可以看到所有者已经变为 rwx的权限
3) 授予所属组为rwx权限
[root@zmgaosh zip]# ll
总用量 8
drwxr-xr-x 2 root root 4096 6月  20 20:26 etc
-rw-r--r-- 1 root root  685 6月  20 20:25 passwd.zip
[root@zmgaosh zip]# ll etc
总用量 4
-rwxr--r-- 1 root root 1317 6月  20 15:16 passwd
[root@zmgaosh zip]# chmod -R g+rwx etc
[root@zmgaosh zip]# ll
总用量 8
drwxrwxr-x 2 root root 4096 6月  20 20:26 etc
-rw-r--r-- 1 root root  685 6月  20 20:25 passwd.zip
[root@zmgaosh zip]# ll etc
总用量 4
-rwxrwxr-- 1 root root 1317 6月  20 15:16 passwd
[root@zmgaosh zip]# 

结合第二个例子,这个例子就很容易理解了,可以看到文件夹和文件的所属组都变成了rwx

4) 去掉etc目录的所有者的读写权限
[root@zmgaosh zip]# chmod -R u-wx etc
[root@zmgaosh zip]# ll
总用量 8
dr--rwxr-x 2 root root 4096 6月  20 20:26 etc
-rw-r--r-- 1 root root  685 6月  20 20:25 passwd.zip
[root@zmgaosh zip]# 

5) 使用二进制的方式授予etc 目录,所有者,所属组,其他用户都为rwx权限
[root@zmgaosh zip]# chmod -R 777 etc
[root@zmgaosh zip]# ll
总用量 8
drwxrwxrwx 2 root root 4096 6月  20 20:26 etc
-rw-r--r-- 1 root root  685 6月  20 20:25 passwd.zip
[root@zmgaosh zip]# 

2)chown 命令

作用:将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用 户ID;组可以是组名或者组ID

参数:

  • -c : 显示更改的部分的信息
  • -f : 忽略错误信息
  • -h :修复符号链接
  • -v : 显示详细的处理信息
  • -R : 处理指定目录以及其子目录下的所有文件
  • --help : 显示辅助说明
  • --version : 显示版本

举例:

1) 将passwd的所有者和所有组改为xinsz
[root@zmgaosh etc]# ll
总用量 4
-rwxrwxrwx 1 root root 1317 6月  20 15:16 passwd
[root@zmgaosh etc]# chown xinsz:xinsz passwd
[root@zmgaosh etc]# ll
总用量 4
-rwxrwxrwx 1 xinsz xinsz 1317 6月  20 15:16 passwd
## 可以看到 用户组和所有者都变成了xinsz
[root@zmgaosh etc]# 

2) 将passwd的拥有者和群组的另一种方法
[root@zmgaosh etc]# chown root: passwd
[root@zmgaosh etc]# ll
总用量 4
-rwxrwxrwx 1 root root 1317 6月  20 15:16 passwd
[root@zmgaosh etc]# 

3) 只改变passwd的所属组
[root@zmgaosh etc]# chown :xinsz passwd
[root@zmgaosh etc]# ll
总用量 4
-rwxrwxrwx 1 root xinsz 1317 6月  20 15:16 passwd
[root@zmgaosh etc]# 

文件特殊权限管理

文件特殊管理权限主要从以下几点进行讨论: SUID SGID Sticky bit

1. SUID详解

chmod u+s chomd 4777 chmod u-s

我们平时创建用户后都会设置密码,我们都 知道passwd 和shadow,我们来看看他们的权限

[root@zmgaosh test]# ll /etc/passwd
-rw-r--r-- 1 root root 1317 6月  20 15:16 /etc/passwd
[root@zmgaosh test]# ll /etc/shadow
---------- 1 root root 1073 6月  20 15:16 /etc/shadow
[root@zmgaosh test]# 

从上面可以看到,/etc/shadow,没有任何的访问权限,修改密码就是要把密码写入到这个没有权限的shadow, 如果是root修改密码我们可以理解,那如果是一个普通用户呢,能不能修改自己的密码。

  • 不能,因为没有权限,只能root帮他修改密码
  • 能,既然你这么问了肯定要猜能

我们来做个试验试一下:

 
[root@zmgaosh test]# useradd gaosh
[root@zmgaosh test]# passwd gaosh
更改用户 gaosh 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 它没有包含足够的不同字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@zmgaosh test]# su - gaosh
[gaosh@zmgaosh ~]$ whoami
gaosh
[gaosh@zmgaosh ~]$ passwd
Changing password for user gaosh.
Changing password for gaosh.
(current) UNIX password:    #先输入本身的密码
New password:                 #输入新密码
Retype new password: 
passwd: all authentication tokens updated successfully.
[gaosh@zmgaosh ~]$ 
[gaosh@zmgaosh ~]$ ll /usr/bin/passwd
-rwsr-xr-x 1 root root 27856 Aug  9  2019 /usr/bin/passwd

可以看到,普通用户设置密码也能成功,所以猫腻在哪里呢,我们查看下passwd这个命令,发现该命令在owner区域的执行权限字段不是x而是s

结论: 如果一个命令的SUID位被设置为s, 那么其在执行的过程中,命令的执行用户就会切换成命令的owner进行执行

接下来为了验证上述结论,我们拿一个没有s权限的来试一下 实验步骤:

  1. 在没有suid权限时候能否执行操作
  2. 加上suid权限再次查看结果

本次我们用more命令

[root@zmgaosh test]# ll /usr/bin/more
-rwxr-xr-x 1 root root 41112 12月  3 2019 /usr/bin/more

可以看到没有suid权限

[root@zmgaosh test]# su - gaosh    
上一次登录:一 6月 22 07:54:55 CST 2020pts/0 上
[gaosh@zmgaosh ~]$ whoami
gaosh
[gaosh@zmgaosh ~]$ more /etc/shadow     #没有suid权限的时候,无法查看此文件
/etc/shadow: Permission denied
[gaosh@zmgaosh ~]$ exit
logout
[root@zmgaosh test]# chmod u+s /usr/bin/more    #加上suid权限
[root@zmgaosh test]# ll !$
ll /usr/bin/more
-rwsr-xr-x 1 root root 41112 12月  3 2019 /usr/bin/more  #可以看到x位的s
[root@zmgaosh test]# su - gaosh
上一次登录:一 6月 22 08:06:14 CST 2020pts/0 上
[gaosh@zmgaosh ~]$ whoami
gaosh
[gaosh@zmgaosh ~]$ more /etc/shadow  #已经能够查看
root:$6$SlVomD$EBjlGVUUOnCCk.lupiqnL58ESGeVJBNCvIc7IE6LNQ9J66OEhNSvlZQvk8EJkx6laSHDeDnuVN3NnJgqZxZid.:18430:0:999
99:7:::

注意,有时候在owner区的s可能设置的是S。给普通文件强行加suid权限,显示的就是大写的S,因为普通文件本身没有x执行权限, 正确的用法是先给文件x权限,然后在给s权限,这样才是小写的s.

实验步骤:

  1. 先查看普通文件的权限
  2. 给予普通文件s权限,查看是否出现大S
  3. 去掉suid权限,先给予执行权限再给予s权限
  4. 查看是否x位是否为小s
[root@zmgaosh test]# ll
总用量 0
-rw-r--r-- 1 root root 0 6月  22 07:31 gaosh.txt
[root@zmgaosh test]# chmod u+s gaosh.txt 
[root@zmgaosh test]# ll
总用量 0
-rwSr--r-- 1 root root 0 6月  22 07:31 gaosh.txt
[root@zmgaosh test]# chmod u-s gaosh.txt 
[root@zmgaosh test]# ll
总用量 0
-rw-r--r-- 1 root root 0 6月  22 07:31 gaosh.txt
[root@zmgaosh test]# chmod u+x gaosh.txt 
[root@zmgaosh test]# chmod u+s gaosh.txt 
[root@zmgaosh test]# ll
总用量 0
-rwsr--r-- 1 root root 0 6月  22 07:31 gaosh.txt
[root@zmgaosh test]# 

2. .SGID (Set-group identification)

SGID和SUID基本类似,知识在命令执行后切换的用户不是owner而是group 可以给二进制可执行文件设置,也可以给目录设置

如果给目录设置SGID权限,那么在这个目录下新创建文件的时候,新创建的文件所属组会集成上级目录的权限。

[root@zmgaosh test]# mkdir gaosh
[root@zmgaosh test]# ll -d gaosh
drwxr-xr-x 2 root root 4096 6月  22 08:20 gaosh
[root@zmgaosh test]# chmod g+s gaosh
[root@zmgaosh test]# ll
总用量 4
drwxr-sr-x 2 root root 4096 6月  22 08:20 gaosh

[root@zmgaosh test]# chown :gaosh gaosh  #改变文件目录的属组
[root@zmgaosh test]# ll -d gaosh
drwxr-sr-x 2 root gaosh 4096 6月  22 08:21 gaosh
[root@zmgaosh test]# cd gaosh
[root@zmgaosh gaosh]# touch test1  #验证新创建的文件的属组会不会改变
[root@zmgaosh gaosh]# ll
总用量 0
-rw-r--r-- 1 root root  0 6月  22 08:21 test
[root@zmgaosh gaosh]# 

注意: SGID的s权限也是分大小写的,当g权限组没有x权限的时候,设置SGID后就会变成大写的S,这点跟SUID一样。

3. SBIT 权限 (Sticky Bit)

设置方法: chmod g+s

注意: 只对目录有效

Sticky Bit主要用于目录的共享。目录 /var/tmp and /tmp就具备共享功能,所有用户都可以创建文件,还可以修改或执行其它用户的文件,但是删除文件只能是文件拥有者。一旦目录的Sticky Bit被设置了,就能保证目录中各自的文件只有文件的拥有者和root可以删除。

[root@zmgaosh gaosh]# ll -d /var/tmp
drwxrwxrwt. 4 root root 4096 6月  20 20:31 /var/tmp

权限t也有大小写之分,大写说明没有x权限,小写说明有x权限,这点和权限s是一样的。

总结:

  1. 三种权限的设置方法: SUID: chmod u+s SGID: chmod g+s SBIT: chmod o+t 数字表示: SUID =4 SGID =2 SBIT=1 chmod 4777 chmod 2777 chmod 1777

如果三种权限都设置的话,就是chmod 7777

  1. 及时排除拥有特殊权限的用户,如果不是你本人设置的一定要去掉特殊权限,并检查是否 有后门漏洞。

Linux中,一切皆为文件,权限又分为普通权限,高级权限和默认权限,而今天我们只讨论了普通权限。

需要记住权限针对的三个对象: 属主,属组和其他用户 针对每个对象又有三种权限: 读,写,执行 充分理解UGO三个的含义,以及通过字母和数字来设置权限的方法。