重学操作系统(七)

重学操作系统(七)

前言

今天继续学习记录关于操作系统这个课程。这一章节是Linux权限划分相关的知识点。我们最熟悉的,每次运行某些命令,会提示permission denied。这就代表当前用户没权限,这样我们加上sudo去运行,就可以了。

Tips: sudo命令在维基百科的解释是substitute user [或 superuser] do。


贯穿全文的一道题:简述Linux权限划分原则?


权限抽象

一个完整的权限管理体系,要有合理的抽象,包括对用户,进程,文件,内存,系统调用等抽象。

用户和组

Linux是多用户平台,允许多个用户同时登录系统。Linux将用户抽象为账户。账户可以登录系统。

为了方便分配用户权限,Linux支持组(Group)账户。组账户是很多用户账户的集合,组可以为成员分配某一类权限,一个用户可以在多个组。

Root账户,也叫超级管理员,对系统有着完全的掌控。一个root账户,可以使用系统提供的所有能力。

文件和目录

Linux对文件和目录(目录也是一种文件)进行了权限抽象,Linux对于文件有以下三个权限:

1. 读权限(r):控制读取文件
2. 写权限(w):控制写入文件
3. 执行权限(x):控制文件执行

以上每个权限,可以从用户,组,全部用户三个维度区进行配置:

文件权限一般是类似下述:
- rwx rwx rwx
第一位是file type,"-"是文件,"d"是目录,"p"是管道文件
后面三位三位分别对应三个维度的读写执行权限,如果是rwx,则拥有读写执行权限,如果比如"r--",就是拥有只读权限,没有的权限用"-"来表示

初始权限

一个文件创建后,文件所属用户被设置成创建文件的用户。Linux会为每个用户创建一个同名分组,如果用户想要切换分组,执行newgrp指令切换。因此被创建的文件属于用户所在的分组,因此一般情况,文件创建后权限是:

rw-rw-r–

用户和组维度可读写,所有用户可读。

类似ls这种指令文件的权限

废话不多说,先看图!!!

ls -l运行结果

上图是在”/usr/local/bin”中运行”ls -l”的结果,从结果看,这些指令文件的权限都是一样的,都是用户维度的可读写执行,组和全部用户维度都是可读可执行。它们都属于root用户,wheel组(组名可能是系统不同组名不同)。

Tips: 如果一个文件不可读,可执行,那么这个文件也无法执行。

执行文件

Linux中,可以通过”echo $PATH”查看可执行文件都在哪些目录中。PATH就是Linux的环境变量。

内核和系统调用权限

内核提供操作硬盘,磁盘,内存分页,进程等最核心的能力。并拥有直接操作全部内存的权限。因此内核不能把自己的全部能力提供给用户,也不能允许用户通过shell指令进行系统调用。Linux把部分进程需要的系统调用以API的形式暴露出来,部分系统调用需要进行权限检查。

权限架构思想

权限架构的主要目标是让系统安全,稳定且用户,程序之间相互制约,相互隔离。因此优秀的架构,应该遵循最小权限原则(Least Privilege)。此外,权限架构应该还遵循一个原则,权限划分边界应该足够清晰,尽量相互隔离。

分级保护

内核可以直接操作内存和CPU,驱动程序能直接控制摄像头,显示屏等核心设备,因此它们需要采取安全措施。一般操作系统采取环状保护模式。

分级保护

图片来源于参考中的链接

上图就能看出,越往内层,权限级别越高。最外层是应用权限层,中间两层是设备驱动权限层,中间是内核权限层。

权限包围(Privilege Bracking)

Linux提供一一个能力,比如有一个应用需要临时使用高级权限,可以验证身份通过后,赋予临时高级权限,当这个应用执行完相应的操作,马上恢复为普通权限。这样能做到减少应用在高级权限的时间,做到专权专用,防止被恶意程序利用。

用户分组指令

  • groups指令:查看当前用户的所有分

  • id指令:查看当前用户

    id运行结果

    其中,uid是当前用户id,gid是组id,groups后面的是每个分组和分组id。

  • cat /etc/passwd:查看所有用户信息

    id运行结果

    以root这一行来看:

    root:*:0:0:System Administrator:/var/root:/bin/sh

    • root:用户名
    • *:密码
    • 0: uid
    • 0: gid
    • System Administrator:userId信息
    • /var/root:家目录
    • /bin/sh:shell路径
  • useradd:创建用户

  • groupadd:创建分组

  • usermod -a -G sudo 【用户名】:
    组分为主要分组(Primary Group)和次级分组(Secondary Group),主要分组只有一个,次级分组可以有多个。usermod的作用是给用户添加次级分组。比如上面命令就是给【用户名】添加到sudo分组,从而使其有sudo的权限。

Tips: -a = append, -G = 次级分组清单

  • usermod -g somegroup 【用户名】:修改用户主要分组

文件权限管理指令

  • chmod:修改文件权限

    chmod +x [文件名]

    chmod -x [文件名]

    chmod +rwx [文件名]

    chmod 467 [文件名](467 =》二进制是100 110 111,对应:用户权限 - 组权限 - 所有用户权限的rwx,r– rw- rwx)

  • chown:修改文件所属用户,比如:

    chown user1 ./file => 将file文件修改为user1用户

    或者

    chown group1.user1 ./file => 将file文件所属用户和分组改为group1分组下的user1用户。

以上是多种修改文件权限的方式。

总结

这一章学了很多惯用语Linux权限的,很多之前不明白的操作,终于明白了。而且最关键的是,权限这方面的知识点,之前面试竟然遇到了,很庆幸看了这个章节。

回到前面的问题,Linux权限的划分原则?

答案显而易见,就是Linux遵循最小权限原则,每个用户和组掌握的权限应该足够小,应用应当尽可能小的使用权限。尽量少用root。系统层面,通过实现分级保护实现权限的划分。

如果一个目录是只读权限,对于root用户,读写执行操作都没问题。但是对于普通用户,则无法进入目录。

目录的可执行权限的作用

  1. 进入目录
  2. 访问内部文件
  3. 对目录底下清单的修改,如增加,修改文件名,删除等

参考

[1] https://kaiwu.lagou.com/course/courseInfo.htm?courseId=478&sid=20-h5Url-0&buyFrom=2&pageId=1pz4#/detail/pc?id=4614


 上一篇
重学操作系统(八) 重学操作系统(八)
重学操作系统(八)前言距离上次整理关于操作系统相关知识点,已经过去几周了,现在找到时间,继续看相关文章,继续总结。 今天看的文章是关于Linux网络指令相关的知识点。 贯穿全文的一道题:如何查看一个域名有哪些NS(Name Server)
下一篇 
重学操作系统(六) 重学操作系统(六)
重学操作系统(六)前言通过上一篇文章,帮助我巩固了Linux一些简单的命令的使用和原理。接下来,后面这个文章,介绍些和进程,重定向,以及管道指令相关的事情。 贯穿全文的问题:xargs指令的作用是什么? 进程应用的可执行文件是在文件系统中
  目录