2 sudo #
许多命令和系统实用程序都需要以 root 身份运行才能修改文件和/或执行只有超级用户方能执行的任务。为了确保安全和避免发生意外运行危险命令的情况,通常建议不要直接以 root 身份登录。建议的做法是以非特权的普通用户身份工作,并使用 sudo 命令来运行需要较高特权的命令。
在 SUSE Linux Enterprise Server 上,sudo 默认配置为与 su 的工作方式类似。但是,sudo 可让用户以高度可配置的方式使用任何其他用户的特权来运行命令。这样,便可为某些用户和组指派具有特定特权的角色。举例来说,可以允许组 users 的成员使用 wilber 的特权运行命令。例如,通过禁止指定任何命令选项,可以进一步限制对命令的权限。虽然 su 始终需要 root 口令才能使用 PAM 进行身份验证,但是您可以将 sudo 配置为使用您自己的身份凭证进行身份验证。这样就不需要共享 root 口令,从而提高了安全性。例如,您可以允许 users 组的成员以 wilber 身份运行 frobnicate 命令,但限制其不能指定自变量。这样,便可为某些用户和组指派具有特定能力的角色。
2.1 sudo 基本用法 #
虽然 sudo 简单易用,功能却十分强大。
2.1.1 运行单个命令 #
以普通用户身份登录后,您可以在命令前加上 sudo 以 root 身份运行任何命令。按照提示输入 root 口令后,如果身份验证成功,您便能以 root 身份运行命令:
tux >id -un1 tuxtux >sudo id -unroot's password:2 roottux >id -untux3tux >sudo id -un4 root
| |
在输入过程中不会显示口令,无论是明文还是密文均不显示。 | |
只有以 | |
在限定时间内,您无需再次输入 |
I/O 重定向的工作方式与您预期的可能不同:
tux >sudo echo s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission deniedtux >sudo cat < /proc/1/maps bash: /proc/1/maps: Permission denied
只有 echo/cat 二进制会使用较高特权运行,重定向则由用户外壳使用用户特权执行。您可以按第 2.1.2 节 “启动外壳”中所述启动外壳,也可以使用 dd 实用程序来启动:
echo s | sudo dd of=/proc/sysrq-trigger sudo dd if=/proc/1/maps | cat
2.1.2 启动外壳 #
必须在每条命令前加上 sudo 可能很繁琐。虽然可以将外壳指定为命令 sudo bash,但还是建议您使用以下其中一种内置机制来启动外壳:
sudo -s (<命令>)启动
SHELL环境变量所指定的外壳或目标用户的默认外壳。如果给定了命令,则会将该命令传递给外壳(使用-c选项),否则外壳会以交互模式运行。tux:~ >sudo -i root's password:root:/home/tux #exittux:~ >sudo -i (<命令>)与
-s类似,但是会将外壳启动为登录外壳。也就是说,系统会对外壳的启动文件(.profile等)进行处理,并会将当前的工作目录设置为目标用户的主目录。tux:~ >sudo -i root's password:root:~ #exittux:~ >
2.1.3 环境变量 #
默认情况下,sudo 不会传播环境变量:
tux >ENVVAR=test env | grep ENVVAR ENVVAR=testtux >ENVVAR=test sudo env | grep ENVVAR root's password: 1tux >
输出为空即表明在使用 |
此行为可通过 env_reset 选项进行更改,请参见表 2.1 “有用的标志和选项”。
2.2 配置 sudo #
sudo 是一个非常灵活的工具,提供各种配置选项。
如果您不小心将自己锁定在 sudo 之外,则可以使用 su - 及 root 口令来获取 root 外壳。要修复该错误,请运行 visudo。
2.2.1 编辑配置文件 #
sudo 的主要策略配置文件为 /etc/sudoers。如果此文件中存在错误,您可能便会无法进入系统,因此强烈建议您使用 visudo 来编辑配置文件。此举可防止同时更改打开的文件,并会在保存修改之前检查语法错误。
您还可以通过设置 EDITOR 环境变量来使用除 vi 以外的编辑器(不论名字如何),例如:
sudo EDITOR=/usr/bin/nano visudo
不过,/etc/sudoers 文件本身是由系统包提供的,更新时这些修改可能会取消。因此,建议您将自定义配置放到 /etc/sudoers.d/ 目录下的文件中。该目录下的任何文件都会自动纳入系统中。要在该子目录下创建或编辑文件,请运行:
sudo visudo -f /etc/sudoers.d/NAME
或者,使用其他编辑器(例如 nano):
sudo EDITOR=/usr/bin/nano visudo -f /etc/sudoers.d/NAME
/etc/sudoers.d 中忽略的文件
/etc/sudoers 中的 #includedir 命令(用于 /etc/sudoers.d)会忽略以 ~(波浪号)结尾或包含 .(点)的文件。
关于 visudo 命令的详细信息,请运行 man 8 visudo。
2.2.2 sudoers 基本配置语法 #
在 sudoers 配置文件中,有两种类型的选项:字符串和标志。字符串可以包含任何值,而标志则只能在“ON”或“OFF”之间切换。sudoers 配置文件最重要的语法构造为:
# Everything on a line after a # gets ignored 1 Defaults !insults # Disable the insults flag 2 Defaults env_keep += "DISPLAY HOME" # Add DISPLAY and HOME to env_keep tux ALL = NOPASSWD: /usr/bin/frobnicate, PASSWD: /usr/bin/journalctl 3
| |
去除 | |
|
选项名称 |
说明 |
示例 |
|---|---|---|
targetpw
|
此标志控制调用用户是需要输入目标用户(例如 |
Defaults targetpw # Turn targetpw flag ON |
rootpw
|
如果设置了该选项, |
Defaults !rootpw # Turn rootpw flag OFF |
env_reset
|
如果设置了该选项, |
Defaults env_reset # Turn env_reset flag ON |
env_keep
|
|
# Set env_keep to contain EDITOR and PROMPT Defaults env_keep = "EDITOR PROMPT" Defaults env_keep += "JRE_HOME" # Add JRE_HOME Defaults env_keep -= "JRE_HOME" # Remove JRE_HOME |
env_delete
|
|
# Set env_delete to contain EDITOR and PROMPT Defaults env_delete = "EDITOR PROMPT" Defaults env_delete += "JRE_HOME" # Add JRE_HOME Defaults env_delete -= "JRE_HOME" # Remove JRE_HOME |
还可以使用 Defaults 令牌为用户、主机和命令集合创建别名。并且,可以仅将选项应用到特定用户集。
关于 /etc/sudoers 配置文件的详细信息,请参见 man 5 sudoers。
2.2.3 sudoers 中的规则 #
sudoers 配置中的规则可能会非常复杂,因此本节仅涉及基本内容。每个规则都遵循基本模式([] 标记的是可选部分):
#Who Where As whom Tag What User_List Host_List = [(User_List)] [NOPASSWD:|PASSWD:] Cmnd_List
User_List一个或多个(用
,分隔)标识符:用户名、格式为%GROUPNAME的组或格式为#UID的用户 ID。可以使用!前缀来取反。Host_List一个或多个(用
,分隔)标识符:(完全限定的)主机名或 IP 地址。可以使用!前缀来取反。Host_List的惯常选项为ALL。NOPASSWD:|PASSWD:如果用户在
NOPASSWD:后面运行的命令与CMDSPEC匹配,系统不会提示用户输入口令。PASSWD为默认选项,仅当两个选项位于同一行时才需要指定它:tux ALL = PASSWD: /usr/bin/foo, NOPASSWD: /usr/bin/bar
Cmnd_List一个或多个(用
,分隔)区分符:可执行文件的路径,后跟允许使用的自变量或什么也不跟。/usr/bin/foo # Anything allowed /usr/bin/foo bar # Only "/usr/bin/foo bar" allowed /usr/bin/foo "" # No arguments allowed
ALL 可以用作 User_List、Host_List 和 Cmnd_List。
允许 tux 在无需输入口令的情况下以 root 身份运行所有命令的规则:
tux ALL = NOPASSWD: ALL
允许 tux 运行 systemctl restart apache2 的规则:
tux ALL = /usr/bin/systemctl restart apache2
允许 tux 在不带自变量的情况下以 admin 身份运行 wall 的规则:
tux ALL = (admin) /usr/bin/wall ""
以下类型的构造
ALL ALL = ALL
在没有 Defaults targetpw 的情况下切勿使用,否则任何人都能以 root 身份运行命令。
2.3 常见使用情况 #
尽管默认配置对于简单的设置和桌面环境通常已经够用,但是自定义配置非常有用。
2.3.1 在无需 root 口令的情况下使用 sudo #
在具有特殊限制(“用户 X 只能以 root” 身份运行命令 Y)的情况下,无法实现此目的。在其他情况下,还是建议进行某种分隔。按照惯例,组 wheel 的成员能以 root 身份运行所有带有 sudo 的命令。
将自己添加到
wheel组如果您自己的用户帐户尚不是
wheel组的成员,请添加该帐户,具体做法是运行sudo usermod -a -G wheel 用户名然后注销并再次登录。运行groups 用户名以确认更改是否成功。将使用调用用户的口令进行身份验证的选项设为默认设置。
使用
visudo创建文件/etc/sudoers.d/userpw(请参见第 2.2.1 节 “编辑配置文件”)并添加:Defaults !targetpw
选择新默认规则。
根据是否想要用户重新输入口令,取消对
/etc/sudoers中特定行的注释,并将默认规则注释掉。## Uncomment to allow members of group wheel to execute any command # %wheel ALL=(ALL) ALL ## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL
提高默认规则的限制性
将
/etc/sudoers中允许一切操作的规则注释掉或去除:ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!
警告:sudoers 中的危险规则切勿漏掉这一步,否则任何用户都能以
root身份执行任何命令。测试配置
尝试以
wheel的成员和非成员身份运行sudo。tux:~ >groups users wheeltux:~ >sudo id -un tux's password: rootwilber:~ >groups userswilber:~ >sudo id -un wilber is not in the sudoers file. This incident will be reported.
2.3.2 对 X.Org 应用程序使用 sudo #
在使用 sudo 启动图形应用程序时,可能会出现以下错误:
tux > sudo xterm
xterm: Xt error: Can't open display: %s
xterm: DISPLAY is not setYaST 会选择 ncurses 界面而非图形界面。
要在通过 sudo 启动的应用程序中使用 X.Org,需要传播环境变量 DISPLAY 和 XAUTHORITY。要进行此项配置,请创建文件 /etc/sudoers.d/xorg(请参见第 2.2.1 节 “编辑配置文件”)并添加下面一行:
Defaults env_keep += "DISPLAY XAUTHORITY"
如尚未设置 XAUTHORITY 变量,请按如下方式设置:
export XAUTHORITY=~/.Xauthority
现在,X.Org 应用程序便可正常运行:
sudo yast2
2.4 更多信息 #
使用 sudo --help 可检索有关可用命令行开关的简要概述。如需说明和其他重要信息,请参见手册页:man 8 sudo,配置相关信息详见 man 5 sudoers。