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的工作过程如下:
- 当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
- 确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认
- 若密码输入成功,则开始执行sudo后续的命令
- root执行sudo时不需要输入密码(eudoers文件中有配置root ALL=(ALL) ALL这样一条规则)
- 若欲切换的身份与执行者的身份相同,也不需要输入密码
配置文件简介
在终端中通过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
。默认内容如下:
#
# 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提权的问题,如果理解了文章我想应该也差不多了知道其能提权的原因了。