4.2. 控制 root 访问

当管理家庭机器时,该用户必须作为 root 用户或者使用 setuid 程序获得有效 root 特权,比如 sudo 或者 su 执行一些任务。setuid 程序是使用程序拥有者的用户 ID(UID)进行操作,而不是用户操作该程序。这样的程序可在详细列表的拥有者部分的 s 表示,如以下示例所示:
~]$ ls -l /bin/su
    -rwsr-xr-x. 1 root root 34904 Mar 10  2011 /bin/su

注意

s 可以是大写也可以是小写。如果是大写,则意味着还没有设定基本权限。
然而,对于机构的系统管理员而言,必须决定此机构的用户应有多大的管理访问权限访问机器。通常仅为 root 用户所能进行的一些操作,如重启和安装可移动媒体,通过一个名为 pam_console.so 的 PAM 模块,可允许首位登录物理控制台的用户进行操作。但是,其他重要的系统管理任务,如网络参数设置变更、新鼠标的参数配置、或网络设备的安装,这些都须有管理权限才能进行操作。因此,系统管理员必须决定用户应有多大的权限访问网络。

4.2.1. 不允许 root 访问

如果管理员因为总总理由认为允许用户作为 root 登录不妥,则不应当泄露 root 密码,且不允许通过引导装载程序密码保护进入运行级别 1 或单用户模式(有关此话题的更多信息,请参阅 <第 4.2.5 节 “引导装载程序的保护” >)。
以下有四种不同的方式能让管理员可进一步确保禁止 root 登录:
变更 root shell
要防止用户作为 root 用户直接登录,系统管理员可将 root 账户的 shell 参数设置到 /etc/passwd 文件下的 /sbin/nologin

表 4.2. 禁用 root shell

效果不影响
禁止访问 root shell 或将任何此类尝试载入日志。禁止以下程序访问 root 账户:
  • login
  • gdm
  • kdm
  • xdm
  • su
  • ssh
  • scp
  • sftp
有些程序无需 shell ,如文件传输协议( FTP ,File Transfer Protocol)客户端、邮件客户端和很多 setuid 程序。 禁止以下程序访问 root 账户:
  • sudo
  • FTP clients
  • Email clients
禁止通过任何控制台设备 (tty) 进行 root 访问
要进一步限制访问 root 账户,管理员可以通过编辑 /etc/securetty 文件在控制台禁止 root 登录。此文件列出了 root 用户允许登录的所有设备。如果此文件不存在,则 root 用户可以通过系统上任何通信设备进行登录,无论是通过控制台还是通过原始网络接口。这十分危险,因为用户可以作为 root 用户通过 Telnet 登录他们的机器,也就是通过网络在纯文本中进行密码传输。
在默认情况下,Red Hat Enterprise Linux 7 的 /etc/securetty 文件只允许 root 用户登录物理连接到机器的控制台。要防止 root 用户登录,则须作为 root 用户用 shell 提示符打出以下命令,删除此文件的内容:
echo > /etc/securetty
要使 securetty 能够支持 KDM、 GDM 和 XDM 登录管理器,则须添加以下命令行:
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
添加到以下列出的文件中:
  • /etc/pam.d/gdm
  • /etc/pam.d/gdm-autologin
  • /etc/pam.d/gdm-fingerprint
  • /etc/pam.d/gdm-password
  • /etc/pam.d/gdm-smartcard
  • /etc/pam.d/kdm
  • /etc/pam.d/kdm-np
  • /etc/pam.d/xdm

警告

空白的 /etc/securetty 文件“ ”能防止 root 用户远程使用 OpenSSH 工具套件登录,因为在认证前无法打开该控制台。

表 4.3. 禁用 root 登录

效果不影响
通过控制台或者网络防止对 root 账户的访问。防止以下程序访问 root 账户:
  • login
  • gdm
  • kdm
  • xdm
  • 可打开 tty 的其他网络服务
有些程序无需作为 root 用户登录,但可通过 setuid 或其他途径完成管理任务。 允许以下程序访问 root 账户:
  • su
  • sudo
  • ssh
  • scp
  • sftp
禁止 root SSH 登录
要防止 root 通过 SSH 协议登录,则须编辑 SSH 守护进程的配置文件 /etc/ssh/sshd_config,且变更以下命令行:
#PermitRootLogin yes
将其改为:
PermitRootLogin no

表 4.4. 禁止 Root SSH 登录

效果不影响
通过工具的 OpenSSH 套件防止 root 访问。防止以下程序访问 root 账户:
  • ssh
  • scp
  • sftp
有些程序并非 OpenSSH 工具套件的一部分。
使用 PAM 限制 root 访问服务
通过 /lib/security/pam_listfile.so 模块,PAM 在拒绝特定账户方面提供了极大的灵活性。管理员可用此模块来引用一份不允许登录的用户名单。要限制 root 访问系统服务,则须编辑在 /etc/pam.d/ 目录下的目标服务文件,且确保身份验证是需要使用 pam_listfile.so 模块。
The following is an example of how the module is used for the vsftpd FTP server in the /etc/pam.d/vsftpd PAM configuration file (the \ character at the end of the first line is not necessary if the directive is on a single line):
auth   required   /lib/security/pam_listfile.so   item=user \n          sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
这样可让 PAM 参考 /etc/vsftpd.ftpusers 文件,并让所有列出的用户拒绝访问该服务。管理员可更改这个文件的名称,且可为每个服务保存独立的列表,或者使用一中央列表拒绝访问多个服务。
如果管理员想要拒绝访问多个服务,可在 PAM 配置文件中添加类似的行,比如 /etc/pam.d/pop/etc/pam.d/imap 中为电子邮件客户端添加,在 /etc/pam.d/ssh 中为 SSH 客户端添加。
关于 PAM 的更多信息,请参阅 /usr/share/doc/pam-<version>/html/ 目录下的《 Linux-PAM 系统管理员指南 》。

表 4.5. 使用 PAM 来禁用 root

效果不影响
PAM 检测软件能够禁止 root 访问网络服务。禁止以下服务访问 root 账户:
  • login
  • gdm
  • kdm
  • xdm
  • ssh
  • scp
  • sftp
  • FTP clients
  • Email clients
  • 任何 PAM 检测服务
PAM 无法识别的程序和服务。

4.2.2. 允许 root 访问

如果机构中的用户是可信且具有计算机知识,那么允许他们有 root 访问就不是什么问题。根据用户允许 root 访问意味着个人用户可处理一些次要活动,比如添加设备或者配置网络接口,那么可让系统管理员处理网络安全和其它重要问题。
另一方面,个人用户有 root 访问可导致以下问题:
  • 机器错误配置 — 具有 root 访问的用户可错误配置其机器,并需要帮助方可解决问题。更有甚者他们可能在不知情的情况下开启安全漏洞。
  • 运行不安全的服务 — 有 root 访问的用户可能会在其机器中运行不安全的服务,比如 FTP 或者 Telnet,并可能让用户名和密码处于危险。这些服务可通过网络以纯文本传送这个信息。
  • 作为 root 运行电子邮件附件 — 对 Linux 有影响的病毒虽然少见,但确实存在。但只有在作为 root 用户运行它们时才有威胁。
  • 保持审计线索完整 — 因为 root 账户经常为多个用户所共享,如此一来就有多个系统管理员可以维持系统,所以就无法弄清在一固定时间内究竟是哪个用户是 root 用户。使用单独登录时,用户所登录的账户,以及用来表示会话跟踪目的的唯一值将被放入任务结构,而这是该用户启动的每一个程序的父类别。当使用并发登录时,唯一值就可以用于特定登录的跟踪行为。当一个行为引起了审计事件,那么就记录下登录账户以及与唯一值关联的会话。使用 aulast 命令可查看这些登录和会话。aulast 命令中的 --proof 选项可用于表示一个特定的 ausearch 查询,以便隔离由一个特定会话产生的可审计事件。关于审计系统的更多信息,请参阅< 第 5 章 系统审核>。

4.2.3. 限制 root 访问

管理员也许是希望允许只通过 setuid 程序进行访问,而不是完全拒绝访问 root 用户,例如 susudo。关于 susudo 的更多信息,请参阅《Red Hat Enterprise  Linux 7 系统管理员指南 》和 su(1)sudo(8) 的手册页。

4.2.4. 允许自动注销用户登录

当用户作为 root 登录时,无人看管的登录会话可能会造成重大的安全风险。要降低这种风险,您可以配置系统来实现在一段时间后自动注销空闲用户:
  1. 请确保 screen 工具包已安装。您可以作为 root 通过运行以下命令来实现:
    yum install screen
    关于如何在 Red Hat Enterprise Linux 7 安装工具包的更多信息,请参阅《Red Hat Enterprise  Linux 7 系统管理员指南》。
  2. 作为 root,在 /etc/profile 文件的开头添加以下命令行来确保此文件的进程不被中断:
    trap "" 1 2 3 15
  3. /etc/profile 文件的结尾添加以下命令行,以实现用户每次登录虚拟控制点或远程控制台就启动 screen 会话:
    SCREENEXEC="screen"
    if [ -w $(tty) ]; then
    trap "exec $SCREENEXEC" 1 2 3 15
    echo -n 'Starting session in 10 seconds'
    sleep 10
    exec $SCREENEXEC
    fi
    请注意,每当一个新的会话启动时,就会显示一条信息,用户则必须等待十秒。要调整启动会话前的等待时间,则须在 sleep 命令后改变数值:
  4. /etc/screenrc 配置文件中添加以下命令行,来实现在不活动周期后关闭 screen 会话:
    idle 120 quit autodetach off
    这将设置时间的限制为 120 秒。要调整这个限制时间,则须在 idle 指令后改变数值:
    或者您可以通过使用以下命令行来配置系统,以实现仅锁定会话:
    idle 120 lockscreen autodetach off
    这种方式将要求使用密码来解锁会话。
此变更将在下一次用户登录系统时生效。

4.2.5. 引导装载程序的保护

使用密码保护 Linux 引导装载程序的主要原因如下:
  1. 防止进入单用户模式 — 如果攻击者可将系统引导至单用户模式,他们就可以自动成为 root ,而不会被提示其输入 root 密码。

    警告

    不建议通过编辑 /etc/sysconfig/init 文件下的 SINGLE 参数,来实现禁止用密码访问单用户模式。 攻击者可以通过在 GRUB 2 的 kernel 命令行指定一个自定义的初始命令(使用 init= 参数)来跳过密码。如《Red Hat Enterprise Linux 7 系统管理员指南》所介绍,推荐使用密码保护 GRUB 2 引导装载程序。
  2. 禁止访问 GRUB 2 控制台 — 如果机器使用 GRUB 2 作为其引导装载程序,攻击者可使用 GRUB 2 编辑器界面来改变其配置,或使用 cat 命令来收集信息。
  3. 禁止访问不安全的操作系统 — 如果是双重引导系统,攻击者可以在启动时选择操作系统,例如 DOS ,这就可忽略访问控制和文件权限。
Red Hat Enterprise Linux 7 在 Intel 64 和 AMD 64 平台上使用 GRUB 2 引导装载程序。关于 GRUB 2 的详细资料,请参阅《Red Hat Enterprise  Linux 7 系统管理员指南》。

4.2.5.1.  不允许交互式启动

在启动顺序的开头按 I 键,可允许您交互式启动系统。在交互式启动中,系统会提示您逐一启动每项服务。然而,这可能会导致那些通过物理访问您系统的攻击者禁用安全相关的服务,以及获取访问系统的权限。
要防止用户交互式启动系统,则须作为 root 用户禁用 /etc/sysconfig/init 文件下的 PROMPT 参数:
PROMPT=no