2 sudo
基础知识 #
运行某些命令需要 root 特权。但是,出于安全原因及避免出错考虑,我们不建议以 root
身份登录。更安全的做法是先以普通用户身份登录,再使用 sudo
以提升的特权来运行命令。
在 SUSE Linux Enterprise Server 上,sudo
配置为与 su
的工作方式类似。但是,sudo
提供了一种灵活机制,可让用户使用其他任何用户的特权运行命令。这样,便可为某些用户和组指派具有特定特权的角色。例如,可以允许组 users
的成员使用用户 wilber
的特权运行命令。您可以通过禁止任何命令选项,来进一步限制对命令的访问。虽然 su 始终需要 root
口令才能使用 PAM 进行身份验证,但是您可以将 sudo
配置为使用您自己的身份凭证进行身份验证。这意味着用户无需共享 root
口令,因而提高了安全性。
2.1 sudo
基本用法 #
以下章节将会介绍 sudo
的基本用法。
2.1.1 运行单个命令 #
作为普通的用户,您可以在命令前加上 sudo
来以 root
身份运行任何命令。系统会提示您提供 root 口令。如果身份验证成功,便会以 root
身份运行命令:
>
id -un
1 tux>
sudo
id -un
root's password:2 root>
id -un
tux3>
sudo
id -un
4 root
| |
在输入过程中不会显示口令,无论是明文还是屏蔽字符都不显示。 | |
只有以 | |
提升的特权会持续一段时间,因此您不必再次提供 |
使用 sudo
时,I/O 重定向不起作用:
>
sudo
echo s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission denied>
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 (<command>)
启动
SHELL
环境变量所指定的外壳或目标用户的默认外壳。如果指定了某个命令,该命令会传递到外壳(使用-c
选项)。否则,外壳将以交互模式运行。tux:~ >
sudo -s root's password:root:/home/tux #
exittux:~ >
sudo -i (<command>)
与
-s
类似,但会作为登录外壳启动外壳。这表示系统会处理该外壳的启动文件(.profile
等),并会将当前的工作目录设置为目标用户的主目录。tux:~ >
sudo -i root's password:root:~ #
exittux:~ >
默认情况下,sudo
不会传播环境变量。可以使用 env_reset
选项更改此行为(请参见有用的标志和选项)。
2.2 配置 sudo
#
sudo
提供各种可配置的选项。
如果您不小心将自己锁定在 sudo
之外,可以使用 su
-
和 root
口令来启动 root 外壳。要修复该错误,请运行 visudo
。
2.2.1 编辑配置文件 #
sudo
的主要策略配置文件为 /etc/sudoers
。如果该文件的格式错误,您可能会无法进入系统,因此强烈建议您使用 visudo
来进行编辑。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
指令会忽略以 ~
(波浪线)字符结尾或包含 .
(点)字符的文件。
有关 visudo
命令的详细信息,请运行 man 8 visudo
。
2.2.2 sudoers 基本配置语法 #
sudoers 配置文件包含两种类型的选项:字符串和标志。字符串可以包含任何值,而标志则只能在“ON”或“OFF”之间切换。sudoers 配置文件最重要的语法构造如下:
# Everything on a line after # is 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
此标志控制调用用户是需要输入目标用户(例如
root
)的口令 (ON) 还是需要输入调用用户的口令 (OFF)。Defaults targetpw # Turn targetpw flag ON
rootpw
如果设置,
sudo
将提示输入root
口令。默认值为 OFF。Defaults !rootpw # Turn rootpw flag OFF
env_reset
如果设置,
sudo
会构造一个具有TERM
、PATH
、HOME
、MAIL
、SHELL
、LOGNAME
、USER
、USERNAME
和SUDO_*
的极简环境。此外,会从调用环境导入env_keep
中列出的变量。默认值为“ON”。Defaults env_reset # Turn env_reset flag ON
env_keep
env_reset
标志设为“ON”时要保留的环境变量列表。# 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
env_reset
标志设为“OFF”时要去除的环境变量列表。# 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 规则 #
每条规则都遵循以下模式([]
标记的是可选部分):
#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:
后面运行的命令与Cmd_List
匹配,系统不会提示用户输入口令。PASSWD
为默认选项。仅当PASSWD
和NOPASSWD
位于同一行时,才需要指定此选项: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
身份运行命令。
在 sudoers
文件中指定组名时,请确保使用 NetBIOS 域名而不是领域,例如:
%DOMAIN\\GROUP_NAME ALL = (ALL) ALL
请注意,使用 winbindd 时,其格式还取决于 smb.conf
文件中的 winbind separator
选项。默认为 \
.例如,如果将其更改为 +
,则 sudoers
文件中的帐户格式必须为 DOMAIN+GROUP_NAME
。
2.3 sudo
使用案例 #
虽然默认配置适用于标准的使用方案,您仍可以根据特定需求自定义默认配置。
2.3.1 在无需提供 root
口令的情况下使用 sudo
#
根据设计,组 wheel
的成员能以 root 身份运行所有带有 sudo
的命令。下面的过程介绍如何将用户帐户添加到 wheel
组。
校验
wheel
组是否存在:>
getent group wheel
如果之前的命令未返回任何结果,请安装会创建
wheel
组的 system-group-wheel 软件包:>
sudo
zypper install system-group-wheel
将您的用户帐户添加到
wheel
组。如果您的用户帐户还不是
wheel
组的成员,请使用sudo usermod -a -G wheel USERNAME
命令添加。注销然后重新登录即可启用更改。运行groups USERNAME
命令以校验更改是否成功。使用用户帐户的普通口令进行身份验证。
使用
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
启动图形应用程序通常会导致以下错误:
>
sudo
xterm xterm: Xt error: Can't open display: %s xterm: DISPLAY is not set
一种简单的解决方法是使用 xhost 来暂时允许 root 用户访问本地用户的 X 会话。可使用以下命令完成此操作:
xhost si:localuser:root
以下命令可去除授予的访问权限:
xhost -si:localuser:root
以 root 特权运行图形应用程序存在安全隐患。建议仅在例外的情况下,才启用对图形应用程序的 root 访问权限。另外,建议在关闭图形应用程序后,立即撤消授予的 root 访问权限。
2.4 更多信息 #
sudo --help
命令提供可用命令行选项的简要概述,而 man sudoers
命令则会提供有关 sudoers
及其配置的详细信息。