Linux sudoers文件


前言

参考链接:

  • https://blog.csdn.net/a19881029/article/details/18730671

  • 测试系统:Ubuntu 18.04

在实际的Linux 生产环境中,由于root 用户具有很高的权限,为防止误操作,我们一般使用普通用户权限操作系统。当需要使用root 权限时,可以切换至 root 用户,或使用 sudo 命令向 root 用户申请一部分权限用来执行命令。由于Linux 系统是多用户系统,如果使用su 命令进行身份切换,就需要先告知每个用户root 用户的密码,这必然会造成一些安全隐患,比如部分使用者为了图方便,所有的操作均使用root 权限进行操作,这样就失去了权限控制的意义。所以我们一般都是使用sudo 命令向root 用户申请一部分权限,而能申请哪些权限,就是根据其配置文件sudoers文件来鉴别的。

sudo的工作过程如下:

  1. 当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
  2. 确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
  3. 若密码输入成功,则开始执行sudo后续的命令
  4. root执行sudo时不需要输入密码(eudoers文件中有配置root ALL=(ALL) ALL这样一条规则)
  5. 若欲切换的身份与执行者的身份相同,也不需要输入密码

配置文件简介

在终端中通过man sudo命令查看该命令的描述,在DESCRIPTION描述中第一段原文如下:

sudo allows a permitted user to execute a command as the superuser or another user, as specified
by the security policy. The invoking user's real (not effective) user-ID is used to determine
the user name with which to query the security policy.

根据安全策略说明,sudo命令可以让有授权的用户以超级用户或其他用户的身份执行命令。祈求权限用户的有效(无效)的UID 用于确定查询安全策略的用户名。

即,一个普通的用户,在自己权限不够的情况下,通过sudo命令向root用户或者是其他用户获取相对的权限,从而实现自己整条命令的执行。但是,当普通用户向其他用户获取它的权限的时候,其他用户怎样去判断是否给这个用户权限。其权限分配的方式体现在给予权限者的/etc/sudoers文件中。

查看该文件权限,该文件权限为440。默认内容如下:

a

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root	ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d

注释第一段,他说在root权限下,使用 visudo 命令编辑该文件。我查了一下,这个visudo是专用编辑/etc/sudoers文件的工具,此工具的好处是在添加规则有误时,保存退出会提示错误信息。如果没有 visudo 命令,需要apt-get install sudo

别名类型及放权格式

/etc/sudoers文件中的书写格式包括“别名类型”以及“放权格式”。

别名类型包括如下四种:

  • Host_Alias:定义主机别名
  • User_Alias:用户别名,别名成员可以是用户或者用户组(前面加%号)
  • Runas_Alias:用来定义runas别名,这个别名指的是“目的用户”,即sudo允许切换至的用户
  • Cmnd_Alias:定义命令别名

有两点需要注意:

  • 配置文件中的Defaults env_reset表示去除用户自定义的环境变量,就是说当你用sudo执行一个命令的时候,你当前用户设置的所有环境变量都是无效的。
  • 在每一中Alias后面定义的别名 NAME 可以包含大写字母、下划线和数字,但必须以一个大写字母开头

放权格式:

授权用户/组 主机名=(允许转换至的用户) NOPASSWD:命令动作
红色标注的三要素缺一不可,但在动作之前,也能够指定转换到特权用户下,在这里指定转换的用户用 () 号括起来。
如果无需密码直接运行命令,应该加 NOPASSWD:参数,不需要时可以省略。

实战配置

User_Alias SYSADER=kx,%test
Runas_Alias OP=root
Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod/,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/usr/bin/id,/sbin/fdisk

SYSADER ALL=(OP) SYDCMD # 如果没有指定(OP),即没有指定允许转换的用户,那么普通执行sudo转换的目标也是root(个人总结)
SYSADER ALL=(OP) NOPASSWD:SYDCMD # 这是无需密码的写法,这个密码是SYSADER下用户的密码,如果是多个参数,则每个参数前都要加 NOPASSWD

第一行:定义用户别名SYSADER,其下有一个成员用户kx和一个用户组test
第二行:定义Runas用户,也就是目标用户的别名为OP,下有成员root
第三行:定义SYDCMD命令别名,成员之间用,号隔开,后面的!/usr/bin/passwd root表示不能使用passwd命令修改root密码
第四行:表示授权SYSADER下的任何成员,在任何可能存在的主机名的主机下运行SYDCMD下定义的命令。即:kx和test用户组下的成员能以root身份运行chown、chmod、passwd,但不能更改root密码,也可以以root身份运行fdisk。

注:在实验的时候记得把%sudo ALL=(ALL:ALL) ALL注释掉,因为你所使用的普通用户可能在sudo组中。使用groups [用户名]查看该用户所属的组。

配置完毕后,如果想知道哪些命令是当前用户可以执行或禁止的,可通过切换至该用户身份,然后通过sudo -l来查看。

kx@kx-virtual-machine:~/Desktop$ sudo -l
Matching Defaults entries for kx on kx-virtual-machine:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User kx may run the following commands on kx-virtual-machine:
    (root) NOPASSWD: /bin/chown, /bin/chmod/, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root, /usr/bin/id, /sbin/fdisk

总结

Linux关于用户权限的问题还是有些复杂的,需要多理解。

学习这一部分内容是为了研究sudoers配置不当导致Linux提权的问题,如果理解了文章我想应该也差不多了知道其能提权的原因了。