Sudo manual

引言

sudo 作为一款权限管理工具,平常在各个平台使用。但是真正算的上正确使用的又寥寥无几。这篇文章,便是详细介绍一下这个命令的正确使用方式。

参考资料 :book:

visudo(8)

visudo(8)sudo 提供的用于编辑配置文件的程序。使用该命令有以下优势:

  • 检测配置文件语法错误并给出错误提示

error options

  • 它使用的文本编辑器默认遵从 $EDITOR 环境变量。
  • 该命令提供了一些保护机制,保证了同一时刻只有一个人可以编辑配置文件。

配置 :toolbox:

基本配置格式如下:

Username host=command

# username : 用户
# host : 运行规则的主机
# command : 限制的命令
# command 支持多个命令,中间使用 ',' 分隔。 当一行分成多行时,使用 '\' 放在行尾。
# %group : % 开头的表示用户组
执行用户
dwsmith db1 = (_postgresql) ALL

# 用户 dwsmith 在 db1 主机上以用户 _postgresql 执行命令
别名

如果只有一个用户,一台主机,一个可以简单概括的命令集。那么一行配置就可以满足需求。如果稍稍复杂一点,可以写多行配置文件。但是当数量指数级增加时,显然成百上千行配置会显得臃肿许多。这个时候,别名将大大减少这种困恼。

1.用户别名

User_Alias DBAs = dwsmith, kkrusch

2.执行用户别名

Runas_Alias APPOWNER = _postgresql, www

3.主机别名

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

4.命令别名

Cmnd_Alias BACKUPS = /bin/mt, /sbin/restore, /sbin/dump

:left_speech_bubble: 别名可以互相嵌套

# 别名使用
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 指定的编辑器。

排除关键字 :warning:

这里需要提出的一点,排除关键字根本就是鸡肋。因为排除的规则是不仅匹配执行文件,还要求路径。如果绕过的话,目录不同就可以。

日志 :bookmark_tabs:

每一条执行的 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