sudo 深入学习
引言 😜
sudo 作为一款权限管理工具,平常在各个平台使用。但是真正算的上正确使用的又寥寥无几。这篇文章,便是详细介绍一下这个命令的正确使用方式。
参考资料 📖
- Sudo Main Page 官网
- /etc/sudoers 配置文件
sudoers(5)
visudo(8)
visudo(8)
是 sudo
提供的用于编辑配置文件的程序。使用该命令有以下优势:
- 检测配置文件语法错误并给出错误提示
- 它使用的文本编辑器默认遵从
$EDITOR
环境变量。 - 该命令提供了一些保护机制,保证了同一时刻只有一个人可以编辑配置文件。
配置 🧰
基本配置格式如下:
Username host=command
# username : 用户
# host : 运行规则的主机
# command : 限制的命令
# command 支持多个命令,中间使用 ',' 分隔。 当一行分成多行时,使用 '\' 放在行尾。
# %group : % 开头的表示用户组
执行用户
dwsmith db1 = (_postgresql) ALL
# 用户 dwsmith 在 db1 主机上以用户 _postgresql 执行命令
别名
如果只有一个用户,一台主机,一个可以简单概括的命令集。那么一行配置就可以满足需求。如果稍稍复杂一点,可以写多行配置文件。但是当数量指数级增加时,显然成百上千行配置会显得臃肿许多。这个时候,别名将大大减少这种困恼。
- 用户别名
User_Alias DBAs = dwsmith, kkrusch
- 执行用户别名
Runas_Alias APPOWNER = _postgresql, www
- 主机别名
Host_Alias DB = db1, db2, db3
Host_Alias DMZ = 192.0.2.0/24
Host_Alias FIREWALL = 192.0.2.1, 192.0.2.2, 192.0.2.3
- 命令别名
Cmnd_Alias BACKUPS = /bin/mt, /sbin/restore, /sbin/dump
🗨️ 别名可以互相嵌套
# 别名使用
User_Alias USR_DB = dwsmith,kkrusch
Runas_Alias RAS_DB = _postgresql,www
Host_Alias H_DB = db1, db2, db3
Cmnd_Alias CMD_DB = /usr/local/bin/pg_*, /home/appowner/bin/*
USR_DB H_DB = (RAS_DB) CMD_DB
改变默认规则
默认 sudo
输错密码会以提示信息调戏用户。如果有些用户不喜欢的话,则可以使用 Defaults
关键字修改。
Defaults !insults
Defaults@caddis insults
Defaults%lasnyder insults
Defaults!/sbin/newfs,/sbin/fsck insults
Defaults<APPOWNER insults
# ! 表示取消
# @ 表示操作对象是主机
# % 表示操作对象是用户
# Defaults 后面的 ! 表示操作对象是命令
# < 表示操作对象是运行用户
执行时环境变量
由于一些操作涉及到必要的环境变量,所以该配置文件提供了关键词 env_keep
来确保一些环境变量的值。如:
Defaults env_keep += "SSH_CLIENT SSH_CONNECTION SSH_TTY SSH_AUTH_SOCK"
设置完环境变量后,需要指定该环境变量适配规则:
%wheel ALL=(ALL) SETENV: ALL
默认密码缓存时间
当输入密码后,只有一段时间内再次使用命令则不需要输入密码。而这个时间间隔则有关键字 timestamp_timeout
控制。默认以分钟为单位。
Defaults timestamp_timeout 10
指定用户文本编辑器
当使用 sudo
命令的时候,会涉及到一些配置文件的修改操作。这个时候,如果直接配置编辑命令给用户,则用户退出编辑器后会发生什么呢? 当然是拥有你这个账号的权限的一个 shell
。所以为了避免这种情况的发生。这里,我们使用关键字 sudoedit
。
sbaxter dns1=/etc/rc.d/named,/sbin/mount_nfs, \
sudoedit /etc/named.conf, /etc/rndc.key
技术上来看,使用 sudoedit
并不会直接编辑该配置文件,而是先复制一份该配置文件,权限给当前用户。当用户编辑完后,再复制替换掉原来的配置文件。默认编辑器使用环境变量 $SUDO_EDITOR, $VISUAL, or $EDITOR
指定的编辑器。
排除关键字 ⚠️
这里需要提出的一点,排除关键字根本就是鸡肋。因为排除的规则是不仅匹配执行文件,还要求路径。如果绕过的话,目录不同就可以。
日志 📑
每一条执行的 sudo
命令都被 syslogd
记录在 /var/log/secure
中。如:
Apr 30 14:16:50 treble sudo: mwlucas : TTY=ttyp8 ; PWD=/home/mwlucas ; USER=root ; COMMAND=/usr/bin/su -m