受限的特权:sudo

内容录自 Linux从入门到精通  刘忆智 清华大学出版社 (http://item.jd.com/11397776.html)

另外,也可参见:http://book.51cto.com/art/200912/168357.htm

9.8  受限的特权:sudo

使用su命令提升权限已经让系统安全得多了,但root权限的不可分割让事情变得有些棘手。如果用户john想要运行某个特权命令,那他除了向管理员索取root口令外别无他法。仅仅为了一个特权操作而赋予用户控制系统的完整权限,这种做法听起来有点可笑,但这确实存在于某些不规范的管理环境中。

最常见的解决方法是使用sudo程序。这个程序接受命令行作为参数,并以root身份(或者也可以是其他用户)执行它 。在执行命令之前,sudo会首先要求用户输入自己的口令,口令只需要输入一次。出于安全性的考虑,如果用户在一段时间内(默认是5分钟)没有再次使用sudo,那么此后必须再次输入口令。这样的设置避免了特权用户不经意间将自己的终端留给那些并不受到欢迎的人。

管理员通过配置/etc/sudoers指定用户可以执行的特权命令,下面是Ubuntu中sudoers文件的默认设置。

# User privilege specification
root    ALL=(ALL) ALL


# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

按照惯例,”#”开头的行是注释行。以”root    ALL=(ALL) ALL”这句话为例,这段配置指定root用户可以使用sudo在任何机器上(第1个ALL)以任何用户身份(第2个ALL)执行任何命令(第3个ALL)。最后一行用”%admin”替代了所有属于admin组的用户。在Ubuntu中,安装时创建的那个用户会自动被加入admin组。

总体来说,sudoer中的每一行权限说明包含了下面这些内容。

  • 该权限适用的用户;
  • 这一行配置在哪些主机上适用;
  • 该用户可以运行的命令;
  • 该命令应该以哪个用户身份执行。

下面来看一段稍复杂一些的配置。这段配置涉及3个用户,并为他们设置了不同的权限。

Host_Alias    STATION = web1, web2, databank


Cmnd_Alias   DUMP = /sbin/dump, /sbin/restore

lewis         STATION = ALL
mike         ALL = (ALL) ALL
john          ALL = (operator) DUMP

这段配置的开头两行使用关键字Host_Alias和Cmnd_Alias分别定义了主机组和命令组。后面就可以用STATION替代主机web1、web2和databank;用DUMP替代命令/sbin/dump和/sbin/restore。这种设置可以让配置文件更清晰,同时也更容易维护。

注意:sudoers中的命令应该使用绝对路径来指定,这样可以防止一些人以root身份执行自己的脚本程序。

接下来的3行配置了用户的权限。第1行是关于用户lewis的。lewis可以在STATION组的计算机上(web1、web2和databank)执行任何命令。由于在代表命令的ALL之前没有使用小括号”( )”指定用户,因此lewis将以root身份执行这些命令。

第2行是关于用户mike的。mike可以在所有的计算机上运行任何命令。由于小括号中的用户列表使用了关键字ALL,因此mike可以用sudo以任何用户身份执行命令。可以使用带-u选项的sudo命令改变用户身份。例如mike可以这样以用户peter的身份建立文件。

$ sudo -u peter touch new_file

最后一行是关于用户john的。john可以在所有主机上执行/sbin/dump和/sbin/restore这两个命令–但必须以operator的身份。为此,john必须像这样使用dump命令。

$ sudo -u operator /sbin/dump backup /dev/sdb1

修改sudoers文件应该使用visudo命令。这个命令依次执行下面这些操作。

(1)检查以确保没有其他人正在编辑这个文件。
(2)调用一个编辑器编辑该文件。
(3)验证并确保编辑后的文件没有语法错误。
(4)安装使sudoers文件生效。

现在看起来sudo的确要比su灵活和有效得多。但没有什么解决方案是十全十美的。使用sudo实际上增加了系统中特权用户的数量,如果其中一个用户的口令被人破解了,那么整个系统就面临威胁。保证每个拥有特权的用户保管好自己的口令显然比自己保管一个root口令困难得多–尽管除此之外并没有什么好办法。