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 -un1 tux>sudoid -unroot's password:2 root>id -untux3>sudoid -un4 root
| |
在输入过程中不会显示口令,无论是明文还是屏蔽字符都不显示。 | |
只有以 | |
提升的特权会持续一段时间,因此您不必再次提供 |
使用 sudo 时,I/O 重定向不起作用:
>sudoecho s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission denied>sudocat < /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 -s root's password:root:/home/tux #exittux:~ >sudo -i (<命令>)与
-s类似,但会作为登录外壳启动外壳。这表示系统会处理该外壳的启动文件(.profile等),并会将当前的工作目录设置为目标用户的主目录。tux:~ >sudo -i root's password:root:~ #exittux:~ >
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 ""
不要使用不带 Defaults targetpw 的 ALL ALL = ALL 之类规则。否则,任何人都能够以 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组。如果您的用户帐户还不是
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 启动图形应用程序通常会导致以下错误:
>sudoxterm 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 及其配置的详细信息。