4.4. 管理控制

在管理家庭机器的时候,用户必须以根身份或通过 setuid 程序(如 sudosu)而获得的有效根特权来执行某些任务。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)”)。然而,其它重要的系统管理任务,如改变网络设置、配置新鼠标、或挂载网络设备,没有管理权限就无法进行。因此,系统管理员必须决定网络上的用户可以拥有多少管理权限。

4.4.1. 允许根权限

如果机构内的用户是一组可信任的计算机能手,那么给他们根权限可能不是件坏事。给用户以根权限意味着一些类似添加设备或配置网络接口的小事情可以被个别用户处理,因此系统管理员就有时间处理网络安全和其它重要的任务。

但是从另一方面来说,给个别用户以根权限会导致以下问题:

4.4.2. 禁止根存取权限

如果管理员因为这些原因或其它原因对于允许用户登录为根用户感到不太合适,他们就应该把根口令保密,并且通过使用口令保护引导装载程序(详情请参阅第 4.2.2 节)来禁止进入运行级别1或单用户模式。

表 4-1显示了管理员可以进一步保证根登录被禁止的方法:

方法描述影响不影响
改变根 shell。编辑 /etc/passwd 文件,然后把 shell 从 /bin/bash 改成 /sbin/nologin

阻止进入根 shell 并记录所有进入企图。
以下程序会被阻止进入根帐号:
login
gdm
kdm
xdm
su
ssh
scp
sftp

不需要 shell 的程序,如 FTP 客户、邮件客户以及许多 setuid 程序。
以下程序会被阻止进入根帐号:
sudo
� FTP 客户
� 电子邮件客户

禁止通过任何控制台设备(tty)来获得根权限。一个空的 /etc/securetty 文件会防止到任何连接在计算机上的设备登录为根用户。

防止通过控制台或网络来进入根帐号。以下程序被禁止用来进入根帐号:
login
gdm
kdm
xdm
� 其它打开 tty 的网络服务

不以根用户身份登录,却通过 setuid 或其它机制来执行管理性任务。
以下程序不会被禁止进入根帐号:
su
sudo
ssh
scp
sftp

禁用根的 SSH 登录。编辑 /etc/ssh/sshd_config 文件,把 PermitRootLogin 参数设置为 no

防止通过 OpenSSH 工具套件来获得根权限。以下程序会禁止进入根帐号::
ssh
scp
sftp

这只会阻止根帐号对 OpenSSH 工具套件的使用。

使用 PAM 来限制根用户对服务的存取权限。编辑 /etc/pam.d/ 目录中的目标服务的文件。请确定验证需要 pam_listfile.so。详情请参阅第 4.4.2.4 节

防止到识别 PAM 的网络服务的根使用权限。
以下服务不能进入根帐号:
� FTP 客户
� 电子邮件客户
login
gdm
kdm
xdm
ssh
scp
sftp
� 任何识别 PAM 的服务

不识别 PAM 的程序和服务。

表 4-1. 禁用根帐号的方法

4.4.2.1. 禁用根 Shell

要防止用户直接登录为根用户,系统管理员可以在 /etc/passwd 文件中把根帐号的 shell 设置为 /sbin/nologin。这会阻止需要 shell 的命令,如 sussh 等直接进入根帐号。

重要重要
 

不需要使用 shell 的程序,如电子邮件客户或 sudo 命令,仍旧能够进入根帐号。

4.4.2.2. 禁用根登录

要进一步限制对根帐号的使用权限,管理员可以通过编辑 /etc/securetty 文件来禁用控制台的根登录。该文件列举了所有根用户被允许登录的设备。如果该文件不存在,根用户就能通过系统上的各类通信设备,不管是控制台还是原始网络接口,来登录。这种情况很危险,因为用户可以以根用户身份使用 Telnet 来登录,在网络中明文传送根口令。按照默认设置,红帽企业 Linux 的 /etc/securetty 文件只允许根用户在和机器物理相连的控制台上登录。要阻止根用户登录,键入以下命令来清除该文件的内容:

echo > /etc/securetty

警告警告
 

一个空白的 /etc/securetty 文件不会防止根用户使用 OpenSSH 工具套件来远程登录,因为控制台在验证之前不会被打开。

4.4.2.3. 禁用根的 SSH 登录

要防止根用户通过 SSH 协议登录,编辑 SSH 守护进程的配置文件(/etc/ssh/sshd_config)。把以下一行:

# PermitRootLogin yes

改成:

 
PermitRootLogin no

4.4.2.4. 使用 PAM 禁用根权限

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)”这一章。

4.4.3. 限制根存取权限

与其完全否定对根帐号的使用,管理员可能只想通过 setuid 程序如 susudo 等来允许对其的使用。

4.4.3.1. su 命令

键入 su 命令后,用户会被提示输入根口令,经验证后,他就会得到一个根 shell 提示。

通过 su 命令登录后,用户就成为根用户,并且对系统有绝对的管理权。此外,一旦用户成为根用户,他还可以使用 su 命令来变成系统上的另一个用户而不必输入口令。

因为该程序非常强大,机构内的管理员可能想限制能够使用这个命令的人员。

最简单的方法是把用户添加到一个叫做 wheel 的特殊管理组群。要这么做,以根用户身份键入以下命令:

usermod -G wheel <username>

在前面的命令中,把 <username> 替换成被添加到 wheel 组群中的用户名。

要为这个目的使用用户管理器,点击面板上的「主菜单」=> 「系统设置」 => 「用户和组群」,或在 shell 提示下键入 redhat-config-users 命令。选择「用户」活页标签,从用户列表中选择该用户,然后点击按钮菜单上的「属性」(或从拉下菜单中选择「文件」=> 「属性」)。

然后选择「组群」活页标签,点击 wheel 组群,如图 4-2所示。

图 4-2. 「组群」面板

下一步,在文本编辑器中打开 su/etc/pam.d/su)的 PAM 配置文件,删除以下行的注释符号 [#]

auth  required /lib/security/pam_wheel.so use_uid

这么做会只允许管理性组群 wheel 使用该程序。

注记注记
 

根用户是默认的 wheel 组群成员。

4.4.3.2. sudo 命令

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 的说明书页中有一个该文件选项的详细列表。