su-切换用户 sudo-提权
1. su sudo介绍
switch user
Change the effective user id and group id to that of USER
switch user, do
execute a command as another user
因为root用户的权限太大,破坏力太强,安全风险极高,所以通常情况下公司的服务器对外都是禁止root用户直接登录的
而运维组的小伙伴通常使用的都是普通用户,但是运维组内的小伙伴们在进行日常运维管理的过程中,经常需要获得某些root才有的管理权限才能完成任务,例如需要执行/ sbin目录下的命令
那么如何才能在不使用root用户直接登录操作系统的同时又能保证普通用户完成日常工作呢?
1 . su切换用户身份
特点:
使用普通用户登录,然后使用su命令切换到root账户下
优点:
简单粗暴
缺点:
1 . 需要知道root密码
2 . 权限控制不精细 每次都是获取所有root权限
2 . sudo提取部分管理员权限
特点:
1 . 使用普通用户登录,然后sudo命令提取root用户的部分管理权限,注意只是某部分,而不是全部。
2 . 不需要切换到root账户下
优点:
相对复杂
缺点:
1 . 不需要知道root密码,输入的是用户自己的密码
2 . 权限控制更为精细 可以控制普通用户只获取部分root权限
2. su-切换用户
登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种
非登陆shell,不需要输入用户和密码就能进入Shell, 比如运行bash会开启一个新的会话窗口
交互式,等待用户输入执行的命令( 终端操作, 需要不断提示)
非交互式,执行shell脚本, 脚本执行结束后shell自动退出
1 . 作用
主要保存用户的工作环境
2 . 配置文件
1 . 全局配置文件
/ etc/ profile
/ etc/ profile. d/ * . sh
/ etc/ bashrc
2 . 个人配置文件
~ / . bash_profile
~ / . bashrc
'''
profile类文件, 设定环境变量, 登陆前运行的脚本和命令
bashrc类文件, 设定本地变量, 定义命令别名
PS:
如果全局配置和个人配置产生冲突,以个人配置为准
'''
3 . 配置文件的应用顺序
1 . 如果执行的是登录式shell,那么配置文件执行顺序是
/ etc/ profile
- > / etc/ profile. d/ * . sh
- > ~ / . bash_profile
- > ~ / . bashrc
- > / etc/ bashrc
2 . 如果执行的是非登录式shell,那么配置文件执行顺序是
~ / . bashrc
- > / etc/ bashrc
- > / etc/ profile. d/ * . sh
PS: 验证使用echo在每行添加一个输出即可,注意,要把输出放在文件的第一行
4 . 执行登录与非登录shell
1 . 执行登录shell:身份与环境都切换
su - 用户
2 . 执行非登录shell:只切换用户身份
su 用户
1 . 从root往普通用户下切换无需输入密码,反之则需要
2 . 切换身份执行命令:su - 用户 - c “命令”
3. sudo-提权
1. 简介
在日常的运维工作中,我们不应该把root的密码公开给所有人
因为,一方面,真那样做的话,安全风险就太高了,删库到跑路发生的概率估计会加大
另外一方面,小伙伴们大多数情况下只需要提取某一些权限来使用即可也并不是需要所全部的管理员权限,所以说sudo比su更为靠谱一些
通过配置sudo,我们可以实现让普通用户输入自己的密码的情况下而获取我们为其配置的特定权限,这样,既保证了普通用户拥有他想要的特定权限,又不至于泄露管理root的密码
2. 配置
1 . visudo(会提示语法错误,推荐使用)
[ root@lee ~ ]
/ etc/ sudoers:解析正确
2 . vim / etc/ sudoers
user MACHINE= COMMANDS
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用户可以在所有主机上以任意用户身份执行所有命令
5 . 示例
tom ALL= ( ALL) ALL
lili ALL= ( ALL) NOPASSWD: ALL
lee ALL= ( ALL) / bin / cp, / bin / touch
lee01 ALL= ( ALL) ALL, !/ usr/ bin / vim / test/ a. txt
lee02 ALL= ( ALL) / usr/ bin / passwd [ a- zA- Z] * , / usr/ bin / vim * ,
!/ usr/ bin / vim / test/ a. txt
[ root@lee ~ ]
上一次登录:二 12 月 20 11 : 21 : 01 CST 2022pts/ 0 上
[ lee02@lee ~ ] $ sudo vim / test/ b. txt
[ lee02@lee ~ ] $ sudo vim / test/ a. txt
对不起,用户lee02无权以root的身份在lee上执行 / bin / vim / test/ a. txt
[ root@lee ~ ]
上一次登录:四 9 月 10 20 : 27 : 09 CST 2020pts/ 0 上
[ lee@lee ~ ] $ ll - d / etc/
drwxr- xr- x. 146 root root 8192 9 月 10 20 : 27 / etc/
[ lee@lee ~ ] $ touch / etc/ a. txt
touch: 无法创建"/etc/a.txt" : 权限不够
[ egon@egon ~ ] $ sudo touch / etc/ a. txt
6 . 总结
1 . 尊重别人的隐私
2 . 输入前要先考虑( 后果和风险)
3 . 权力越大,责任越大
7 . sudo 执行流程
1 . 普通用户执行sudo命令, 会检查/ var/ db/ sudo是否存在时间戳缓存
2 . 如果存在则不需要输入密码, 否则需要输入用户与密码
3 . 输入密码会检测该用户是否拥有该权限
4 . 如果有则执行,否则报错退出
3. sudo 常用参数
sudo常用参数
- l
登录用户下面,执行sudo - l 显示当前用户有哪些权限
- k
删除/ var/ db/ sudo/ 下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码
系统默认也是5 分钟失效
配置免密是另一种情况 NOPASSWD: ALL远程sudo( 有条件限制的)
4. sudo 实例
企业生产环境用户权限集中管理方案实例
根据角色的不同,给不同的用户分配不同的角色
1 . 创建初级工程师3 个,网络工程师1 个,中级工程师1 个,经理1 个
for user in chuji{ 01 . .03 } net01 senior01 manager01
> do
> useradd $user
> echo "111111" | passwd - - stdin $user
> done
2 . 创建5 个开发人员,属于phpers组
groupadd - g 999 phpers
for n in `seq 5 `
do
useradd - g phpers php0$n
done
3 . 创建开发经理,中级phper
for user in kaifaManager seniorPhper
> do
> useradd $user
> echo "111111" | passwd - - stdin $user
> done
4 . 编辑配置文件
[ root@localhost ~ ]
Cmnd_Alias CY_CMD_1= / usr/ bin / free, / usr/ bin / iostat, / usr/ bin / top, / bin / hostname,
/ sbin/ ifconfig, / bin / netstat, / sbin/ route Cmnd_Alias GY_CMD_1= / usr/ bin / free,
/ usr/ bin / iostat, / usr/ bin / top, / bin / hostname, / sbin/ ifconfig, / bin / netstat, / sbin/ route,
/ sbin/ iptables, / etc/ init. d/ network, / bin / nice, / bin / kill, / usr/ bin / kill,
/ usr/ bin / killall, / bin / rpm, / usr/ bin / updatedb, / usr/ bin / yum, / sbin/ fdisk, / sbin/ sfdisk,
/ sbin/ parted, / sbin/ partprobe, / bin / mount, / bin / umount Cmnd_Alias CK_CMD_1= / usr/ bin / tail,
/ bin / grep, / var/ log/ messages* Cmnd_Alias GK_CMD_1= / sbin/ service, / sbin/ chkconfig,
/ bin / tail, / var/ log/ * , / bin / grep, / bin / cat, / bin / ls, / bin / sh Cmnd_Alias GW_CMD_1=
/ sbin/ route, / sbin/ ifconfig, / bin / ping, / sbin/ dhclient, / usr/ bin / net, / sbin/ iptables,
/ sbin/ iwconfig, / sbin/ mii- tool, / bin / cat, / var/ log/ *
User_Alias CHUJI_YUNWEI_ADMINS= chuji01, chuji02, chuji03
User_Alias CHUJI_KAIFA_ADMINS= php01, php02, php03, php04, php05
User_Alias GAOJI_WANG_ADMINS= net01
Runas_Alias OP = root - - > 未来切换到某个角色执行任务
senior01 ALL= ( OP) GY_CMD_1
manager01 ALL= ( ALL) NOPASSWD: ALL
kaifaManager ALL= ( ALL) ALL, / usr/ bin / passwd [ A- Za- z] , !/ usr/ bin / passwd
root, !/ usr/ sbin/ visudo, !/ usr/ bin / vi * sudoer* , !/ usr/ bin / sudo su - , !/ bin / su
seniorPhper ALL= ( OP) GK_CMD_1
CHUJI_YUNWEI_ADMINS ALL= ( OP) CY_CMD_1
CHUJI_KAIFA_ADMINS ALL= ( OP) CK_CMD_1
GAOJI_WANG_ADMINS ALL= ( OP) GW_CMD_1
'''
注意点
1. 命令的路径要全路径
2. 别名需要大写
3. 超过一行,用"\"换行
4. 排除的命令一定在最后面写
5. kaifaManager 因为有ALL,所以可以直接su - 切换root,但是 sudo su -切换不了
'''