sudoers:配置sudo

1.1.2 sudoers:配置sudo(1)

安装好sudo之后,经过仔细的配置,它能够变得更加安全、更加健壮。sudo的配置文件是/etc/sudoers。编辑sudoers文件的最 好办法是输入以下命令以使用visudo:sudo visudo。visudo实用工具锁定、编辑并检查sudoers文件的语法。默认情况下,visudo调用nano编辑器。可以使用下面的命令来设置 环境变量VISUAL,让visudo调用vi:

可以将vi替换成你所选择的文本编辑器。将这条命令发到某个初始化文件(参见《基础篇》9.2.1节)中去,这样每次登录的时候就可以自动设置这个变量。

警告:永远使用visudo来编辑sudoers文件

sudoers文件中的一个语法错误就会导致你不能使用sudo获取root权限。如果(不使用visudo)直接编辑这个文件,那么直到你发现自 己不能使用sudo之后,你才会知道自己在这个文件中引入了某个语法错误。在退出之前,visudo实用工具检查sudoers文件的语法。如果发现文件 中存在语法错误,visudo就会让你纠正该错误:或者不保存对文件的修改直接退出,或者保存修改并退出。后一项选择总是不好的,因而visudo将最后 一项标记为(DANGER!)("危险!")。

在sudoers文件中,注释均以#号开头,注释可以出现在文本行的任何位置。除了注释之外,这个文件还保存了两种类型的项:别名和用户特权说明。每项占用一行,如果以反斜杠符号(\)作为行末的话,它就可以跨越多个物理行。

1. 用户特权说明

用来指定用户特权的文本行的格式如下(等号两边的空白符是可选的):

user_list指定该特权说明行适用的用户。这个列表可以包含用户名、组(以%开头)和用户别名(参见下一节)。

host_list指定该特权说明行适用的主机。这个列表可以包含一个或多个主机名、IP地址或主机别名(将在下一节讨论)。可以使用内置命令alias ALL让该行适用于所有引用这个sudoers文件的系统。

runas_list指定当带着选项-u(参见1.1.1节的选项部分)调用sudo时能够以哪些用户的身份来运行命令列表 command_list中的命令。这个列表可以包含用户名、组(以%开头)和runas别名(在下一节讨论)。必须用圆括号将该特权说明括起来。如果没 有runas_list的话,那么sudo假设为root。

command_list指定该特权说明行适用的实用工具。这个列表可以包含实用工具的名称、存放实用工具的目录名称以及命令别名(在下一节讨论)。所有名称必须是绝对路径名,目录名称必须以斜杠(/)结尾。

如果在某个名称后面紧跟着两个相邻的双引号(),那么该用户就不能指定任何命令行参数,包括选项。此外,你可以指定参数(包括通配符)以限制用户能够使用的参数。

示例

下面的用户特权说明允许Sam使用sudo挂载和卸载引用包含这条特权说明的sudoers文件的所有系统(由ALL指定)上的文件系统(以root特权身份进行挂载和卸载):

(root) runas_list是可选的。如果将其忽略,那么sudo将允许该用户以root特权身份运行命令列表command_list中的命令。在下面的示例中,Sam利用了这些权限。他不能直接运行umount。相反,他必须调用sudo来运行这条命令。
如果将上面讲解的sudoers中的那一行替换成下面这行,那么Sam就不能卸载/p03,尽管他还能够卸载所有其他文件系统,并且能够挂载任何文件系统:
下面给出了sudoers文件中的上面这行的结果。sudo实用工具没有提示输入口令,这是因为Sam在最近15分钟之内曾经输入过自己的口令。
下面这行限制Sam挂载和卸载那些挂载到/p01、/p02、/p03和/p04的文件系统:
下面这些命令给出了结果:

admin组的默认特权

在发行的时候,sudoers文件包含下面几行:

该用户特权说明适用于所有系统(由等号左侧的ALL指出)。正如注释所说,这行让admin组成员(由组名前面加上前缀%指定:%admin)以任 何用户的身份(最右侧的ALL)运行任何命令(圆括号中的ALL)。如果调用的时候不带选项-u,sudo实用工具就以root特权身份运行你所指定的命 令,大多数情况下人们都是以这种方式使用sudo的。

如果sudoers文件中有下面这行,那么wheel组成员将能够以任何用户的身份运行任何命令,但有一个例外:他们不能运行passwd来修改root口令。

※选读

在%admin ALL=(ALL) ALL行中,如果将(ALL)替换成(root),或者将(ALL)忽略,那么你仍然能够以root特权身份运行任何命令。但是你不能使用-u选项从而以 另一个用户的身份来运行命令。通常,当你能够获得root特权身份时,这个限制不会带来什么问题。以另一个普通用户或者root的身份进行操作,这样你就 可以用尽可能小的特权来完成任务,这是一个好主意。

举例来说,如果你属于admin组,那么sudoers文件中的默认项可以让你输入下面的命令来创建和编辑Sam主目录中的文件。因为你正在以Sam的身份进行操作,所以他将拥有这个文件,并且能够读取和写入该文件。



实现sudo无须询问密码

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
tercel ALL=(ALL) NOPASSWD: ALL


1.1.2 sudoers:配置sudo(2)

2. 别名

别名可用来将用户、主机或命令重命名和分组。下面是别名定义的格式:


其中,alias_type是别名类型(User_Alias、Runas_Alias、Host_Alias、 Cmnd_Alias),alias_name是别名名称(按照约定全部大写),alias_list是组成该别名的一个或多个元素构成的由逗号隔开的列 表。在别名的某个元素前面添加感叹号(!)可将其忽略。

User_Alias

用户别名的alias_list与用户特权说明(参见前一节的讨论)中的user_list一样。下面这几行取自sudoers文件,定义了3个用 户别名:OFFICE、ADMIN和ADMIN2。定义第1个别名的alias_list包含用户名mark、sam和sls,第2个包括两个用户名和 admin组成员,第3个别名包括除Max之外admin组所有成员。

Runas_Alias

runas别名的alias_list与用户特权说明中的runas_list(参见前一节的讨论)一样。下面的runas别名SM包括用户名sam和sls:

Host_Alias

只有当运行在多个系统上的sudo同时引用这个sudoers文件时,主机别名才有意义。主机别名的alias_list与用户特权说明中的host_list(参见前一节的讨论)一样。下面这行定义了LCL,它包括系统dog和plum:

如果希望在这个列表中使用全限定主机名(hosta.example.com,而不仅仅是hosta),那就必须设置fqdn标志(参见下一节的讨论),这会降低sudo的性能。


Cmnd_Alias

命令别名的alias_list与用户特权说明中的command_list(参见前一节的讨论)一样。下面的命令别名包括3个文件并包含该目录中的所有文件(通过包含一个目录,由末尾的/指出)。

3. 默认值(选项)

通过使用Defaults关键字,可以修改配置选项的默认值。这个列表中的大多数值是一些标志,它们是布尔值(可以是on或off)或者字符串。在 Defaults行中,将某个标志列出,就可以将其打开,而在名字前面加上!则可以将其关闭。下面这行取自安装好的sudoers文件,将lecture 和fqdn关闭,而将tty_tickets开启:

本节列出了一些常见的标志。完整列表参见sudoers的手册页。

fqdn

全限定域名(fully qualified domain name),对sudoers文件中的FQDN(参见术语表)执行DNS查找。如果设置了这个标志,就可以在sudoers中使用FQDN,但是这样做会 给sudo的性能带来一些负面影响,特别是在DNS不能正常工作的情况下。当设置这个标志之后,就必须使用本地主机的正式DNS名称,而不是别名。如果 hostname返回一个FQDN,那就不必设置这个标志。默认情况下,这个标志被打开。在Ubuntu发行的sudoers文件中,这个标志被关闭。

insults

当用户输入错误的口令时显示友善的、幽默的提示。默认关闭。还可以参见passwd_tries。

lecture=freq

控制sudo什么时候在口令提示符之前显示一条用来提醒的消息。freq的可能值有:never(默认值)、once和always。指定!lecture与指定freq值为never一样。

mailsub=subj

将警告消息和错误消息的电子邮件主题的默认值由默认的*** SECURITY information for %h ***修改为subj。sudo实用工具将subj中的%h替换成本地系统的主机名。如果subj中含有shell特殊字符(参见《基础篇》5.1节), 那就用引号将其引起来。

mailto=eadd

将sudo警告消息和错误消息发送到eadd(电子邮件地址,默认值为root)。如果eadd中含有shell特殊字符(参见《基础篇》5.1节),那就用引号将其引起来。

mail_always

每当用户运行sudo时向mailto用户发送电子邮件。默认关闭。

mail_badpass

如果用户在运行sudo时输入不正确的口令,就向mailto用户发送电子邮件。默认关闭。

mail_no_host

如果用户的用户名在sudoers文件中但他没有权限在运行sudo的本地主机上运行命令,系统就向mailto用户发送电子邮件。默认关闭。

mail_no_perms

如果运行sudo的用户的用户名在sudoers文件中但他没有权限运行所请求的命令,系统就向mailto用户发送电子邮件。默认关闭。

mail_no_user

当某个用户的用户名不在运行sudo的sudoers文件中的时候,向mailto用户发送电子邮件。默认开启。

passwd_tries=num

num是用户能够在sudo口令提示符之后输入不正确的口令的次数,超过这个次数后sudo退出。默认值为3。还可以参见insults和lecture。

rootpw

让sudo在提示符之后只接受root口令。因为sudo在询问普通用户的口令和root口令的时候都会给出相同的提示符,所以开启这个标志可能会 让用户感到迷惑。如果尚未将root账号解锁,那么不要将这个标志打开(参见1.1.3节),否则修改之后不能使用sudo。要想修复这个问题,请引导系 统进入恢复模式(参见1.3.3节),将这个标志关闭(删除)。默认关闭,这会让sudo提示输入运行sudo的用户的口令。参见附件的提示信息。

提示:使用root口令替代你的口令

如果已经设置root口令(参见1.1.3节),那么通过开启rootpw标志,可以让需要口令方能运行的图形界面程序请求输入root口令,而不 是运行这个程序的用户的口令。这个程序将继续询问你的口令,但是只接受root口令。这样修改之后,Ubuntu系统就可以按照类似于其他发行版使用该口 令的方式使用root口令。

shell_noargs

让sudo(不带任何参数调用)派生一个root shell而不改变环境。默认关闭。这个与sudo -s选项一样。

timestamp_timeout=mins

mins是sudo时间戳(参见1.1.1节)保持有效的分钟数。默认值为15。将mins设置为-1会让时间戳永久有效。

umask=val

val为sudo用来运行用户指定的命令的umask(1.6.2节)。将val设置为0777可以保留用户的umask值。默认值为0022。
收藏  | 打印  | 字体:  -缩小  放大+    
[ x ] 请正确填写下面信息


是否保存此网页快照 是否公开此收藏

查看全部评论(30)我来说两句