使用 sudo 而非 root 帐户,进行系统管理,具有许多优点:
- 当运行 sudo,需要的密码,而非 root 密码,这样只需记住一个密码即可。
- sudo 实用程序记录其执行的所有命令。如果犯了一个错误,此日志可用于系统审计来追溯的操作。
- sudo 实用程序记录执行 sudo 命令的用户。在有多个管理员的系统上,这个日志告诉哪些用户执行了 sudo 命令。没有 sudo,就无从知道哪个用户使用 root 特权执行一个命令。
- sudo 实用程序比使用 su 和 root 帐户可以实现更细粒度的安全策略。使用 sudo,可以使特定用户执行特定命令,而使用经典的 root 帐户设置就不能这样做。
- 使用 sudo 使得恶意用户更难获得对系统的访问权。当有一个未锁定的 root 帐户时,恶意用户一开始就知道她想破解的帐户名。当 root 帐户被锁住时,该用户为进入系统就不得不先确定用户名和密码。
- 管理许多系统的 root 密码是具有挑战性的。如果不写下来(并把它们存储在安全的地方),记住每个系统的密码是很难的,并且检索密码也很耗时。使用 sudo,即使是完全的 root shell 访问,使得在大量的系统上获得 root 特权、并跟踪每个系统上获得 root 特权的用户-这样的任务变得更容易。
有些用户质疑 sudo 不如 su 安全。因为都依靠密码,它们共享相同的长处和短处。如果密码被攻破,系统就会大打折扣。但是,如果 sudo 允许执行一项任务的用户密码被破解,系统整体不会有风险。因此,如果使用得当,sudo 权限结构的更细粒度使其比 su 更安全。
对于设置系统来说,使用 sudo 可能并不总是最好的、安全的方式。在由单个用户使用的系统上,使用 sudo 与小心使用 su 和 root 密码之间没有太大的区别。相比之下,在有多个用户的系统上,特别是在具备中央管理的系统网络上,sudo 可以设置的比 su 更安全。
以下行在 /etc/sudoers 文件中,允许 wheel 组的成员使用 sudo 来取得 root 特权:
%wheel ALL=(ALL) ALL |
如果注释掉此行(在 RHEL 和 Fedora15 之前的版本中),采用 root 特权,使用 visudo 来删除前导哈希标记(#),以便 wheel 组的成员能获得 root 特权。
下一步,使用 root 特权,运行 usermod – a 和 usermod – G wheel 命令,把被授予 root 特权的用户名添加到 wheel 组中。在下面的例子中用 sam 替代该用户名。
# usermod -a -G wheel sam # grep wheel /etc/group wheel:x:10:root,sam |
默认情况下,首次运行时,sudo 会要求输入密码(非 root 密码)。此时,sudo 设置了的时间戳。提供密码后,基于的时间戳,五分钟内 sudo 不会再次提示输入密码。
在下面的例子中,Sam 尝试以自己的身份(非特权用户)设置系统时钟。date 实用程序显示错误消息,后边是 Sam 所输入日期的扩展版。当他使用 sudo 运行 date 以设置系统时钟时,sudo 提示他输入其密码,然后命令成功。
$ date 01121500 date: cannot set date: Operation not permitted Wed Jan 12 15:00:00 PST 2011 $ sudo date 01121500 [sudo] password for sam: Wed Jan 12 15:00:00 PST 2011 |
接下来,Sam 使用 sudo 卸载文件系统。因为他是在之前 sudo 命令的五分钟内执行这个命令,因此无需提供密码:
$ sudo umount /music $ |
现在,Sam 使用– l 选项来检查 sudo 允许运行哪个命令。由于按照前面“快速设置”的解释来设置 sudoers 文件,他被允许以任何用户运行任何命令。
$ sudo -l |
用户 sam 可能在此主机上运行以下命令:
(ALL) ALL |
用户可以授予 root 特权来编辑一个文件,主要包括如下情况:
- 使用– e 选项,或被用作 sudoedit 时,sudo 以 root 特权编辑其参数命名的文件。默认情况下,sudo 使用 vi 编辑器。
- 任何以 root 特权运行命令的用户都可以使用– e 选项。要给其他用户使用 root 特权编辑任何文件的权限,需要在 sudoers 文件中指定该用户可以执行 sudoedit 命令。
- 以这种方式调用编辑器,在该用户环境以最少特权运行此编辑器。sudo 实用程序第一次会把要编辑的文件复制为属于该用户的一个临时文件。如果该文件不存在,sudo 创建一个属于该用户的新文件。一旦用户编辑完该文件,sudo 将其复制回原来的地方(并恢复为原来的权限)。
当有几个需要以 root 特权运行的命令,生成一个 root shell 可能会更容易,只需执行该命令而不必在每个命令前面键入 sudo,并从 shell 退出。这种技术会破坏一些内置入 sudo 的保护,所以要慎重使用,记得尽快返回到非 root shell。使用 sudo – i 生成 root shell:
$ pwd /home/sam $ sudo -i # id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys) ... # pwd /root # exit logout $ |
在这个例子中,sudo 派生了一个 root shell,它显示一个 # 提示符提醒 Sam 他正在以 root 特权运行。id 实用程序显示该用户运行 shell 的身份。exit 命令(也可以使用 Control-D 组合)终止 root shell,将 Sam 返回到其正常状态和他之前的 shell 和提示符。
在前面的例子中 pwd 内建命令显示由– i 选项创建的环境修改后的样子。此选项派生一个 root 登录 shell(与以 root 身份登录的用户的环境相同的 shell),并执行 root 的启动文件。在执行 sudo – i 命令之前,pwd 内建命令显示 /home/sam 为 Sam 的工作目录;执行该命令后,它显示 /root(root 的主目录)为其工作目录。使用– s 选项派生一个 root shell,而无需修改环境。当调用不带选项的 sudo 时,它运行在未修改的环境中指定的命令。为了展示此功能,下面的例子调用不带选项的 sudo 来运行 pwd。以这种方式运行,命令的工作目录不会发生改变。
$ pwd /home/sam $ sudo pwd /home/sam |
因为虽然该 sudo 派生的 shell 以 root 特权执行 ls,该用户正在运行的非特权 shell 将输出进行了重定向,用户的 shell 无权写入到 /root,所以下面的命令将会失败。
$ sudo ls > /root/ls.sam -bash: /root/ls.sam: Permission denied |
有几种方法解决这个问题。最简单的是将整个命令行传递到 sudo 中运行的 shell:
$ sudo bash -c "ls > /root/ls.sam" |
bash – c 选项派生了一个 shell,来执行该选项后边的字符串,然后终止。sudo 实用程序以 root 特权运行这个 shell。必须引用该字符串,以防止非特权 shell 解释其中的特殊字符。还可以使用 sudo – i 生成一个 root shell 来执行该命令,然后从特权 shell 退出。
可以使用命令行选项来控制 sudo 如何运行命令。以下是 sudo 命令行的语法:
sudo [options] [command] |
其中 options 是一个或多个选项,command 是要执行的命令。如果没有– u 选项,sudo 以 root 特权运行 command。下面是一些较常见的 options(选项);完整列表请参阅 sudo 的手册页。
- – b:(background)在后台运行 command。
- – e:(edit),使用此选项,command 是一个文件名,而不是命令。此选项会使 sudo 以 root 特权,使用由 SUDO_EDITOR、VISUAL 或 EDITOR 环境变量命名的编辑器,来编辑 command 文件。默认是 vi 编辑器。另外,还可以使用不带任何选项的 sudoedit 实用工具。使用这种技术,编辑器不会以 root 特权运行。
- – i:(initial login environment)为 root 派生在 /etc/passwd 中(或为由– u 指定的另一个用户)指定的 shell,运行 root(或其他用户的)的启动文件,一些例外(例如,不改变 TERM)。不要带 command。
- – k:(kill) 重置该用户运行此命令的时间戳,这意味着该用户下次运行 sudo 时必须输入其密码。
- – L:(list defaults) 列出在 sudoers 文件中预设行设置的参数。不要带 command。
- – l:(list commands) 列出允许运行 sudo 的用户在本地系统上运行的命令。不要带 command。
- – s:(shell) 产生一个如在 /etc/passwd 文件中指定的新 root(或为由– u 指定的另一个用户)shell。与– i 类似,但不改变环境,不要带 command。
- – u user:以 user 特权运行 command。没有这个选项,sudo 以 root 特权运行 command。