重学操作系统(七)
前言
今天继续学习记录关于操作系统这个课程。这一章节是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这种指令文件的权限
废话不多说,先看图!!!

上图是在”/usr/local/bin”中运行”ls -l”的结果,从结果看,这些指令文件的权限都是一样的,都是用户维度的可读写执行,组和全部用户维度都是可读可执行。它们都属于root用户,wheel组(组名可能是系统不同组名不同)。
Tips: 如果一个文件不可读,可执行,那么这个文件也无法执行。
执行文件
Linux中,可以通过”echo $PATH”查看可执行文件都在哪些目录中。PATH就是Linux的环境变量。
内核和系统调用权限
内核提供操作硬盘,磁盘,内存分页,进程等最核心的能力。并拥有直接操作全部内存的权限。因此内核不能把自己的全部能力提供给用户,也不能允许用户通过shell指令进行系统调用。Linux把部分进程需要的系统调用以API的形式暴露出来,部分系统调用需要进行权限检查。
权限架构思想
权限架构的主要目标是让系统安全,稳定且用户,程序之间相互制约,相互隔离。因此优秀的架构,应该遵循最小权限原则(Least Privilege)。此外,权限架构应该还遵循一个原则,权限划分边界应该足够清晰,尽量相互隔离。
分级保护
内核可以直接操作内存和CPU,驱动程序能直接控制摄像头,显示屏等核心设备,因此它们需要采取安全措施。一般操作系统采取环状保护模式。

上图就能看出,越往内层,权限级别越高。最外层是应用权限层,中间两层是设备驱动权限层,中间是内核权限层。
权限包围(Privilege Bracking)
Linux提供一一个能力,比如有一个应用需要临时使用高级权限,可以验证身份通过后,赋予临时高级权限,当这个应用执行完相应的操作,马上恢复为普通权限。这样能做到减少应用在高级权限的时间,做到专权专用,防止被恶意程序利用。
用户分组指令
groups指令:查看当前用户的所有分
id指令:查看当前用户

其中,uid是当前用户id,gid是组id,groups后面的是每个分组和分组id。
cat /etc/passwd:查看所有用户信息

以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用户,读写执行操作都没问题。但是对于普通用户,则无法进入目录。
目录的可执行权限的作用
- 进入目录
- 访问内部文件
- 对目录底下清单的修改,如增加,修改文件名,删除等