Linux用户权限管理之 su和sudo

首先需要说明,su和sudo这两个命令产生的原因。根本原因在于Linux系统是一个多角色的系统,按默认角色来说,分为超级管理员,系统预设用户,普通服务所使用的用户和普通用户,ID的值为0时,表示系统管理员;(1-99)为系统预设账号;(100-499)保留给一些服务使用;(500-65535)给一般使用者使用(id 要查询的用户名,这个命令可返回给出 用户id数),id不可重复,通常id是在新建用户时指定或者由系统自动生成。因此,除了0这个id以外,并无实际意义,ID0也就是root用户时系统中唯一的自系统启动后就有的超级管理用户,也可以视作系统内的上帝(可能有人会抬杠,我给某些文件加特殊属性比如i a属性,root用户也无法删除,其实这是错误的,因为root用户可以随时去掉这些特殊属性,然后进行后续操作,只是特殊隐藏属性不易被发现而已)。

权限最高的用户为root用户,id为0,用户组最高权限为wheel,在wheel组内的用户等同于root用户,可视作root用户的扩展组。

由于权限的细分,因此在系统使用时,需要经常的切换用户,比如,登录时为普通用户,需要更改某些系统配置文件,此时就需要切换到高权限的root用户了,或者比如,登录用户为root,但使用root用户的操作者并不太熟悉系统,此时,为了防止误操作,需要切换到普通用户,以提高安全性。

如果没有su命令,那么,切换用户就需要先注销该用户状态,在重新输入要切换的用户名和密码了,无疑,这样是非常的不人性化的,因此,Linux系统推出了su命令,该命令为switch user的简写,所以呢,su 用户名后,需要验证的是要切换用户的密码喽。默认的root用户可以省略哦,也就是只有su  ,然后输入root用户密码,即可切换为root用户。

但,每一个用户都有一个环境变量,也就是~/.bash_profile 所定义的环境变量,此时的切换后,并不使用切换后的用户这个文件,仍然使用旧的用户文件,那么,怎么让环境变量跟随用户切换呢? su - 用户名即可,这个命令表明环境变量随用户变化哦。默认的root用户可以省略哦,也就是只有su - ,然后输入roo用户密码,即可切换为root用户并使用roo的环境变量。等同于登录。

但这么做是不安全的,su命令后,切换到哪个用户,就具有完全登录性质,命令提示符前的用户表明这就是一个登录。因此,常常因为su后忘了是在使用root用户而造成误操作。因此又推出了sudo命令,也可以理解为临时切换用户,sudo +要执行的命令,临时的获取到root用户权限,以root身份执行命令,但环境变量还是使用原用户的。(root是默认的,可以省略的,同su 命令一样哦)。

sudo+命令后,会要求输入当前用户密码验证,如果频繁使用该命令,每次都要输入自身用户密码,也是很让人烦躁的,因此,可以进行免密sudo。

sudo,也可以称为提权,是由root用户使用visudo命令打开一个文件并修改其中的配置来实现的。当然,免密操作也是在root身份下实现。

总结:

假设我现在有两个普通用户,用户名分别为zsk1,zsk2,密码不相同,zsk1的密码为 zsk1,zsk2的密码为zsk2,在root用户下的 /etc/profile 声明两个变量,zsk1=zsk1 zsk2=zsk2

Linux用户权限管理之 su和sudo_ssh

并激活这两个变量,source /etc/profile,注意了,这两个变量是root用户的。

[root@centos8 ~]# echo $zsk1
zsk1
[root@centos8 ~]# echo $zsk2
zsk2

命令: 

[root@centos8 ~]# su zsk1
[zsk1@centos8 root]$ echo $zsk1
zsk1
[zsk1@centos8 root]$ echo $zsk2
zsk2
[zsk1@centos8 root]$ su zsk2
Password:
[zsk2@centos8 root]$ echo $zsk1
zsk1
[zsk2@centos8 root]$ echo $zsk2
zsk2

可以看到,/etc/profile 这个文件的环境变量是全局的,所有用户都可以收到的。

切换到zsk1这个用户,在.bash_profile 文件内写入如下变量: zsk11=zsk11 zsk22=zsk22

重点来了:

[root@centos8 ~]# su zsk2
[zsk2@centos8 root]$ exit
[root@centos8 ~]# su - zsk2
Last login: Thu Dec 17 18:43:15 CST 2020 on pts/0
[zsk2@centos8 ~]$

以上表明,su 用户名,环境变量仍然是继承前一个用户,因为第二行 还是在root目录。

[zsk2@centos8 ~]$ su zsk1
Password:
[zsk1@centos8 zsk2]$ echo $zsk11
[zsk2@centos8 ~]$ su - zsk1
Password:
Last login: Thu Dec 17 18:45:52 CST 2020 on pts/0
[zsk1@centos8 ~]$ echo $zsk11
zsk11

 这个例子更为直观,zsk1切换到zsk2  su 用户名方式,zsk1的变量zsk11 并没有找到,更改为su - 用户名方式后,可以正确的获取到zsk11这个变量了。也就是说su - 用户名的方式等同于全新登陆。那么可以得出结论,su 用户名 继承前面用户的环境变量,su - 用户名 没有继承,是哪个用户就用哪个用户的环境变量。因此,在工作使用中,为了保持环境变量的一致,请使用su - 用户名的方式,su 用户名的意义在于测试环境变量。

su 切换用户,不管是切换到哪个用户,都是验证目标用户的密码。比如,zsk1 切换到zsk2 ,这时候验证的是zsk2用户的密码,同样的普通用户切换奥root用户也是验证root用户的密码。

有这么一个规则:su命令  低权限用户切换到高权限用户,验证高权限用户的密码,高权限用户切换到低权限用户,不需要验证密码,直接切换。不管是su 还是su -  (当然了,su -  和su 命令都是切换到root用户,只是省略了root用户名而已,全都是需要root密码的哦,默认就等于root,等于可以省略)。

sudo命令的启用:

有些博客写的更改某些文件的读写权限,然后使用vim编辑文件从而启用sudo,这是错误的方法,万一权限更改完了忘改回来了,那么任意用户都可以修改了,sudo权限不就全面失守了?? 因此,不管任何时候,sudo命令开启请先切换到root用户,然后使用 visudo命令,打开一个文本后,在这个tmp文件内修改后保存。(注意,必须是root用户才可以使用visudo命令,不应该使用别的用户执行visudo命令~!!!!!!)

Linux用户权限管理之 su和sudo_数据库_02

 

sudo的实际使用:

Linux用户权限管理之 su和sudo_ubuntu_03

找到 root ALL=(ALL) 这一行,在这一行下面照写,第一列替换成要sudo的账号即可,如上图,我是设置了zsk1账号免密sudo,zsk2 只是sudo。

[root@centos8 zsk1]# su - zsk2
Last login: Thu Dec 17 18:58:10 CST 2020 on pts/0
[zsk2@centos8 ~]$
[zsk2@centos8 ~]$ sudo cat /etc/shadow

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] password for zsk2:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
略略略。。。。。。。。。。。

可以看到原来只有root账号有权访问的 /etc/shadow  现在zsk2也可以访问了,这个时候验证的是普通账号zsk2的密码,并不是root账号密码,这一点尤其需要注意。

Linux用户权限管理之 su和sudo_ubuntu_04

for 后面跟的是哪个用户就要求验证的是哪个用户的密码哦。

此时,如果切换到zsk1用户,在执行 cat /etc/passwd 这个命令,那么由于前面配置了免密sudo,因此,不会要求输入自己的密码,这样会更方便哦。

sudo命令是最为常用的临时提升权限的做法。原因如下:

验证的密码为当前用户密码,并不需要root密码,从而避免root密码外泄的风险。并且没有做切换,环境变量仍然是使用全局+自身。

zsk2@centos8 ~]$ sudo rm -rf /
[sudo] password for zsk2:
rm: it is dangerous to operate recursively on ‘/’
rm: use --no-preserve-root to override this failsafe

可以看到 即使sudo了,删除根目录的操作也不能够完成。当然,诸如此类的危险操作大部分都是无法完成的。安全性大大提高了。 

su 和su - 有一个切换动作,并且是完全的权限,因此,如果忘记是su的root的话,那么狠可能出现无法挽回的误操作。

最终总结:

从安全性的角度来说,sudo > su > su -> root

常用命令如下:

su 用户名

su - 用户名

sudo  要执行的命令(使用这个命令前需要以root用户登陆 在visudo命令内写入要sudo的账号)  这个是最常用的哦

su 后面接的用户名,然后必定是验证这个用户的密码,如果省略了,表示是root用户,验证的就是root用户的密码。

有这么一个规则:su命令  低权限用户切换到高权限用户,验证高权限用户的密码,高权限用户切换到低权限用户,不需要验证密码,直接切换。不管是su 还是su -  (当然了,su -  和su 命令都是切换到root用户,只是省略了root用户名而已,全都是需要root密码的哦,默认就等于root,等于可以省略)。