Sudo的标准行为适用于最常见的用例。然而,最常见用例的有趣之处在于它有多么罕见。您可以通过在sudoers中设置各种选项来更改sudo的大部分核心行为。这些选项可以设置为全局默认值,也可以附加到特定的规则、主机、用户或命令。
使用 Defaults
语句设置默认值。一个sudoers策略可以有多个Defaults语句。如果多个Defaults语句冲突,则应用最后一个匹配的语句。在本章中,我们将看到许多Defaults语句示例。
影响特定sudo函数的大多数选项都有自己的章节,并在该章节中进行了讨论。也就是说,我们在第8章介绍了影响环境的选项,在第12章介绍了日志记录选项。本章介绍了如何将选项用于特定组和默认值。我们将从使用Defaults语句中的选项开始。
选项可以是布尔值(boolean)、整数(integers)、整数或布尔上下文中可用的列表(integers or lists usable in boolean context),也可以是字符串(strings)。
某些选项仅通过其存在就影响sudo。它们是切换开关,打开和关闭行为。一些布尔选项默认情况下是打开的,即使它们没有出现在sudoers中。通过在它们前面加一个感叹号来停用它们。
多年来,当用户输入错误的密码时,sudo会侮辱他们。不久前,sudo开发人员改变了这一点,显然是为了让sudo看起来更专业或更适合企业。然而,侮辱用户是系统管理员的特权,而自动侮辱用户展示了系统管理员的能力。在sudoers中添加侮辱选项,使sudo侮辱无法键入密码的用户。
xxxxxxxxxx
Defaults insults
当用户键入错误的密码时,除了密码提示外,他还会收到激励性评论。
xxxxxxxxxx
$ sudo -l
Password:
Sorry about this, I know it's a bit silly.
Password:
stty: unknown mode: doofus
Password:
Harm can come to a young lad like that!
sudo: 3 incorrect password attempts
如果默认情况下您的sudo安装会侮辱用户,您可以通过禁用该选项来禁用侮辱。
xxxxxxxxxx
Defaults !insults
用户现在会收到无聊的“抱歉,再试一次”消息。
一些操作系统打包者故意从他们的sudo版本中删除此选项。如果你这样做,我建议他们痛苦地抱怨,直到他们看到自己的错误。
有些选项将数字作为参数。使用等号将参数与选项名称分隔开。这些选项为此sudo选项设置了限制。
关于密码的常识是,密码应该包括大小写混合的字母、数字和各种符号。哦,它们应该很长。这使得它们很难输入,尤其是当你输入密码时密码不可见。你的用户可能需要三次以上的尝试才能正确输入密码。在这里,Thea允许用户尝试键入密码五次,然后将其踢出sudo并记录错误。
xxxxxxxxxx
Defaults insults, passwd_tries=5
在这里,我们将两个选项组合在一个Defaults语句中,用逗号分隔。您可以在一行上使用任意多的选项,但我建议按功能对它们进行分组。
如果整数选项对sudo的行为设置了限制,则这些选项允许您通过将限制设置为零来禁用功能。你还记得sudo会缓存你已经通过身份验证的事实五分钟吗?您可以更改它记住的分钟数。
xxxxxxxxxx
Defaults insults, timestamp_timeout=10
然而,sudo缓存身份验证的时间越长,用户退出特权终端会话的风险就越大。许多用户离开办公桌时不会锁上工作站。使用更长的超时时间会增加安全问题的可能性。
当然,解决这个问题的方法是完全禁用身份验证超时。要求用户每次运行sudo时输入密码。通过将超时设置为零,您可以完全禁用身份验证缓存。
xxxxxxxxxx
Defaults insults, timestamp_timeout = 0
根据您的环境以及人们用于sudo的命令,禁用身份验证计时器可能过于苛刻。但是,如果您使用强身份验证方法,这是有道理的,正如我们将在第13章中看到的那样。
有些选项需要文本或文件路径等参数。
当用户输入错误的密码时,在侮辱用户和提供平淡的“对不起,再试一次”之间有一个中间地带。您可以通过设置badpass_message选项来使用自定义消息。
xxxxxxxxxx
Defaults badpass_message="Wrong password. I have noted your incompetence. Try again!"
当用户输入错误的密码时,sudo会显示自定义消息。我把消息放在引号里,因为它有特殊的字符,比如空格和感叹号。以文件路径为参数的选项不需要引号。
选项不仅仅是全局默认值。您可以单独设置选项,以便它们只影响某些用户、命令或特定计算机。
某些用户应该获得与其他用户不同的默认设置。也许你需要为一些用户设置不同的身份验证超时,或者设置不同的密码提示,或者一些抱怨者抱怨系统侮辱了他。您可以更改特定用户的默认值。使用关键字Defaults、冒号、用户或用户列表以及选项。
当你第一次在任何机器上运行sudo时,它会打印一个简短的演讲,提醒你要小心。大多数用户都需要提醒。但系统管理员始终牢记自己的责任,并痛苦地意识到误击键盘会造成的损害。他们不需要提醒,一旦你看过几百次讲座,它只会让你恼火。在这里,Thea为自己禁用了 lecture
选项。
xxxxxxxxxx
Defaults:thea !lecture
她还可以禁用允许使用根密码的每个人的 lecture
。
xxxxxxxxxx
Defaults:%wheel !lecture
拥有root权限的人现在会稍微不那么恼火。这只能是好事。
要覆盖每个主机的sudoers默认值,请使用 Defaults
、at符号(@)、主机列表或主机别名,然后使用选项。任何可以在主机别名中的内容都可以显示在此处。
xxxxxxxxxx
Defaults lecture
Defaults@TESTHOSTS !lecture
Defaults@PRODUCTION lecture=always
这里我们有两个主机别名。在测试环境中,用户不会受到说教。然而,在生产环境中,每次sudo要求他们输入密码时,它也会对他们进行说教。我建议为真正麻烦的用户保留最后一个功能。
要设置每个命令或命令别名的默认值,请使用默认值和感叹号。
也许在大多数情况下,一些用户是可以信任的。但也许特定用户对某个命令有困难。或者,某个问题可能发生得太频繁了。
xxxxxxxxxx
Defaults !lecture
Defaults!/sbin/fdisk lecture=always, \
lecture_file=/etc/disklabel-lecture
讲师文件选项允许系统管理员编写自定义讲座消息。在这种情况下,/etc/disklabel-lecture 包含一条文本消息来替换标准讲座。
xxxxxxxxxx
If you relabel a vital disk again, Thea will
leave the tatters of your still-living body
in the break room as a warning to others.
只有当用户必须输入密码时,讲座才会出现,但总比没有好。要使每次使用此命令时都显示讲座,请要求用户每次输入密码。
xxxxxxxxxx
Defaults!/sbin/fdisk lecture=always, \
lecture_file=/etc/disklabel-lecture, \
timestamp_timeout=0
通过将此特定命令的timestamp timeout设置为零,Thea消除了身份验证的超时。每当用户运行 fdisk
时,sudo都会显示威胁——呃,lecture ——并要求输入密码。
标签可以是默认值。
xxxxxxxxxx
Defaults!ALL noexec
此默认设置在所有命令上设置NOEXEC标记集。
最后,要为运行方式规则设置默认值,请在默认值和用户列表之间使用直角括号。
xxxxxxxxxx
Defaults>operator lecture
任何以 operator 身份运行命令的人(通常是备份团队)都会受到训诫。
考虑以下sudoers政策。
xxxxxxxxxx
Defaults:mike insults
Defaults!/usr/bin/su !insults
mike ALL = /usr/bin/su
第一行是说每当我运行sudo时都要侮辱我。第二行说,每当有人通过sudo运行su时,不要侮辱他们。第三行让我有权运行su。默认值冲突。会发生什么?
xxxxxxxxxx
$ sudo su
Password:
Sorry, try again.
sudo没有侮辱我。
记住,sudoers的政策是在最后一场比赛的基础上运作的。最后一个匹配的Default语句说“不要侮辱su用户”。要侮辱我,请颠倒两个Defaults语句的顺序。
现在你知道如何使用选项了,我们将在本书的其余部分看到它们的作用。