目录

一、权限具象

1.1用户和组

二、和权限有关的几个问题

2.1文件被创建后,初始的权限怎么设置?

2.2公共执行文件的权限

2.3执行文件

2.4可不可以多个用户都登陆root,之后只用root帐户?

三、权限构架思想

3.1权限界定

3.2分级保护

3.3用户分组指令

3.3.1查看

3.3.2创建用户

3.3.3创建分组

3.3.4为用户降低次级分组

3.3.5更改用户主要分组

四、问题

一、权限具象

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

1.1用户和组

Linux是一个多用户平台,允许多个用户同时登入系统工作。Linux将用户具象成了帐户,帐户可以登入系统,例如通过输入登入名+密码的形式登陆;也可以通过证书的形式登陆。

但为了便捷分配每位用户的权限,Linux还支持组(Group)帐户。组帐户是多个帐户的集合,组可以为成员们分配某一类权限。每位用户可以在多个组,这样就可以借助组给用户快速分配权限。

组的概念有点像陌陌群。一个用户可以在多个群中。例如某个组中分配了10个目录的权限,这么新建用户的时侯可以将这个用户降低到这个组中,这样新增的用户就毋须再去一个个目录分配权限。

而每一个陌陌群都有一个群主,Root帐户也叫作超级管理员,就相当于陌陌群主,它对系统有着完全的掌控。一个超级管理员可以使用系统提供的全部能力。

据悉,Linux还对文件进行了权限具象(注意目录也是一种文件)。Linux中一个文件可以设置下边3种权限:

读权限(r):控制读取文件。写权限(w):控制写入文件。执行权限(x):控制将文件执行,例如、应用程序等。

linux修改环境变量 系统崩了_linux 系统修改时间_linux修改环境变量 系统崩了

之后每位文件又可以从3个维度去配置上述的3种权限:

用户维度。每位文件可以所属1个用户linux启动盘制作工具,用户维度配置的rwx在用户维度生效;组维度。每位文件可以所属1个分组,组维度配置的rwx在组维度生效;全部用户维度。设置对所有用户的权限。

linux修改环境变量 系统崩了_linux修改环境变量 系统崩了_linux 系统修改时间

因而Linux中文件的权限可以用9个字符linux行和编程宝典,3组rwx描述:

之后用-代表没有权限。例如rwxrwxrwx代表所有维度可以读写执行。rw--wxr-x代表用户维度不可以执行,组维度不可以读取,所有用户维度不可以写入。

一般情况下,假若用ls-l查看一个文件的权限,会有10个字符,这是由于第一个字符代表的是文件类型。我有管线文件、目录文件、链接文件等等。

-代表普通文件、d代表目录、p代表管线。

二、和权限有关的几个问题2.1文件被创建后,初始的权限怎么设置?

一个文件创建后,文件的所属用户会被设置成创建文件的用户。谁创建谁拥有,这个逻辑很顺理成章。并且文件的组又是怎样分配的呢?

这儿Linux想到了一个挺好的办法,就是为每位用户创建一个同名分组。

例如说zhang这个帐户创建时,会创建一个叫作zhang的分组。zhang登陆以后,工作分组都会默认使用它的同名分组zhang。假如zhang想要切换工作分组,可以使用newgrp指令切换到另一个工作分组。因而,被创建文件所属的分组是当时用户所在的工作分组,假如没有非常设置,这么就属于用户所在的同名分组。

再说下文件的权限怎样?文件被创建后的权限一般是:

rw-rw-r--

也就是用户、组维度不可以执行,所有用户可读。

2.2公共执行文件的权限

后面提及过可以用which指令查看ls指令所在的目录,我们发觉在/usr/bin中。之后用ls-l查看ls的权限,可以看见右图所示:

~]# ls -l /usr/bin/ls
-rwxr-xr-x 1 root root 143368 Jun 10  2020 /usr/bin/ls

第一个-代表这是一个普通文件,前面的rwx代表用户维度可读写和执行;第二个r-x代表组维度不可以写;第三个r-x代表所有用户可以读和执行。前面的两个root,第一个是所属用户,第二个是所属分组。

到这儿你可能会有一个疑惑:假如一个文件设置为不可读,并且可以执行,这么结果会如何?

答案其实是不可以执行,难以读取文件内容自然不可以执行。

2.3执行文件

在Linux中,假如一个文件可以被执行,则可以直接通过输入文件路径(相对路径或绝对路径)的形式执行。假如想执行一个不可以执行的文件,Linux则会报错。

当用户输入一个文件名,假如没有指定完整路径,Linux都会在一部份目录中查找这个文件。你可以通过echo$PATH见到Linux会在什么目录中查找可执行文件,PATH是Linux的环境变量

 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/go/bin:/root/bin

2.4可不可以多个用户都登陆root,之后只用root帐户?

最后一个问题是,可不可以都root?

答案其实是不行!但却我们实际生产中就如此使用,root权限真的太危险,应当提升linux权限使用的意识。

内核提供操作硬件、磁盘、内存分页、进程等最核心的能力,并拥有直接操作全部显存的权限,因而内核不能把自己的全部能力都提供给用户,并且也不能容许用户通过shell指令进行系统调用。Linux下内核把部份进程须要的系统调用以C语言API的方式提供下来。部份系统调用会有权限检测,例如说设置系统时间的系统调用。

三、权限构架思想

优秀的权限构架主要目标是让系统安全、稳定且用户、程序之间互相掣肘、相互隔离。这要求权限系统中的权限界定足够清晰,分配权限的成本足够低。

为此,优秀的构架,应当遵守最小权限原则(LeastPrivilege)。权限设计须要保证系统的安全和稳定。诸如:每一个成员拥有的权限应当足够的小,每一段特权程序执行的过程应当足够的短。对于安全级别较高的时侯,还须要成员权限相互制衡。诸如金融领域一般登陆线上数据库须要两次登陆,也就是须要两个密码,分别把握在两个角色手中。这样即使一个成员出了问题,也可以保证整个系统安全。

同样的,每位程序也应当减轻权限,例如说只拥有少量的目录读写权限,只可以进行少量的系统调用。

3.1权限界定

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

3.2分级保护

由于内核可以直接操作显存和CPU,因而十分危险。驱动程序可以直接控制摄像头、显示屏等核心设备,也须要采取安全举措,例如避免恶意应用开启摄像头窃取隐私。一般操作系统都采取一种环状的保护模式。

linux 系统修改时间_linux修改环境变量 系统崩了_linux修改环境变量 系统崩了

如上图所示,内核在最上面,也就是Ring0。应用在最外边也就是Ring3。驱动在中间,也就是Ring1和Ring2。对于相邻的两个Ring,外层Ring会拥有较高的权限,可以改变内层的Ring;而内层的Ring想要使用外层Ring的资源时,会有专门的程序(或则硬件)进行保护。

例如说一个Ring3的应用须要使用内核,就须要发送一个系统调用给内核。这个系统调用会由内核进行验证,例如验证用户有没有足够的权限,以及这个行为是否安全等等。

3.3用户分组指令3.3.1查看

使用groups指令

前面指令列举当前用户的所有分组。第一个是同名的主要分组,前面从adm开始是次级分组。

我先给你介绍两个分组,其他分组你可以去查资料:

假如想查看当前用户,可以使用id指令,如下所示:

~]# id
uid=0(root) gid=0(root) groups=0(root)

假如想查看所有的用户,可以直接看/etc/passwd。

 ~]# more /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

/etc/passwd这个文件储存了所有的用户信息,如右图所示:

linux修改环境变量 系统崩了_linux 系统修改时间_linux修改环境变量 系统崩了

sudo usermod -a -G sudo foo

3.3.2创建用户

sudo useradd foo

sudo本意是superuserdolinux修改环境变量 系统崩了,后来演弄成用另一个用户的身分去执行某个指令。若果没有指定须要sudo的用户,如同前面那样,就是以超级管理员的身分。由于useradd须要管理员身分。这句话执行后,会进行权限提高,并弹出输入管理员密码的输入界面。

3.3.3创建分组

sudo groupadd hello

3.3.4为用户降低次级分组

组分成主要分组(PrimaryGroup)和次级分组(SecondaryGroup)。主要分组只有1个,次级分组可以有多个。假如想为用户添加一个次级分组,可以用usermod指令。下边指令将用户foo添加到sudo分组,因而foo拥有了sudo的权限。

sudo usermod -a -G sudo foo

-a代表append,-G代表一个次级分组的清单linux修改环境变量 系统崩了,最后一个foo是帐户名。

3.3.5更改用户主要分组

sudo usermod -g somegroup foo

四、问题

1、为什么不用root帐户执行程序?

举个反例,你有一个Mysql进程执行在root(最大权限)帐户上,假如有黑客攻占了你的Mysql服务,获得了在Mysql上执行Sql的权限,这么,你的整个系统就都曝露在黑客眼前了。这会造成极其严重的后果。

黑客可以借助Mysql的CopyFromPrgram指令为所欲为,例如先备份你的关键文件,之后再删掉她们,并逼迫你通过指定帐户打款。倘若执行最小权限原则,这么黑客虽然攻占我们的Mysql服务,他也只能获得最小的权限。其实,黑客领到Mysql权限也是十分可怕的,而且相比领到所有权限,这个损失就小多了。

2、请详述Linux权限界定的原则?

Linux依循最小权限原则。每位用户把握的权限应当足够小,每位组把握的权限也足够小。实际生产过程中,最好管理员权限可以分拆,相互制衡避免问题。每位应用应该尽可能小的使用权限。最理想的是每位应用单独占用一个容器(例如Docker),这样就不存在相互影响的问题。虽然应用被攻占,也未能攻克Docker的保护层。尽可能少的root。假如一个用户须要root能力,这么应该进行权限包围——马上提高权限(例如sudo),处理后马上释放权限。系统层面实现权限分级保护,将系统的权限分成一个个Ring,内层Ring调用外层Ring时须要外层Ring进行权限校准。

本文原创地址://lrxjmw.cn/lqxjgsxqxhfj.html编辑:刘遄,审核员:暂无