Linux权限管理:sudo命令

使用su切换用户时需知晓对应用户的登陆密码,即若切换成root用户身份,需知道root用户的登陆密码。作为root用户管理员,如何授权其他普通用户,在不需要知晓root密码的情况下,执行root权限的命令操作?,此时即可使用sudo。

1.什么是sudo权限

生产环境中,root用户是团队的负责人,因为root权限过于强大。但是每天工作的普通管理员日常操作常常权限限制,像重启、备份、tar等命令。在linux中普通用户受限严重,很多简单的命令都有权限限制。

  • root用户把本来只能超级用户执行的命令赋予普通用户执行
  • sudo的操作对象是系统命令
  • 文件的权限UGO、特殊权限作用是:用户能不能操作文件

总之,sudo命令的作用是:切换到root用户去执行命令!

1.1 /etc/sudoers配置文件

  • sudo是一种权限管理机制,依赖于/etc/sudoers,其定义了
    • 授权给哪个用户
    • 可以以root身份
    • 能够执行什么管理命令
  • root用户通过使用visudo命令编辑sudo的配置文件/etc/sudoers,才可以授权其他普通用户执行sudo命令。
  • visudo命令可以提供basic sanitychecks和check for parse errors,即提供快速的正确性有效性检查,以及语法检查功能。

查看/etc/sudoers文件

[root@localhost stefan]# visudo

内容很多其中有如下几行比较重要:

授权用户模板格式

root ALL=(ALL) ALL一行就是授权用户的模板格式。

## Allow root to run any commands anywhere
root    ALL=(ALL)   ALL
#要授权的用户  需要生效的主机名或IP=(可切换的身份)  可执行的命令
  • ALL即所有都ok。所以以上语句含义是:root用户(who) 在 所有主机(where) 上可以 切换成所有用户执行所有命令(do what)。
  • 所有主机(第一个ALL)的含义是在集群场景中,以上授权在哪些主机上可以生效;单台主机用ALL就行。
  • 系统命令只能root执行。所以第二个ALL一般写成(root),即普通用户自动切换成root用户后执行系统命令。若省略默认为(root)。
  • 第三个ALL,命令写的越简单(比如写ALL),普通用户得到的权限越大,越不安全。写的越详细,包括命令的参数也写上,普通用户得到的权限越小,越安全。有些centos版本规定命令最好用绝对路径。用whereis 命令可以查到命令的绝对路径

Tips: 如果是自己的系统,又不想每次都切换root输入密码,一个命令一个命令的配置visudo很麻烦,可以改成

用户名   ALL=(ALL)   ALL

这样,直接输入命令就是普通用户,加上sudo就是超级用户。免去用su命令来回切换的麻烦。但是,生产环境一定要小心配置visudo原因见第2节。

授权组模板格式

%wheel ALL=(ALL) ALL就是授权用户的模板格式。

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

## Same thing without a password
#允许组wheel的组成员运行所有的命令,并且不需要密码
%wheel    ALL=(ALL)   NOPASSWD: ALL

%百分号不能少

1.2 查看sudo可执行的命令

$sudo -l #查看本用户可以执行的sudo命令

2. sudo命令的危险

实例1. 授权普通用户:可以重启服务器(shutdown命令)

切换到root用户,执行visudo命令,增加一行:

user1    ALL=(ALL)    /bin/shutdown -r now

此时,user1只能重启,如果写成:

user1    ALL=(ALL)    /bin/shutdown

那么user1不光可以重启-r,还可以关机和其他任何选项。

实例2. 授权普通用户:可以添加其他用户(useradd命令)可以修改其他用户密码(passwd 用户名)

user1 ALL=/usr/sbin/useradd    #(ALL)缺省默认为(root),即切换成root用户

user1 ALL=/usr/bin/passwd    #授予普通用户以root用户身份修改其他所有用户登录密码

安全漏洞:第二个passwd含义是普通用户切换到root用户,然后执行passwd修改密码,因此,普通用户也可以修改root用户的密码了:

$sudo passwd root    #可以修改root用户的密码

第二行passwd授权应该这么写:

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

其中

  • /usr/bin/passwd [A-Za-z]*代表passwd的用户名一定要包含字母,[A-Za-z]是正则表达式,表示重复
  • !/usr/bin/passwd ""代表不允许passwd不加用户名执行。因为执行$sudo passwd时已经是root用户,不加用户名回车表示修改本用户的密码,即root用户的密码。!代表取反,不允许命令
  • !/usr/bin/passwd root不允许修改root用户密码
  • 以上三段代码中间有空格,顺序不能变

实例3 【危险】让普通用户sudo执行vi命令!

user1 ALL=/bin/vi

危险:普通用户在执行sudo vi 命令的时,会切换到root用户,因此普通用户可以修改任意系统文件了。比如/etc/shadow是保存密码的文件,权限是000,普通用户无权限查看和编辑

----------.  1 root root 1283 6月  15 21:32 shadow

但如果让普通用户可以sudo执行vi命令,那么就可以查看和修改所有密码了

sudo vi /etc/shadow

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器