Linux权限划分的原则

news/2024/10/31 3:19:41/

考察的不仅是一个具体的指令,还考察对技术层面的认知。
如果对 Linux 权限有较深的认知和理解,那么完全可以通过查资料去完成具体指令的执行。更重要的是,认知清晰的程序员可以把 Linux 权限管理的知识迁移到其他的系统设计中。

权限抽象

一个完整的权限管理体系,要有合理的抽象。这里就包括对用户、进程、文件、内存、系统调用等抽象。
首先,我们先来说说用户和组。Linux 是一个多用户平台,允许多个用户同时登录系统工作。Linux 将用户抽象成了账户,账户可以登录系统,比如通过输入登录名 + 密码的方式登录;也可以通过证书的方式登录。但为了方便分配每个用户的权限,Linux 还支持组 (Group)账户。组账户是多个账户的集合,组可以为成员们分配某一类权限。每个用户可以在多个组,这样就可以利用组给用户快速分配权限。组的概念有点像微信群。一个用户可以在多个群中。比如某个组中分配了 10 个目录的权限,那么新建用户的时候可以将这个用户增加到这个组中,这样新增的用户就不必再去一个个目录分配权限。而每一个微信群都有一个群主,Root 账户也叫作超级管理员,就相当于微信群主,它对系统有着完全的掌控。一个超级管理员可以使用系统提供的全部能力。此外,Linux 还对文件进行了权限抽象(注意目录也是一种文件)。Linux 中一个文件可以设置下面 3 种权限:

  • 读权限(r):控制读取文件。

  • 写权限(w):控制写入文件。

  • 执行权限(x):控制将文件执行,比如脚本、应用程序等

  • 在这里插入图片描述
    然后每个文件又可以从 3 个维度去配置上述的 3 种权限:

  1. 用户维度。每个文件可以所属 1 个用户,用户维度配置的 rwx 在用户维度生效;
  2. 组维度。每个文件可以所属 1 个分组,组维度配置的 rwx 在组维度生效;
  3. 全部用户维度。设置对所有用户的权限。
  4. 在这里插入图片描述
    因此 Linux 中文件的权限可以用 9 个字符,3 组rwx描述:第一组是用户权限,第二组是组权限,第三组是所有用户的权限。然后用-代表没有权限。比如rwxrwxrwx代表所有维度可以读写执行。rw–wxr-x代表用户维度不可以执行,组维度不可以读取,所有用户维度不可以写入。rw-rw-r–通常情况下,如果用ls -l查看一个文件的权限,会有 10 个字符,这是因为第一个字符代表的是文件类型。我们在 06 课时讲解“几种常见的文件类型”时提到过,有管道文件、目录文件、链接文件等等。-代表普通文件、d代表目录、p代表管道。
    思考以下 4 个问题。
  5. 文件被创建后,初始的权限如何设置?
  6. 需要全部用户都可以执行的指令,比如ls,它们的权限如何分配?
  7. 给一个文本文件分配了可执行权限会怎么样?
  8. 可不可以多个用户都登录root,然后只用root账户?

问题一:初始权限问题

一个文件创建后,文件的所属用户会被设置成创建文件的用户。谁创建谁拥有,这个逻辑很顺理成章。但是文件的组又是如何分配的呢?这里 Linux 想到了一个很好的办法,就是为每个用户创建一个同名分组。比如说zhang这个账户创建时,会创建一个叫作zhang的分组。zhang登录之后,工作分组就会默认使用它的同名分组zhang。如果zhang想要切换工作分组,可以使用newgrp指令切换到另一个工作分组。因此,被创建文件所属的分组是当时用户所在的工作分组,如果没有特别设置,那么就属于用户所在的同名分组。再说下文件的权限如何?文件被创建后的权限通常是:也就是用户、组维度不可以执行,所有用户可读。

问题二:公共执行文件的权限

前面提到过可以用which指令查看ls指令所在的目录,我们发现在/usr/bin中。然后用ls -
l查看ls的权限,可以看到下图所示:
在这里插入图片描述
第一个-代表这是一个普通文件,后面的 rwx 代表用户维度可读写和执行;
第二个r-x代表组维度不可读写;
第三个r-x代表所有用户可以读和执行;
后两个root,第一个代表所属用户,第二个代表所属分组

` 如果一个文件设置为不可读,但是可以执行,那么结果会怎样?答案当然是不可以执行,无法读取文件内容自然不可以执行。

问题三:执行文件`

在 Linux 中,如果一个文件可以被执行,则可以直接通过输入文件路径(相对路径或绝对路径)的方式执行。如果想执行一个不可以执行的文件,Linux 则会报错。当用户输入一个文件名,如果没有指定完整路径,Linux 就会在一部分目录中查找这个文件。你可以通过echo $PATH看到 Linux 会在哪些目录中查找可执行文件,PATH是 Linux 的环境
变量,和Windows中的环境变量类似。
在这里插入图片描述

问题四:可不可以都 root

最后一个问题是,可不可以都root?答案当然是不行!
内核提供操作硬件、磁盘、内存分页、进程等最核心的能力,并拥有直接操作全部内存的权限,因此内核不能把自己的全部能力都提供给用户,而且也不能允许用户通过shell指令进行系统调用。Linux 下内核把部分进程需要的系统调用以 C 语言 API 的形式提供出来。部分系统调用会有权限检查,比如说设置系统时间的系统调用。

权限架构思想

优秀的权限架构主要目标是让系统安全、稳定且用户、程序之间相互制约、相互隔离。这要求权限系统中的权限划分足够清晰,分配权限的成本足够低。因此,优秀的架构,应该遵循最小权限原则(Least Privilege)。权限设计需要保证系统的安全和稳定。比如:每一个成员拥有的权限应该足够的小,每一段特权程序执行的过程应该足够的短。对于安全级别较高的时候,还需要成员权限互相牵制。比如金融领域通常登录线上数据库需要两次登录,也就是需要两个密码,分别掌握在两个角色手中。这样即便一个成员出了问题,也可以保证整个系统安全。同样的,每个程序也应该减少权限,比如说只拥有少量的目录读写权限,只可以进行少量的系统调用。

权限划分

权限架构思想还应遵循一个原则,权限划分边界应该足够清晰,尽量做到相互隔离。Linux 提供了用户和分组。当然 Linux 没有强迫你如何划分权限,这是为了应对更多的场景。通常我们服务器上重要的应用,会由不同的账户执行。比如说 Nginx、Web 服务器、数据库不会执行在一个账户下。现在随着容器化技术的发展,我们甚至希望每个应用独享一个虚拟的空间,就好像运行在一个单独的操作系统中一样,让它们互相不用干扰。

为什么不用 root 账户执行程序?

说说 root 的危害。举个例子,你有一个 MySQL 进程执行在 root(最大权限)账户上,如果有黑客攻破了你的
MySQL 服务,获得了在 MySQL 上执行 SQL 的权限,那么,你的整个系统就都暴露在黑客眼前了。这会导致非常严重的后果。
黑客可以利用 MySQL 的 Copy From Prgram 指令为所欲为,比如先备份你的关键文件,然后再删除他们,并要挟你通过指定账户打款。如果执行最小权限原则,那么黑客即便攻破我们的 MySQL 服务,他也只能获得最小的权限。当然,黑客拿到 MySQL 权限也是非常可怕的,但是相比拿到所有权限,这个损失就小多了。

分级保护

因为内核可以直接操作内存和 CPU,因此非常危险。驱动程序可以直接控制摄像头、显示屏等核心设备,也需要采取安全措施,比如防止恶意应用开启摄像头盗用隐私。通常操作系统都采取一种环状的保护模式。
在这里插入图片描述
如上图所示,内核在最里面,也就是 Ring 0。 应用在最外面也就是 Ring 3。驱动在中间,也就是 Ring 1 和 Ring 2。对于相邻的两个 Ring,内层 Ring 会拥有较高的权限,可以改变外层的 Ring;而外层的 Ring 想要使用内层 Ring 的资源时,会有专门的程序(或者硬件)进行保护。比如说一个 Ring3 的应用需要使用内核,就需要发送一个系统调用给内核。这个系统调用会由内核进行验证,比如验证用户有没有足够的权限,以及这个行为是否安全等等。

权限包围(Privilege Bracking)

当 MySQL 跑在 root 权限时,如果 MySQLl 被攻破,整个机器就被攻破了。因此我们所有应用都不要跑在 root 上。如果所有应用都跑在普通账户下,那么就会有临时提升权限的场景。比如说安装程序可能需要临时拥有管理员权限,将应用装到/usr/bin目录下。Linux 提供了权限包围的能力。比如一个应用,临时需要高级权限,可以利用交互界面(比如让用户输入 root 账户密码)验证身份,然后执行需要高级权限的操作,然后马上恢复到普通权限工作。这样做可以减少应用在高级权限的时间,并做到专权专用,防止被恶意程序利用。


http://www.ppmy.cn/news/62801.html

相关文章

真实业务场景使用-模板模式+策略模式组合

模板和策略设计模式一般是使用最频繁的设计模式,模板的场景主要是处理一系列相同的流程,将这些流程放到模板里,每个流程里的处理可能有一些不一样的地方,则可以抽象出一个方法,由每一个有实际意义的子类实现。 策略模…

C# 判断文件/目录是否存在

C# 判断文件是否存在,不存在则创建 C#判断指定目录是否存在,不存在就创建 spath:文件夹路径名 using System.IO; if (Directory.Exists(spath)) { } else { DirectoryInfo directoryInfo new DirectoryInfo(spath); directoryInfo.…

Linux学习之Shell(一)

Shell概述 1)Linux提供的Shell解析器有 [xiaominghadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh2)bash和sh的关系 [xiaominghadoop101 bin]$ ll | grep bash -rwxr…

ShardingProxy分库分表实战

目录 ShardingProxy简述 快速使用 ShardingProxy部署 ShardingProxy使用 ShardingProxy的服务治理 Shardingproxy的其他功能 ShardingProxy的SPI扩展 ShardingSphere总结 ShardingProxy简述 ShardingProxy的功能同样是分库分表,但是他是一个独立部署的服务…

实现docker目录和本地目录的互通

1.docker run使用-v 绑定一个卷 来实现容器中的目录与本地某个目录的联通,这样可以让容器中的数据在容器销毁之后仍然可以被保留下来。下面是一些基本的步骤: 创建一个本地目录,用于存储容器中的数据。例如,我们可以在本地创建一…

Altium Designer中如何在顶层中添加对应端口

转载说明: 大众深度科普 https://jingyan.baidu.com/article/c33e3f4889f327ea15cbb584.html 版权归原作者所有;感谢原作者的分享; 转载到此,主要为了后期查看方便; 本经验简要介绍Altium Designer中如何在顶层中添…

字符设备驱动开发实验

我们以 chadev 这个虚拟设备为 例,完整的编写一个字符设备驱动模块。chadev 不是实际存在的一个设备,是为了方 便讲解字符设备的开发而引入的一个虚拟设备设备有两个缓冲区,一个为读缓冲 区,一个为写缓冲区,这两个缓冲…

(六)【平衡小车制作】位置式PID、直立环与速度环编程

本篇文章我将针对位置式PID算法、直立环、速度环等的编程进行详细的讲解,让每位小伙伴能够对这三个概念的编程逻辑有更加清晰的理解。 一、直立环(PD控制器) 1.中文公式  直立环输出Kp1角度偏差Kd角度偏差的微分  // 角度偏差真实角度-期…