Linux sudo权限赋予机制解析及应用

  在Linux使用过程中,我们或多或少都接触过sudo命令,内核更新、软件安装、用户管理、系统配置……在为了安全而不使用root登录的Linux系统中,我们进行的大多数配置操作都需要用到sudo命令。但是,在给每一条“权限不足”或是“找不到命令”(在sbin下)的命令前加上一个sudo的时候,我们是否想过,其中的权限赋予机制是怎样的?又为什么我们新添加的用户在没有配置前不能使用sudo命令?本篇文章就来探索一下sudo的原理并能将其应用在服务器管理中。


1.sudo的应用目的以及功能

目的

  Linux系统中,许多与系统配置有关的命令都被设为只能由root执行,保证了系统配置层面的安全性。但大型服务器的实际使用过程中,root并不能独自完成所有的配置维护工作,比如增加新用户、重启等等。这就需要root将原本只能由他执行的命令授权给特定的管理用户执行,于是就出现了sudo命令以及对应的root配置命令visudo

功能

  sudo命令加在命令行最前。当用户拥有root赋予的对应sudo权限后,就能通过sudo执行原本只能由root执行的命令,执行过程中拥有root权限


2.sudo权限赋予机制

  sudo命令的授权配置记录在/etc/sudoers文件和/etc/sudoers.d目录中(目录中以文件形式记录权限赋予,格式同sudoers,下不讨论)。root通过visudo命令配置对用户的授权命令(也可以对组赋予),配置立即生效。用户可以通过sudo -l命令查看自己获得的sudo权限,取得授权后使用sudo + <command>命令执行。


3.sudo权限赋予完整过程实现

visudo

首先切换到root用户,执行命令visudo

这时部分可能会默认使用nano文本编辑器打开文件,如果还是习惯用vim,可以用

sudo update-alternatives --config editor

命令切换输入法,跳出选择框

zheng@Kali:~$ sudo update-alternatives --config editor 
有 3 个候选项可用于替换 editor (提供 /usr/bin/editor)。

  选择       路径              优先级  状态
------------------------------------------------------------
  0            /bin/nano            40        自动模式
  1            /bin/nano            40        手动模式
* 2            /usr/bin/vim.basic   30        手动模式
  3            /usr/bin/vim.tiny    15        手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:

选2(vim.basic)Enter 即可

sudoers文件格式

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# User privilege specification

root    ALL=(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

已经删除部分注释,上面的内容由注释行分隔为四部分(实际没有顺序)

  1. 默认设置:主要设置secure_path安全路径,一般为命令存放路径,如果有其他路径可以增加
  2. 用户权限设置,格式如下:
root    ALL=(ALL:ALL) ALL
<授予用户名> <受管理的IP地址/网段>=(<转化目标身份用户>:<转化目标身份组>) <命令>

注意:受管理的IP地址不是远程访问的客户端地址,而是授权给用户管理的主机IP地址

该参数一般在服务器作为域控制管理器时需要另外设置,一般写ALL即可

括号内两个参数可以空缺,默认为ALL

命令后也可加参数,具体见注意事项

  1. 组权限设置:类似于用户权限设置,只需要在组名前增加%即可(样例中的%sudo,其中sudo是组名)
  2. sudo权限配置文件存放路径设置,也可设置多个权限配置文件目录,格式同样例

sudo查看权限及使用

用户使用visudo命令查看自己拥有的权限

zheng@Kali:~$ sudo -l
匹配 %2$s 上 %1$s 的默认条目:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

用户 zheng 可以在 Kali 上运行以下命令:
    (ALL : ALL) ALL
    
test@Kali:/home/zheng$ sudo -l
[sudo] test 的密码:
对不起,用户 test 不能在 Kali 上运行 sudo。

第一次查看需要输入密码以确认身份

上部分是default设置,下部分是授予的权限

使用时只要在命令行前加sudo 即可


4.注意事项

  • 为了安全,sudoers文件一般建议使用visudo命令打开(拥有查错警告等保护措施),而不是直接用vim编辑
  • 权限赋予时对于特定命令若不加参数,则认为被赋权用户拥有添加所有参数的权限,若对命令指定参数,则只能执行只带该参数的命令。例如:
test    ALL=(ALL:ALL) shutdown #该授权允许test用户执行带任何参数的shutdown命令
test    ALL=(ALL:ALL) shutdown -r now #该授权仅允许test用户执行立即重启命令
test	ALL=(ALL:ALL) ALL #该授权允许test用户执行任何命令

所以如果命令简略。则授权较大;命令详细,则授权较小

  • 在第一次开机配置第一位非root用户时,系统将该用户加入进名为sudo的附加组,而在sudoers配置文件中,初始就有对组sudo的授权
#Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL

所以初始配置的用户拥有执行任何命令的sudo权限,而新加入的用户未配置前没有任何sudo权限