sudo套件的两个关键组件是 sudo
程序和 /etc/sudoers 。使用sudo命令以升级权限运行程序。sudoers文件定义了一个策略,告诉sudo用户可以运行哪些命令,以及使用哪些权限。
您想在sudo下运行命令吗?运行sudo,然后执行命令。以下示例,我请求NFS挂载:
$ sudo mount fileserver:/home/mike /mnt
Password:
mount_nfs: fileserver: hostname nor servname provided, or not known
$
Sudo要求输入密码。这是我的密码,不是root密码。如果我正确输入了密码,并且我有权通过sudo运行此命令,我将得到程序的正常输出。大约在现在,我记得办公室支持团队重新命名了那台机器。
好消息是,sudo会记住我已通过身份验证,在接下来的五分钟内不会要求我输入密码。这次有些操作系统发生了变化,因此您需要查看sudo手册页以了解详细信息。(您可以更改这次,或使用完全不同的身份验证,如第13章所述。)如果您犯了错误,您可以在之后立即重新输入正确的命令,而不必重新键入密码。
当你第一次在任何系统上运行sudo时,sudo会打印几行关于在运行特权命令之前思考的重要性。把这堂课铭记在心。特权命令具有特权,因为它们可以重新配置、取消配置、损坏、拆除或摧毁系统。
以root身份运行命令并不总是可取的。一些软件,特别是数据库和应用服务器,可能有专门的用户。应用程序希望以该用户身份运行,并且该用户的环境被配置为管理应用程序。从大型Java程序到Ansible等小型工具的应用程序都使用这种模型。您可以通过添加 -u
标志以特定用户身份运行命令:
xxxxxxxxxx
# sudo –u oracle sqlplus
这将启动目标用户的环境并运行指定的命令,就像 su -
一样。
每个用户都有一个主组,在 /etc/passwd 或其等效文件中列出了他们的帐户。来自其他来源的组,如 /etc/group ,被视为次要组。某些程序只有在用户的主要组是其首选组时才能工作。这真的很烦人,因为你可能更喜欢按预期目的使用组,而不是照看一个挑剔的软件。根据操作系统处理组的方式和软件的安装方式,您可能需要更改主组以运行命令。使用 –g
标志和组名:
xxxxxxxxxx
# sudo –g operator stupidpickycommand
Sudo对程序撒谎,并告诉它您的主要组是操作员。
您还可以通过在GID前添加哈希标记来使用组ID号。您的shell可能会要求您在命令行上转义哈希标记。我们tcsh用户没有这个要求。
xxxxxxxxxx
# sudo –g #100 stupidpickycommand
【FreeBSD14默认shell为sh,以上命令需要在井号前面加反斜杠进行转义】
Sudo运行该命令,就像您的主组ID是100一样。
90%的用户都知道sudo。你学到的其他一切都会让你成为一名专家。
如果运行sudo看起来很简单,那是因为真正的工作发生在sudoers文件中,通常简称为“sudoers”。sudoers档案包含定义哪些用户可以运行哪些特权命令的规则。我的例子假设sudoers是 /etc/sudoers ,但无论你的包放在哪里都没问题。切勿手动编辑sudoers文件;始终使用第3章中介绍的 visudo
命令。
一些操作系统包在其sudoers文件中包含特定于操作系统的示例,以了解操作系统支持的特殊功能。在对默认sudoers文件进行任何更改之前,请将原始文件复制到安全位置,以便以后参考。
sudoers文件包含一系列规则,每行一条。每个规则都使用这种通用格式。我们关于sudoers的其余讨论大多涉及扩展、拉伸和普遍滥用这种格式。
xxxxxxxxxx
username host = command
username 是此规则适用的用户名。用户名也可以是系统组,也可以是sudoers中定义的别名。
host 是此规则适用的系统的主机名。我们将在第10章中跨多个系统共享 /etc/sudoers 。 等号将机器与命令分开。
最后,command 列出了此规则适用于的每个命令的完整路径。Sudo配置需要命令的完全路径。
sudoers文件可以识别各种特殊关键字。其中最常见的是 ALL
,它匹配所有可能的选项。为了允许所有用户在每个主机上运行任何命令,您可以编写这样的sudoers文件:
xxxxxxxxxx
ALL ALL=ALL
这大致相当于为每个人提供root访问权限,但使用他们自己的密码而不是root密码。别这样。至少,按用户名限制访问:
xxxxxxxxxx
mike ALL=ALL
用户 mike 可以在所有服务器上运行任何命令。
您还可以通过主机限制sudo访问。最常见的情况是,您会看到服务器限制为 ALL
,因为大多数系统管理员都是在每个主机的基础上配置sudo的。如果你单独管理每台服务器,将服务器定义为ALL实际上意味着“这台服务器”。但是,作为最佳实践,请将服务器名称放在这里。(运行hostname以获取服务器的名称。)第10章详细介绍了按主机分配sudo权限。
xxxxxxxxxx
mike www=ALL
用户 mike 可以在主机 www 上运行任何命令。
要限制用户运行单个命令,请在最后一个字段中给出命令的完整路径:
xxxxxxxxxx
mike www=/sbin/reboot
用户 mike 可以在服务器 www 上运行命令/sbin/reboot。
很容易,对吧?现在让我们把它复杂化。
每种独特的访问规则组合都需要自己的行式sudoers。使用这样的多个条目是完全合法的:
xxxxxxxxxx
mike www=/sbin/reboot
mike www=/sbin/dump
不过,这很快就会变得很麻烦。如果您有多个类似的规则,请用逗号分隔各个部分:
xxxxxxxxxx
mike,pete www=/sbin/reboot, /sbin/dump
用户 mike 和 pete 可以在主机 www 上运行重启和转储命令。
虽然可以在单个规则中列出多个命令和用户,但必须对不同的访问级别使用不同的规则。
xxxxxxxxxx
thea ALL=ALL
mike,pete www=/sbin/reboot, /sbin/dump
第一条规则声明系统所有者 thea 可以在任何主机上运行任何命令。她很有礼貌地允许小黄人 mike 和 pete 在主机上运行两个命令。
一些应用程序,通常是数据库或商业Java程序,必须由特定用户运行才能正常工作。如果sudoers策略允许,Sudo允许您以root以外的用户运行命令。在命令前的括号中列出用户名:
xxxxxxxxxx
kate beefy = (oracle) ALL
用户 kate 可以在服务器 beefy 上运行任何命令,但只能以用户 oracle 的身份运行。她可以完全管理数据库,但在其他方面没有特权。
有权访问特定用户帐户的用户也可以单独访问根级别权限:
xxxxxxxxxx
mike beefy = (oracle) ALL
mike beefy = /sbin/mount, /sbin/umount
mike 可以挂载和卸载磁盘,以及管理Oracle数据库。
一旦你在一个规则中按完整路径、多个用户和多台机器列出多个命令,单个sudoers行可能会变得很长。用反斜杠结束一行,表示规则在下一行继续:
xxxxxxxxxx
kent,mike,pete beefy,www,dns,mail = /sbin/mount, /sbin/umount, \
/sbin/reboot, /sbin/fsck
空白和额外的行使规则更容易管理。自由地使用它们。
以下是关于sudoers的最后几点。
Sudo按顺序处理规则,最后一个匹配的规则获胜。如果两条规则冲突,则最后一条匹配的规则获胜。在我们制定复杂的sudoers规则时,我们将看看这是如何发挥作用的。
感叹号(!)是否定运算符。它用于从列表中排除一个项目。可以说,规则适用于除特定用户、主机或命令之外的所有内容。它还关闭了选项。记住感叹号的意思是“no”。本书的其余部分有很多例子。
最后,sudoers文件必须始终以空白行结尾。如果visudo在最后一行显示错误,但语法看起来都正确,请验证您的策略末尾是否有一行空白。【此处存疑】
现在您已经基本掌握了sudo和sudoers,让我们创建自己的sudoers文件并用sudo进行测试。