往往公司的服务器对外都是禁止root用户直接登录,所以我们通常使用的都是普通用户。
当我们使用普通用户执行/sbin目录下的命令时,会发现没有权限运行,这种情况下我们无法正常的管理服务器, 这时候我们就需要来给用户提升权限了。
如何提权
我们可以提权的方法有两种:
1.su切换用户,使用普通用户登录,然后使用su命令切换到root。优点:简单 缺点:需要知道root密码
2.sudo提权,当需要使用root权限时进行提权,而无需切换至root用户,优点:安全、方便 缺点:复杂
su身份切换
在使用su切换前,我们需要了解一些预备知识。
-
Linux Shell主要分为如下几类:
交互式shell,等待用户输入执行的命令(终端操作,需要不断提示) 非交互式shell,执行shell脚本, 脚本执行结束后shell自动退出 登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种 非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
-
bash shell配置文件介绍(文件主要保存用户的工作环境)
个人配置文件:~/.bash_profile ~/.bashrc 。
全局配置文件:/etc/profile /etc/profile.d/*.sh /etc/bashrc
profile类文件, 设定环境变量, 登陆前运行的脚本和命令。bashrc 类文件, 设定本地变量, 定义命令别名
如果全局配置和个人配置产生冲突,以个人配置为准。
- 登陆系统后,环境变量配置文件的应用顺序是?
登录式shell配置文件执行顺序: /etc/profile->/etc/profile.d/.sh->/.bash_profile->/.bashrc->/etc/bashrc
非登陆式shell配置文件执行顺序: ~/.bashrc->/etc/bashrc->/etc/profile.d/.sh
PS: 验证使用echo在每行添加一个输出即可
su命令切换用户和上面所说的预备知识的关系。
su - username属于登陆式shell,
而su username属于非登陆式shell,区别在于加载的环境变量不一样。
普通用户su -可以直接切换至root用户,但需要输入root用户的密码。
超级管理员root用户使用su - username切换普通用户不需要输入任何密码
[Q_pig@localhost ~]$ su #1.普通用户使用su切换root
密码: #输入root的密码
[root@localhost Q_pig]# pwd #查看当前所在位置
/home/Q_pig
#2.普通用户使用su -切换到root,会加载root的环境变量
[Q_pig@localhost ~]$ su -
密码:
[root@localhost ~]# pwd
/root
#3.以某个用户的身份执行某个服务,使用命令su -c username
[root@localhost ~]# su - Q_pig -c 'ifconfig'
[root@localhost ~]# su - Q_pig -c 'ls ~'
sudo提权
su命令在切换用户身份时,需要用到root用户的密码。这样的话每个普通用户都能拿到root用户的密码,如果某个用户不小心泄漏了root的密码,那系统会变得非常不安全。为了改进这个问题,从而产生了sudo这个命令。
sudo提权就是当需要执行一些高级操作时,普通用户可以拥有某些权限,但正常情况下还是普通普通用户,还是会受到限制。
快速配置sudo的方式:
[root@localhost ~]# usermod bgx -G wheel
[root@localhost ~]$ sudo tail -f /var/log/secure #sudo审计日志
正常配置sudo的方式:
[root@www ~]# visudo #=> vim /etc/sudoers 修改sudoers文件配置
配置完之后提升权限的方法:
[root@localhost ~]# su - Q_pig #1.切换普通用户
[Q_pig@localhost ~]$ sudo -l #2.检查普通用户能提权的命令
User xuliangwei may run the following commands on this host:
(ALL) ALL
[Q_pig@localhost ~]$ rm -rf /opt/ #3.普通用户正常情况下是无法删除opt目录的
rm: cannot remove '/opt/1.reep': Permission denied
[Q_pig@localhost ~]$ sudo rm -rf /opt #4.使用sudo提权,需要输入普通用户的密码。
提升的权限太大,如何限制仅开启某个命令的使用权限,其他命令不允许。
- 使用sudo中自带的别名操作,将多个用户定义成一个组,这个组只有sudo认可
[root@localhost ~]# visudo #==>vi /etc/sudoers 编辑sudoers文件来配置
User_Alias OPS = oldboy,alex # 使用sudo定义分组,这个系统group没什么关系
User_Alias DEV = bgx,py
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping # 定义可执行的命令组,便于后续调用
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
Cmnd_Alias STORAGE = /bin/mount, /bin/umount
Cmnd_Alias DELEGATING = /bin/chown, /bin/chmod, /bin/chgrp
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES
DEV ALL=(ALL) SOFTWARE,PROCESSES # 使用sudo开始分配权限
#最后登陆对应的用户使用 sudo -l 验证权限
- 使用groupadd添加组,然后给组分配sudo的权限,如果有新用户加入,直接将用户添加到该组.
#添加两个真实的系统组, group_dev group_op
[root@localhost ~]# groupadd group_dev
[root@localhost ~]# groupadd group_op
#添加两个用户, group_dev(user_a user_b) group_op(user_c user_d)
[root@localhost ~]# useradd user_a -G group_dev
[root@localhost ~]# useradd user_b -G group_dev
[root@localhost ~]# useradd user_c -G group_op
[root@localhost ~]# useradd user_d -G group_op
#添加密码
[root@localhost ~]# echo "1" | passwd --stdin user_a
[root@localhost ~]# echo "1" | passwd --stdin user_b
[root@localhost ~]# echo "1" | passwd --stdin user_c
[root@localhost ~]# echo "1" | passwd --stdin user_d
#在sudo中配置规则
[root@localhost ~]# visudo
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
Cmnd_Alias STORAGE = /bin/mount, /bin/umount
Cmnd_Alias DELEGATING = /bin/chown, /bin/chmod, /bin/chgrp
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
%group_dev ALL=(ALL) SOFTWARE
%group_op ALL=(ALL) SOFTWARE,PROCESSES
#检查sudo是否配置有错
[root@localhost ~]# visudo -c
/etc/sudoers: parsed OK
#检查user_a,和user_d的sudo权限
[user_a@localhost ~]$ sudo -l
User user_a may run the following commands on www:
(ALL) /bin/rpm, /usr/bin/yum
[user_d@localhost ~]$ sudo -l
User user_d may run the following commands on www:
(ALL) /bin/rpm, /usr/bin/yum, /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
sudo,并不能完全的解决所有的权限问题,仅仅是相对的。 (需要有一个操作审计平台,来监督每个人的操作。 jumpserver )
sudo命令的执行流程
- 普通用户执行sudo命令时, 会检查/var/db/sudo是否存在时间戳缓存
- 如果存在则不需要输入密码, 否则需要输入用户与密码
- 输入密码会检测是否该用户是否拥有该权限
- 如果有则执行,否则报错退出
如图: