在管理家用计算机的时候,用户必须以根身份或通过 setuid 程序(如 sudo 或 su)而获得的有效根特权来执行某些任务。setuid 是一种使用程序所有者的用户 ID(UID)而不是运行该程序的用户 ID 的程序。当使用长格式列举时,这类程序的所有者部分有一个小写的 s,如下所示:
-rwsr-xr-x 1 root root 47324 May 1 08:09 /bin/su |
然而,对于一个机构的系统管理员来说,他们必须决定机构内的用户对机器到底能拥有多少管理权限。通过 pam_console.so 这个 PAM 模块,某些通常保留给根用户的活动,如重新引导和挂载可移介质,第一个登录到实际控制台的用户也会被允许进行(关于 pam_console.so 模块的详情,请参阅《红帽企业 Linux 参考指南》的“可插入验证模块(PAM)”)。然而,其它重要的系统管理任务,如改变网络设置、配置新鼠标、或挂载网络设备,没有管理权限就无法进行。因此,系统管理员必须决定网络上的用户可以拥有多少管理权限。
如果机构内的用户是一组可信任的计算机能手,那么给他们根权限可能不是件坏事。给用户拥有根权限意味着一些类似添加设备或配置网络接口的小事情可以被用户自己处理,因此系统管理员就有时间处理网络安全和其它重要的任务。
但是从另一方面来说,给个人用户以根权限会导致以下问题:
机器的错误配置 — 具备根权限的用户可能会错误配置他们的机器,从而需要协助;或者更糟的是打开安全漏洞而不自知。
运行不安全服务 — 具备根权限的用户可能会在他们的机器上运行不安全的服务器,如 FTP 或 Telnet,从而在用户名和口令被明文传输时给它们带来潜在危机。
作为根用户运行电子邮件附件 — 影响 Linux 的病毒虽然很罕见,但是并不是没有。不过,它们只有在以根用户身份运行的时候才会给系统造成威胁。
如果管理员因为这些原因或其它原因对于允许用户登录为根用户感到不太合适,他们就应该把根口令保密,并且通过使用口令保护引导装载程序(详情请参阅第 4.2.2 节)来禁止进入运行级别1或单用户模式。
表 4-1显示了管理员可以进一步保证根登录被禁止的方法:
方法 | 描述 | 影响 | 不影响 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
改变根 shell。 | 编辑 /etc/passwd 文件,然后把 shell 从 /bin/bash 改成 /sbin/nologin。 |
|
| |||||||||||||||
禁止通过任何控制台设备(tty)来获得根权限。 | 一个空的 /etc/securetty 文件会防止任何连接在这个计算机上的设备以根用户登录。 |
|
| |||||||||||||||
禁用根用户的 SSH 登录。 | 编辑 /etc/ssh/sshd_config 文件,把 PermitRootLogin 参数设置为 no。 |
|
| |||||||||||||||
使用 PAM 来限制根用户对服务的存取权限。 | 编辑 /etc/pam.d/ 目录中的表示目标服务的文件。为了验证的目的pam_listfile.so是需要的。详情请参阅第 4.4.2.4 节。 |
|
|
表 4-1. 禁用根帐号的方法
要防止用户直接登录为根用户,系统管理员可以在 /etc/passwd 文件中把根帐号的 shell 设置为 /sbin/nologin。这会阻止需要 shell 的命令,如 su 和 ssh 等直接进入根帐号。
重要 | |
---|---|
那些不需要使用 shell 的程序,如电子邮件客户或 sudo 命令,仍旧能够进入根帐号。 |
要进一步限制对根帐号的使用权限,管理员可以通过编辑 /etc/securetty 文件来禁用控制台的根登录。该文件列举了所有根用户被允许登录的设备。如果该文件不存在,根用户就能通过系统上的各类通信设备,不管是控制台还是原始网络接口,来登录。这种情况很危险,因为用户可以以根用户身份使用 Telnet 来登录,在网络中明文传送根口令。按照默认设置,红帽企业 Linux 的 /etc/securetty 文件只允许根用户在和机器物理相连的控制台上登录。要阻止根用户登录,键入以下命令来清除该文件的内容:
echo > /etc/securetty |
警告 | |
---|---|
一个空白的 /etc/securetty 文件不会防止根用户使用 OpenSSH 工具套件来远程登录,因为控制台在验证之前不会被打开。 |
要防止根用户通过 SSH 协议登录,编辑 SSH 守护进程的配置文件(/etc/ssh/sshd_config)。把以下一行:
# PermitRootLogin yes |
改成:
PermitRootLogin no |
PAM 通过 /lib/security/pam_listfile.so 模块在拒绝特定帐号方面提供了极大的灵活性。这使管理员能够在不准许登录的用户列表上应用该模块。以下的例子显示了该模块在 /etc/pam.d/vsftpd PAM 配置文件中的 vsftpd FTP 服务器上是如何被使用的(如果指令在一行内,那么就没必要使用第一行尾的 \ 字符):
auth required /lib/security/pam_listfile.so item=user \ sense=deny file=/etc/vsftpd.ftpusers onerr=succeed |
这告诉 PAM 参考 /etc/vsftpd.ftpusers 文件,并拒绝其中列举的用户使用该服务。管理员可以随意改变这个文件的名称,并为每个服务保存单独的列表,或使用一个单一列表来拒绝到多个服务的使用权限。
如果管理员想要拒绝到多个服务的使用权限,他也可以在 PAM 配置服务(如 /etc/pam.d/pop 和用于邮件服务的 /etc/pam.d/imap、或用于 SSH 客户的 /etc/pam.d/ssh)中添加相似的一行。
关于 PAM 的详情,请参阅《红帽企业 Linux 参考指南》的“可插入验证模块(PAM)”这一章。
与其完全禁止对根帐号的使用,管理员可能只想通过 setuid 程序如 su 或 sudo 等来允许对其的使用。
键入 su 命令后,用户会被提示输入根口令,经验证后,他就会得到一个根 shell 提示。
通过 su 命令登录后,用户就成为根用户,并且对系统有绝对的管理权。此外,一旦用户成为根用户,他还可以使用 su 命令来变成系统上的另一个用户而不必输入口令。
因为该程序非常强大,机构内的管理员可能想限制能够使用这个命令的人员。
最简单的方法是把用户添加到一个叫做 wheel 的特殊管理组群。要这么做,以根用户身份键入以下命令:
usermod -G wheel <username> |
在前面的命令中,把 <username> 替换成被添加到 wheel 组群中的用户名。
使用用户管理器可以同样达到这个目的。点击面板上的「主菜单」=> 「系统设置」 => 「用户和组群」,或在 shell 提示下键入 system-config-users 命令。选择「用户」活页标签,从用户列表中选择该用户,然后点击按钮菜单上的「属性」(或从拉下菜单中选择「文件」=> 「属性」)。
然后选择「组群」活页标签,点击 wheel 组群,如图 4-2所示。
下一步,在文本编辑器中打开 su(/etc/pam.d/su)的 PAM 配置文件,删除以下行的注释符号
auth required /lib/security/$ISA/pam_wheel.so use_uid |
这么做会只允许管理性组群 wheel 使用该程序。
注记 | |
---|---|
根用户是默认的 wheel 组群成员。 |
sudo 命令提供了另一种授予用户管理权限的方法。当可信任的用户在管理命令前加一个 sudo 命令,这个用户就会被提示输入他自己的口令。验证后,假定这个命令被准许执行,它就会以根用户身份执行。
sudo 命令的基本格式如下:
sudo <command> |
在上面的例子中,<command> 应该被替换为通常保留给根用户使用的命令,如 mount。
重要 | |
---|---|
sudo 命令的用户应该在离开他们的机器前特别留意一下自己是否已经退出,因为这些用户可以在五分钟之内再次使用这个命令而不必输入口令。该设置可以通过修改配置文件 /etc/sudoers 来改变。 |
sudo 命令提供了高度的灵活性。例如,只有列举在 /etc/sudoers 配置文件中的用户被允许使用 sudo 命令,并且命令是在用户的而不是根的 shell 中被执行。这意味着根 shell 可以被完全禁用,如第 4.4.2.1 节所示。
sudo 命令还提供了完整的审核渠道。每次成功的验证都被记录在 /var/log/messages 文件中,所使用的命令以及使用者的用户名被记录在/var/log/secure 文件中。
sudo 命令的另一个优越性是,管理员可以根据需要给不同的用户以不同的命令使用权限。
想编辑 sudo 配置文件 /etc/sudoers 的管理员应该使用 visudo 命令。
要给某人以完全的管理权限,键入 visudo,然后在用户特权规定部分添加和以下相似的一行:
juan ALL=(ALL) ALL |
这个例子表明,用户 juan 可以在任何主机上使用 sudo 来执行任何命令。
以下的例子显示了 sudo 配置方面的可伸缩性:
%users localhost=/sbin/shutdown -h now |
这个例子表明,只要是从控制台使用,任何用户都可以使用 /sbin/shutdown -h now 命令。
sudoers 的说明书页中有一个该文件选项的详细列表。