如果sudo无法解析 /etc/sudoers ,它将不会运行。如果你依赖sudo在服务器上获得root权限,而你破坏了sudo,你就把自己锁在了服务器的特权命令之外。修复sudoers是一项特权命令。这是一个糟糕的局面。不要把自己放在这里。Sudoer必须包含有效的语法。Sudo包括一个专门用于编辑sudoers的工具 visudo
。
Visudo可以保护您免受明显的泡沫问题。它锁定 /etc/sudoers ,这样一次只有一个人可以编辑它。它在文本编辑器中打开文件的副本。保存文件时,visudo
会解析它并检查sudo语法。如果你的新sudoers文件在语法上有效,visudo
会将新文件复制到 /etc/sudoers 。
记住,“语法上有效”与“做你想做的事”不同。
Visudo默认使用vi编辑器。虽然所有系统管理员都必须对 vi
有一定的了解,但这并不意味着你需要用它做所有事情。Visudo尊重$EDITOR环境变量,所以你可以使用你喜欢的文本编辑器。
设置您喜欢的编辑器,我们将继续编辑sudoers。
虽然大多数操作系统都包含一个包含大量示例的示例或默认sudoers文件,但您可以在这里学习。学习意味着从头开始制定你的sudoers政策,就像蛋糕一样,但没有那么美味。将默认的sudoers文件移动到某个位置,以便将其用作引用。当你运行 visudo
时,它会创建一个新文件。
xxxxxxxxxx
# visudo
创建一个非常简单的sudoers文件,赋予您的帐户对服务器的完全权限。在这里,Thea可以通过sudo无限制地访问:
xxxxxxxxxx
thea ALL = ALL
保存文件并退出。有了这样一个简单的规则,允许一个用户完全访问机器,你的文本编辑器应该干净地退出, visudo
应该安装这些规则。
现在,作为一项学习练习,打破泡沫。(Ubuntu和苹果用户,你确实有root密码,对吧?)运行 visudo
并在文件底部创建一行垃圾。保存并退出。您将看到:
xxxxxxxxxx
# visudo
>>> /usr/local/etc/sudoers: syntax error near line 3 <<<
What now?
如果您按 e
, visudo
将返回文本编辑器以解决您的问题。转到指定的行,查看发生了什么。删除垃圾, visudo
将允许您退出文本编辑器并安装策略。
要放弃更改并保留旧的sudoers策略,请按 x
。旧的工作sudoers比新的坏sudoers更好。我在学习sudo时不止一次这样做,所以在这个阶段不要担心。
如果按 Q
,则将损坏的文件安装为 /etc/sudoers 。当sudo无法解析 /etc/sudoers 时,它会立即退出。按Q键告诉 visudo
中断sudo,直到你以root用户身份登录并修复它。不要按这个按钮。你不会喜欢的。
如果您忘记了这些键,输入问号会提示 visudo
打印出您的选项。
请记住,有效的(valid)sudoers文件与有用的(useful)sudoer文件不同。一个空白的sudoers,否认每个人的所有特权,是完全有效的,解析起来非常快。 visudo
还接受一个sudoers文件,其中每个规则都指定了不在系统上或本地系统以外的服务器上的用户和命令。
当您为网络创建sudoers文件时,我强烈建议最后一条规则赋予您的帐户运行 visudo
的权限。如果其他一切都失败了,你可以修改规则。
xxxxxxxxxx
thea ALL = /usr/sbin/visudo
记住,sudo按顺序处理规则,最后一个匹配的规则获胜。把你的紧急救援规则放在文件的最后。
您已经编写了第一个sudoers安全策略。目前,你可以很容易地阅读它——它只有两行:你的完全访问条目和你的紧急可视化条目。但是,当你的策略变得更加复杂时,你如何知道用户可以访问什么?
用户可以使用 sudo
的 -l
标志来列出他们的权限:
xxxxxxxxxx
$ sudo -l
Password:
User thea may run the following commands on this host:
(root) ALL
(root) /usr/sbin/visudo
$
当Thea输入密码时,她会看到可以运行哪些命令。这个输出可能看起来有点奇怪,但它也应该看起来有点熟悉。这是一个相当标准的sudoers条目,删除了用户和主机。记住,如果你没有在sudoers中指定用户,sudo会以 root 身份运行该命令。举一个稍微复杂一些的例子,这可能会更明显一些:
xxxxxxxxxx
$ sudo -l
User thea may run the following commands on this host:
(root) ALL
(oracle) ALL
(root) /usr/sbin/visudo
Thea可以以 root 身份运行所有命令,以用户 oracle 身份运行所有指令,以 root 身份执行visudo。
用户可以检查自己的权限,但系统管理员呢?你如何确保你的苏丹政策按照你认为应该的方式运作?使用 -U
标志和 -l
指定用户:
xxxxxxxxxx
# sudo -U mike -l
User mike is not allowed to run sudo on www.
只有 root 和可以在当前主机上运行所有命令的用户才能使用 -U
。使用我的无特权用户帐户,我只能检查自己的访问权限。Sudo看到Thea的安全策略中附加了魔法ALL,所以她可以查看我的访问权限。否则,她将不得不运行 sudo -u mike sudo -l
,这有点愚蠢。
在本书中,我们将使用 sudo –l
来了解复杂的sudoers策略是如何扩展为用户可见的规则的。我建议在更改后使用 -U
来验证用户的访问权限,然后再告诉他所请求的访问权限可用。