Linux用户权限——sudoers的深入剖析

一、sudo权限的配置

        root账号登录系统不会记录root账号做了什么操作。

        su虽然不记录以root执行了哪些命令,但会创建一条日志记录谁在什么时候变成了root。而su切换为root身份,仍然有很大的无法受控的权限,因此sudo是一个更好的选择。

        sudo命令的意思是以其他用户身份执行命令,用户是否拥有sudo权限?拥有哪些权限?sudo执行时是否需要输入密码?这些都是通过/etc/sudoers文件进行配置和控制的。普通用户我们可以通过su命令切换到其他用户,但是需要知道其他用户的密码,如果是需要执行管理员命令则需要知道root密码。但是如果普通用户拥有sudo权限则可以只需要输入自己密码或者不输入密码完成管理员命令的执行。既保证了超级管理员的密码的安全性,又满足了普通用户执行特殊命令的需求,这就是/etc/sudoers文件的作用。

1. 编辑 sudo权限 命令

visudo
visudo 命令实际修改的是  /etc/sudoers 文件

2. /etc/sudoers 配置文件说明

[root/etc]# cat /etc/sudoers

[root@s142 etc]# cat /etc/sudoers
## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.
##该文件允许特定用户像root用户一样使用各种各样的命令,而不需要root用户的密码 
##
## Examples are provided at the bottom of the file for collections
## of related commands, which can then be delegated out to particular
## users or groups.
## 在文件的底部提供了很多相关命令的示例以供选择,这些示例都可以被特定用户或  
## ## 用户组所使用  
## This file must be edited with the 'visudo' command.
## 该文件必须使用"visudo"命令编辑
## Host Aliases
#主机别名
## Groups of machines. You may prefer to use hostnames (perhap using 
## wildcards for entire domains) or IP addresses instead.
## 对于一组服务器,你可能会更喜欢使用主机名(可能是全域名的通配符)
## 或IP地址代替,这时可以配置主机别名
 
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2
## User Aliases
#用户别名
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname 
## rather than USERALIAS
## 这并不很常用,因为你可以通过使用组来代替一组用户的别名  
# User_Alias ADMINS = jsmith, mikem
 
## Command Aliases
## These are groups of related commands...
## 指定一系列相互关联的命令(当然可以是一个)的别名,通过赋予该别名sudo权限,  
## 可以通过sudo调用所有别名包含的命令,下面是一些示例
 
## Networking
#网络操作相关命令别名  
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient,
 /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, 
 /sbin/mii-tool
## Installation and management of software
#软件安装管理相关命令别名  
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
## Services
#服务相关命令别名 
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
## Updating the locate database
#本地数据库升级命令别名  
Cmnd_Alias LOCATE = /usr/sbin/updatedb
## Storage
#磁盘操作相关命令别名
Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
## Delegating permissions
#代理权限相关命令别名 
Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
## Processes
#进程相关命令别名
Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
## Drivers
#驱动命令别名
Cmnd_Alias DRIVERS = /sbin/modprobe
...
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## 下面是规则配置:什么用户在哪台服务器上可以执行哪些命令(sudoers文件可以在多个系统上共享)
## Syntax:
##语法
##      user    MACHINE=COMMANDS
##  用户 登录的主机=(可以变换的身份) 可以执行的命令  
##

## Allow root to run any commands anywhere
## 允许root在任何地方运行任何命令
root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software, service management apps and more.
## 允许“sys”用户组的成员运行 网络、软件、服务管理应用等命令。
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
## 允许“wheel”用户组的成员运行所有命令
%wheel  ALL=(ALL)       ALL

## Allows people in group wheel to run all commands without a password
## 允许“wheel”用户组的成员运行所有命令,且运行时不需要输入密码
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## Allows members of the users group to mount and unmount the cdrom as root
## 允许“users”组的成员运行 挂载、卸载光盘的命令
# %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

## Allows members of the users group to shutdown this system
## 允许“users”组的成员在本机运行 /sbin/shutdown -h now 命令
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
## 读取 /etc/sudoers.d 目录下所有文件的内容作为配嵌入到此配置文件
## 注意,下面的 # 后面并不是注释
#includedir /etc/sudoers.d

为用户配置sudo权限

[用户名]    [被管理主机的IP]=([可以使用的身份])   [NOPASSWD: ][授权的命令]
[被管理主机的IP][可以使用的身份][授权的命令] 都可以使用  ALL 来表示不限制。
添加  [NOPASSWD: ] 选项可以使用户在使用sudo权限时不需要输入密码。
[授权的命令]要使用绝对路径,多条命令之间可用逗号( ,)分隔。
  • 例:
## Allow root to run any commands anywhere
## 允许root在任何地方运行任何命令
root    ALL=(ALL)       ALL

为用户组配置sudo权限

%[组名]    [被管理主机的IP]=([可以使用的身份])   [NOPASSWD: ][授权的命令]
[被管理主机的IP][可以使用的身份][授权的命令] 都可以使用  ALL 来表示不限制。
添加  [NOPASSWD: ] 选项可以使用户在使用sudo权限时不需要输入密码。
用户组 与 用户 的唯一区别是用户组前有个  %
  • 例:
## 允许“wheel”用户组的成员运行所有命令,且运行时不需要输入密码
%wheel        ALL=(ALL)       NOPASSWD: ALL

3. 注意事项

1) 赋予用户sudo权限时一定要谨慎,够用即可,不要赋予过高的权限

2) [授权的命令] 设置得越具体,用户获得的权限越小。

3) 严禁赋予普通用户 /usr/bin/passwd/usr/bin/vi/usr/bin/su/usr/bin/bash 命令的权限,拥此权限的用户可以修改root用户密码,然后为所欲为。

4) 权力越大,责任越大。

二、sudo 命令介绍

1. sudo [命令]:以 root 身份来执行命令

用户必须有相应命令的sudo权限

例子

  • 普通用户使用 less 命令查看 root 用户的历史命令
[vagrant~]$ sudo less /root/.bash_history
cat report.md | grep -v ID | awk '$4 >= 99 {print $2}'
cat report.md | grep -v ID | awk '$4 <= 99 {print $2}'
cat report.md | grep -v ID | awk '$4 == 100 {print $2}'
sed -n '2p' report.md
sed -n '2,4p' report.md
sed '2,4d' report.md
cat -n report.md
sed '1a Begin' report.md
sed '1i Begin' report.md
sed '1a Begin' report.md
sed '1a End' report.md
sed '1c Hello World' report.md
sed '5c Hello World' report.md
... 省略 ...

2. sudo su:切换到root用户

用户必须有 /usr/bin/su命令的sudo权限
一旦切换成功,用户可以以root身份执行任何命令

例子

  • 普通用户使用 sudo su 命令切换到 root 用户,然后修改root用户的密码
[vagrant/tmp]$ sudo su

[root/tmp]# passwd
更改用户 root 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

3. sudo -s <shell>:切换到root用户的shell

可以不加  <shell>,会使用默认 shell
用户必须有相应shell命令的sudo权限,例如  /usr/bin/bash
一旦切换成功,用户可以以root身份执行任何命令

例子

  • 普通用户使用 sudo -s /usr/bin/bash 命令切换到 root 的shell,然后修改root用户的密码
[vagrant/tmp]$ sudo -s /usr/bin/bash

[root/tmp]# passwd
更改用户 root 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
  • 可以不加 <shell>,会使用默认 shell
[vagrant/tmp]$ sudo -s

[root/tmp]# exit

4. sudo -l:列出目前用户可用的sudo权限的指令

例子

[vagrant~]$ sudo -l
...省略部分内容...
用户 vagrant 可以在本机上运行以下命令:
    (ALL) /usr/bin/bash, /usr/bin/su, /usr/bin/less

三、sudo权限的应用

1. 授权普通用户可以重启服务器

  • 执行 visudo,然后添加如下内容
user1 ALL=(ALL) /sbin/shutdown -r now
  • 切换到user1账号,查看user1可用的sudo权限的指令
[user1@10 ~]$ sudo -l
...省略部分内容...
用户 user1 可以在 10 上运行以下命令:
    (ALL) /sbin/shutdown -r now

2. 授权普通用户可以添加其他用户

功能分析

要想添加其他用户,必须拥有添加用户和设置密码的权限,即 /usr/sbin/useradd 和 /usr/bin/passwd 两个命令的sudo权限

若用户完全拥有 /usr/bin/passwd 的sudo权限,则可以通过 sudo passwd 命令或者 sudo passwd root 命令修改 root 密码,这样就会变得非常不安全。

因此,需要严格限制用户对 /usr/bin/passwd 的权限:

user ALL=(ALL) /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root

/usr/bin/passwd [A-Za-z]* 表示 passwd 命令后附加的第一个字符只能是大小写字母。 
!/usr/bin/passwd "" 表示 passwd 命令后不能什么都不加。 
!/usr/bin/passwd root 表示 passwd 命令后不能加 root。

三条语句的缺一不可,且顺序不能颠倒。

实例

  • 执行 visudo,然后添加如下内容
user1   ALL=(ALL)    /usr/sbin/useradd
user1   ALL=(ALL)    /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
  • 切换到user1账号,查看user1可用的sudo权限的指令
[user1@10 ~]$ sudo -l
...省略部分内容...
用户 user1 可以在 10 上运行以下命令:
    (ALL) /usr/sbin/useradd
    (ALL) /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root
  • 添加用户user2,并为其设置密码
[user1@10 ~]$ sudo useradd user2

[user1@10 ~]$ sudo passwd user2
更改用户 user2 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

[user1@10 ~]$ grep user2 /etc/passwd
user2:x:1006:1007::/home/user2:/bin/bash
  • 尝试以 passwd 和 passwd root 两种方式修改 root 用户的密码,全部失败
[user1@10 ~]$ sudo passwd
对不起,用户 user1 无权以 root 的身份在 10.0.2.15 上执行 /bin/passwd。

[user1@10 ~]$ sudo passwd root
对不起,用户 user1 无权以 root 的身份在 10.0.2.15 上执行 /bin/passwd root。
  • 添加用户2_user,尝试为其设置密码,失败。因为 /usr/bin/passwd [A-Za-z]* 决定 passwd 命令后附加的第一个字符只能是大小写字母。
[user1@10 ~]$ sudo useradd 2_user

[user1@10 ~]$ sudo passwd 2_user
对不起,用户 user1 无权以 root 的身份在 10.0.2.15 上执行 /bin/passwd 2_user。

四、visudo命令简介

1、使用语法
用法:
#visudo [-chqsV] [-f sudoers]

2、参数说明
参数    参数说明
-c, --check    检查sudoers配置文件
-f, --file=sudoers    修改sudoers配置文件
-h, --help    获取命令帮助
-q, --quiet    静默输出
-s, --strict    严格语法检查
-V, --version    查看命令版本
四、visudo命令使用示例
1、查看命令版本
[root@s142 ~]# visudo -V
visudo version 1.8.23
visudo grammar version 46

2、获取命令帮助
[root@s142 ~]# visudo -h
visudo - safely edit the sudoers file

3、检查sudoers文件
[root@s142 ~]# visudo -c
/etc/sudoers: parsed OK

4、修改sudoers文件
[root@s142 ~]# cd /etc/
[root@s142 etc]# visudo -f sudoers

## Sudoers allows particular users to run various commands as
## the root user, without needing the root password.

5、严格执行语法检查编辑
  实际上我们可以直接编辑/etc/sudoers文件,直接编辑不会进行语法检查。使用visudo -s可以执行sudoers文件的编辑,编辑国产中实际编辑的是/etc/sudoers.tmp文件,编辑完成后必须wr保存后才会存入sudoers文件。保存前会进行语法检查,如果语法检查失败,会进程错误提示,告知是哪一行有语法错误。如果强制保存会有危险。这就是visudo方式编辑sudo文件的好处。

[root@s142 etc]# visudo -s

在这里插入图片描述

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤思而敏学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值