sudoers的深入剖析

摘要:
1、 sudo权限1的配置。编辑sudo权限命令visudovisudo。实际的修改是/etc/sudoers文件2。/etc/sudoers配置文件[root/etc/]#cat/etc/sudors省略部分##允许root在任何地方运行任何命令rootALL=(ALL)ALL##允许成员

一、sudo权限的配置

1. 编辑 sudo权限 命令

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

2. /etc/sudoers 配置文件

[root/etc]# cat /etc/sudoers

... 省略部分内容 ...

## 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。

免责声明:文章转载自《sudoers的深入剖析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MFS+Keepalived双机高可用热备方案操作记录基于vue-cli3的vue项目移动端样式适配,lib-flexible和postcss-px2rem下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

01 . PostgreSQL简介部署

PostgreSQL简介 简介 PostgreSQL在业内通常也简称PG,是一个关系型数据库管理系统,适用于各种Linux操作系统、Windows、Solaris、BSD和Mac OS X。PostgreSQL遵循BSD许可,是一个开源软件,PostgreSQL作为全球第四大关系型数据库服务,正在以飞快的速度发展,目前已经广泛用在各个行业,PostgreS...

Redis学习笔记八:独立功能之二进制位数组

Redis 提供了 setbit、getbit、bitcount、bitop 四个命令用于处理二进制位数组。 setbit 命令用于为位数组指定偏移量上的二进制位设置值,偏移量从 0 开始计数。 getbit 命令用于获取位数组指定偏移量上的二进制位的值。 bitcount 命令用于统计位数组里面,值为 1 的二进制位的数量。 bitop 命令即可以对多个...

使用Cucumber+Rspec玩转BDD(5)——安全退出

使用Cucumber+Rspec玩转BDD(5)——安全退出 2009年3月20日 星期五 ### 温故知新 ###为了保护用户的隐私,限制特定资料的访问,前面我们给系统增加了登录功能;紧接着,又为了方便用户在一段时间之内不必重复登录操作,我们实现了用户的持久登录状态,即“记住我”功能。如果浏览器未关闭,或者用户一直处于在线状态,而用户自己并没有使...

linux虚拟机环境快速搭建redis5.x版本的主从集群总结

文/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建,但时间久了,都快忘记当时的搭建过程了,故而决定在虚拟机centOS 7的环境,自行搭建一套redis5.x版本的集群,该版本集群的搭建比较方便,不用再像以前版本那样还得再搞一个 Ruby,5.x版本可直接使用 redis-cli的方式来构建集群。 提前准备六台虚拟机: 192.168.200....

Vue3.0 全面探索 基于 Visual Studio Code 的代码片段开发插件

Vue3 Snippets for Visual Studio Code Vue3 Snippets源码 Vue3 Snippets下载 This extension adds Vue3 Code Snippets into Visual Studio Code. 这个插件基于最新的 Vue3 的 API 添加了 Code Snippets。 Snip...

Android——bootchart

bootchart:android原生自带的开机性能查看机制。通过收集android开机过程中的各种log数据,终于能够图表的形式展现各个进程在开机过程中的性能。(博客不能断…) 撰写不易,转载需注明出处:http://blog.csdn.net/jscese/article/details/45933943本文来自 【jscese】的博客。 编译boo...