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 -un
1 tuxtux >
sudo id -un
root's password:2 roottux >
id -un
tux3tux >
sudo id -un
4 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 set
YaST 会选择 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
。