su切换用户与sudo提权
一 介绍
因为root用户的权限太大,破坏力太强,安全风险极高,所以通常情况下公司的服务器对外都是禁止root用户直接登录的,而运维组的小伙伴通常使用的都是普通用户,但是运维组内的小伙伴们在进行日常运维管理的过程中,经常需要获得某些root才有的管理权限才能完成任务,例如需要执行/sbin目录下的命令。
那么如何才能在不使用root用户直接登录操作系统的同时又能保证普通用户完成日常工作呢,有两种方案
1、su切换用户身份
特点:使用普通用户登录,然后使用su命令切换到root账户下
优点:简单粗暴
缺点:
1、需要知道root密码
2、权限控制不精细:每次都是获取所有root权限
2、sudo提取部分管理员权限
特点:
1、使用普通用户登录,然后sudo命令提取root用户的部分管理权限,注意只是某部分,而不是全部。
2、不需要切换到root账户下
缺点:相对复杂
优点:
1、不需要知道root密码,输入的是用户自己的密码
2、权限控制更为精细:可以控制普通用户只获取部分root权限
二 su切换用户
2.1 储备知识
在linux系统中
- 1、按照shell接收指令的形式上的不同,我们之前把shell分为交互式与非交互式
- 2、按照进入shell环境的方式的不同,我们可以把shell分为登录式与非登录式
# 1、登陆式shell(日常最多): 用户在登录时启动的shell,例如终端模拟器,如ssh,或者在控制台直接输入的用户名和密码。 # 2、非登陆式shell 登录后被用户手动启动的shell,例如在终端中直接输入bash或sh命令。
交互式与非交互式的核心区别就是接收指令的形式上的不同,而登录式与非登录的核心区别表面是进入shell环境的形式上的不同,但实际上的区别是读取与执行的配置文件的不同
登录shell进入形式:通过账号密码登录系统、或su – egon、或ssh远程登录
加载的配置文件顺序如下
# 1、/etc/profile # 系统级
# 2、/etc/profile.d/*.sh # 系统级
# 3、如果是centos9.3,在这里会多加载一次/etc/bashrc
# 4、~/.bash_profile # 用户级
# 5、~/.bashrc # 用户级
# 6、/etc/bashrc # 系统级
在非登录shell即su egon时,加载配置文件
# 1、~/.bashrc
# 2、/etc/bashrc
# 3、/etc/profile.d/*.sh
补充:
profile类文件, 设定环境变量, 登陆前运行的脚本和命令。
bashrc类文件, 设定本地变量, 定义命令别名
PS: 如果全局配置和个人配置产生冲突,以个人配置为准。
补充
# 1、从root往普通用户下切换无需输入密码,反之则需要
# 2、切换身份执行命令:su - 用户 -c “命令”
三 sudo提权
在日常的运维工作中,我们不应该把root的密码公开给所有人,因为,一方面,真那样做的话,安全风险就太高了,删库到跑路发生的概率估计会加大,另外一方面,小伙伴们大多数情况下只需要提取某一些权限来使用即可也并不是需要所全部的管理员权限,所以说sudo比su更为靠谱一些。
通过配置sudo,我们可以实现让普通用户输入自己的密码的情况下而获取我们为其配置的特定权限,这样,既保证了普通用户拥有他想要的特定权限,又不至于泄露管理root的密码。
二 配置
两种编辑方式
1、visudo(会提示语法错误,推荐使用)
[root@egon ~]# visudo -c # 检查配置是否正确
/etc/sudoers:解析正确
[root@egon ~]#
2、vim /etc/sudoers
# sudo 语法
user MACHINE=COMMANDS
# 示如
# root ALL=(ALL) ALL
1、root:用户
2、ALL:代表用户可以在哪台机器上执行指令,通常设置为ALL,如果设置为localhost代表在本机上执行指令。
也可以设置为本机以外的其他IP地址或主机名,此时该/etc/sudoers虽然是在本机上配置的,但用户登录到本机
后仍然是无法执行命令的,如果把/etc/sudoers这个配置文件复制到指定ip或主机名的那台机器上,就好用了
配置文件中讲到:
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
即/etc/sudoers文件可以在多个系统之间共享,如果我们设置成ALL的话就省事了,该文件复制到人任意一台机器
上的完成的权限配置都一样
3、(All):表示允许用户以哪个用户的权限做事情
4、ALL:所有命令
最终解释:root用户可以在所有主机上以任意用户身份执行所有命令
%xxx ALL=(ALL:ALL) ALL
含义:xxx 组中的用户,可以在所有主机上以所有用户和组执行所有命令。
tom ALL=(ALL) ALL # egon用户在任何机器上,可以以任何用户身份执行任何命令等同于root用户
lili ALL=(ALL) NOPASSWD: ALL # 免密
egon ALL=(ALL) /bin/cp,/bin/touch # 只允许tom用户以root用户的身份执行cp,touch命令
egon01 ALL=(ALL) ALL,!/usr/bin/vim /test/a.txt # !代表取反
egon02 ALL=(ALL) /usr/bin/passwd [a-zA-Z]*,/usr/bin/vim *,!/usr/bin/vim /test/a.txt # 可以编辑所有文件,除了/test/a.txt
# 可以测试
[root@egon ~]# su - egon02
上一次登录:二 12月 20 11:21:01 CST 2022pts/0 上
[egon02@egon ~]$
[egon02@egon ~]$ sudo vim /test/b.txt
[egon02@egon ~]$ sudo vim /test/a.txt
对不起,用户 egon02 无权以 root 的身份在 egon 上执行 /bin/vim /test/a.txt。
[egon02@egon ~]$
测试
[root@egon ~]# su - egon
上一次登录:四 9月 10 20:27:09 CST 2020pts/0 上
[egon@egon ~]$ ll -d /etc/
drwxr-xr-x. 146 root root 8192 9月 10 20:27 /etc/
[egon@egon ~]$ touch /etc/a.txt # =================> 没有权限
touch: 无法创建"/etc/a.txt": 权限不够
[egon@egon ~]$ sudo touch /etc/a.txt # =================> 使用sudo提权
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] egon 的密码:
[egon@egon ~]$ ll /etc/a.txt
-rw-r--r-- 1 root root 0 9月 10 20:28 /etc/a.txt
ps: sudo 执行流程
1.普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存
2.如果存在则不需要输入密码, 否则需要输入用户与密码
3.输入密码会检测是否该用户是否拥有该权限
4.如果有则执行,否则报错退出
Sudo 常用参数
sudo常用参数:
-l : 登录用户下面,执行sudo -l 显示当前用户有哪些权限
-k :删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码
--> 系统默认也是5分钟失效
--> 配置免密是另一种情况 NOPASSWD: ALL远程sudo(有条件限制的)
其他配置详见配置文件
三 sudo实例
企业生产环境用户权限集中管理方案实例