一、介绍

因为root⽤户的权限太⼤,破坏⼒太强,安全⻛险极⾼,所以通常情况下公司的服务器对外都是禁⽌root⽤户直接登录的,⽽运维组的⼩伙伴通常使⽤的都是普通⽤户,但是运维组内的⼩伙伴们在进⾏⽇常运维管理的过程中,经常需要获得某些root才有的管理权限才能完成任务,例如需要执⾏/sbin⽬录下的命令。那么如何才能在不使⽤root⽤户直接登录操作系统的同时⼜能保证普通⽤户完成⽇常⼯作呢,有两种⽅案

  1. su(switch user)切换用户身份,从一个身份切换到另一个身份
su - 用户名 (root用户切换普通用户不需要密码,反之需要root密码)  
特点:使⽤普通⽤户登录,然后使⽤su命令切换到root账户下
优点:简单粗暴
缺点: 1、需要知道root密码 
      2、权限控制不精细:每次都是获取所有root权限
  1. sudo:提权,即不切换身份,但是可以获取root的部分管理权限。
    首先需要在管理员身份下修改/etc/sudoers文件来分配权限
特点: 1、使⽤普通⽤户登录,然后sudo命令提取root⽤户的部分管理权限,注意只是某部分,⽽不是全部。 
       2、不需要切换到root账户下 
优点:相对复杂
缺点: 1、不需要知道root密码,输⼊的是⽤户⾃⼰的密码
      2、权限控制更为精细:可以控制普通⽤户只获取部分root权限

在使用 su 切换身份前,我们需要知道 shell 登录分类、环境变量配置文件加载顺序等

linux中的shell可以分两类

  • 登录shell:用户登录之后才能进入shell,日常中接触最多的一种
  su - 用户名 (默认进入用户~)
   身份与环境都切换
   默认加载配置文件顺序:
   /etc/profile--->/etc/profile.d/*.sh---->~/.bash_proflie--->~/.bashrc--->/etc/bashrc
   ps:验证使用echo在每行添加一句输出即可,需要把输出放入首位   
  • 非登录shell: 不需要输入用户和密码就能进⼊Shell,⽐如运⾏bash会开启⼀个新的会话窗⼝
 su 用户名 (不登录,还是在自己家)
 只切换用户身份
 默认加载配置文件顺序:
 ~/.bashrc----->/ect/bashrc------->/etc/profile.d/*.sh

bash shell配置⽂件介绍(⽂件主要保存⽤户的⼯作环境)

1. 全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
2. 个人配置文件
~/.bash_profile
~/.bashrc

如果想要针对登录shell与非登录shell统一配置用/etc/bashrc

以某个用户的身份执行某个服务,使用命令 su -c username

[root@localhost ~]# su - tom -c 'pwd'
/home/tom
[root@localhost ~]# 

二、sudo提权

  1. 先使用root用户对该账户进行授权
  2. 才能使用该账户提权,然后完成普通用户无法做到的事。
    在日常的运维工作中,我们不应该把root的密码公开给所有人,因为,一方面,真那样做的话,安全风险就太高了,删库到跑路发生的概率估计会加大,另外一方面,小伙伴们大多数情况下只需要提取某一些权限来使用即可也并不是需要所全部的管理员权限,所以说sudo比su更为靠谱一些。

通过配置sudo,我们可以实现让普通用户输入自己的密码的情况下而获取我们为其配置的特定权限,这样,既保证了普通用户拥有他想要的特定权限,又不至于泄露管理root的密码。

root用户修改/etc/sudoers配置文件
两种编辑方式
1、visudo(会直接打开文件,提示语法错误,推荐使用)
2、 vim /etc/sudoers (可以用visudo -c 检测一下语法)

## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL
用户    主机ip或主机名=( 能转换成的用户身份) 管理命令


# sudo 语法
user    MACHINE=COMMANDS      
 
# 示例
# root    ALL=(ALL)       ALL        
1、root:用户
2、ALL:代表用户可以在哪台机器上执行指令(服务器的ip地址),通常设置为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用户可以在所有主机上以任意用户身份执行所有命令
​
​
tom     ALL=(ALL)       ALL   # tom用户在任何机器上,可以以任何用户身份执行任何命令等同于root用户
lili     ALL=(ALL)     NOPASSWD: ALL #  lili用户免密同上
tom    ALL=(ALL)   /bin/cp,/bin/touch   # 只允许tom用户以root用户的身份执行cp,touch命令
​
tom1  ALL=(ALL) ALL,!/usr/bin/vim /test/a.txt  # !代表取反
tom2  ALL=(ALL) /usr/bin/passwd [a-zA-Z]*,/usr/bin/vim *,!/usr/bin/vim /test/a.txt # 可以编辑所有文件,除了/test/a.txt
tom3 ALL=(ALL) NOPASSWD: 命令的别名​

关于组的操作

方式一、
# 1.使用sudo定义的逻辑分组,这个组与系统组没关系;
User_Alias OPS = ops1,ops2   # OPS只是虚拟的组
User_Alias DEV = dev1,dev2
# 2.将相同命令逻辑上划分为一个命令集;
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
# 3.进行权限划分;为OPS/DEV组分配对应的命令集名称;
OPS  ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,STORAGE,DELEGATING,PROCESSES
DEV  ALL=(ALL) SOFTWARE,PROCESSES


方式二
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
%teacher ALL=(ALL)    ALL
teacher组对所有主机有所有权限,这时只需要创建teacher组,把用户添加到teacher组,用户就可以sudo 提权了。

Sudo 常用参数

sudo常用参数:

 -l : 登录用户下面,执行sudo -l  显示当前用户有哪些权限
 -k :删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码
            --> 系统默认也是5分钟失效
            --> 配置免密是另一种情况  NOPASSWD: ALL远程sudo(有条件限制的)

sudo 执行流程
1.普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存

2.如果存在则不需要输入密码, 否则需要输入用户与密码

3.输入密码会检测是否该用户是否拥有该权限

4.如果有则执行,否则报错退出

在这里插入图片描述

练习:
1.授予 jack 用户能通过 sudo 执行 ls,sed,awk 命令权限如何书写
jack ALL=(ALL) /bin/ls,/bin/sed,/bin/awk
2.授予 alice 用户,sudo 执行 linux 所有命令并且不用输入密码如何书写
alice ALL=(ALL) NOPASSWD:ALL
3.授权 tom 用户, sudo 执行 passwd 命令修改任何用户的密码,但唯独不能修改 root 用户的密码;
tom ALL=(ALL) /bin/passwd [a-zA-Z0-9]* ,!/bin/passwd root

三、企业生产环境用户权限集中管理方案实例

根据角色的不同,给不同的用户分配不同的角色
​
# 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 ~]# vim /etc/sudoers
########################Cmnd_Alias By FTL ###################################
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 Aliases By FTL ###################################
 
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 By FTL ###################################
 
Runas_Alias  OP = root     -->未来切换到某个角色执行任务
 
########################Config By FTL ###################################
 


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
​
​
命令的路径要全路径
别名需要大写
超过一行,用"\"换行  
排除的命令一定在最后面写
kaifaManager 因为有ALL,所以可以直接su - 切换root,但是 sudo su -切换不了
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐