第 4 章 用工具和服务强化您的系统

4.1. 计算机安全

密码是 Red Hat Enterprise Linux 7 用来确认用户身份的主要方法。这是为什么密码安全对保护用户、工作站以及网络是那么的重要。
出于安全目的,安装程序会对系统进行配置,从而可使用 安全哈希算法 512SHA512)和影子密码。强烈建议您不要更改这个设置。
如果在安装过程中取消选择影子密码,则所有密码都会以单向哈希的形式保存在可读的 /etc/passwd 文件中,这样就使得该系统在离线密码破解攻击面前变得很脆弱。如果入侵者可作为常规用户访问该机器,他就可以将 /etc/passwd 文件复制到他自己的机器中,并对其运行密码破解程序。如果该文件中存在不安全的密码,那么密码被破解只是时间问题。
影子密码可通过在 /etc/shadow 文件中保存密码哈希消除这种类型的攻击,该文件只能由 root 用户读取。
这就迫使潜在的攻击者要登录该机器中的远程服务(比如 SSH 或者FTP)进行远程密码破解。这种暴力破解速度会慢很多,并且会留下明显的痕迹,因为在系统文件中会出现几百条失败登录尝试。当然,如果攻击者在夜间对使用薄弱密码的系统进行攻击,那么他可能在黎明前就可获得访问权限,并修改日志文件以掩盖其踪迹。
除要考虑格式和存储外,内容也是要考虑的问题。用户如要保护其帐户不被破解,最重要的是创建强大的密码。

4.1.1. 密码安全

4.1.1.1. 创建强大的密码

要创建一个安全可靠的密码,用户须牢记长密码比短而复杂的密码强。创建一个仅有八个字符的密码,就算它含有数字、特殊符号和大写字母,这也不是个好主意。优化密码破解工具,例如约翰开膛手(John The Ripper),以便破解连人也难以记住的密码。
在信息论中,熵 (entropy) 表示的是不确定性的量度,与随机变量有关,并以“位”为单位来表现信息量度。熵值越高,密码就越安全。根据美国国家标准与技术研究院(National Institute of Standards and Technology, NIST)特别出版物 <电子认证指南>(NIST SP 800-63-1,Electronic Authentication Guideline),在一本收录 5 万个常用密码的字典里,某一密码没有出现过的熵值应该至少有 10 位。这样说来,一个由 4 个随机字组成的密码,其熵值大约有 40 位。一个由多个字组成的密码,旨在增强安全性,也被称为“密码短语”,例如:
randomword1 randomword2 randomword3 randomword4
如果系统强制要求使用大写字母、数字或特殊符号,那么采用上述建议的密码短语可以轻易地被修改,例如修改第一个字符为大写字母,在末尾增添 "1!"。要注意这样的修改 并不能 显著地增强密码短语的安全性。
创建密码的另一种方法是使用密码生成器。pwmake 是一个命令行程序,用于生成随机密码,可由四种字符 –组成:大写字母、小写字母、数字和特殊符号。其功能让您能够详细了解用于生成密码的具体熵值。而熵值产生于 /dev/urandom。这项功能让您能 指定最小熵值为 56 位,这对于不常出现暴力破解的系统和服务密码,这个熵值已足够。对于攻击者无法直接访问哈希密码文件的运用程序, 64 位就足以适用于此类运用程序。当攻击者可能获取直接访问哈希密码的权限,或密码被用作加密钥匙时,对于此类情况应使用 80 到 128 位。如果您无法明确指定一个具体的熵值,pwmake 将会使用默认值。创建一个 128 位的密码,则要运行下列命令:
pwmake 128
虽然有不同的方法可以创建一个安全可靠的密码,但都要避免以下不明智的做法:
  • 使用字典里的单词,外语单词,逆序单词,或仅使用数字。
  • 使用少于 10 字符的密码或密码短语。
  • 使用键盘布局的系列键。
  • 写下您的密码。
  • 在密码中使用个人信息,如出生日期、周年纪念日、家庭成员姓名、或宠物名字。
  • 在不同的机器上使用相同的密码短语或密码。
虽然创建密码非常重要,但合理地管理密码,特别是对于大型机构中的系统管理员而言,这也同样重要。下面的小节详细介绍了在机构中如何很好地创建并管理用户密码。

4.1.1.2. 强制使用强大的密码

如果一所机构拥有大量的用户,那么系统管理员有两个基本选择可用于强制使用强大的密码。他们可以为用户创建密码,或是他们可以让用户创建他们自己的密码,同时验证密码是否拥有足够的强度。
为用户创建密码,就要确保这个密码是好密码。但随着机构的发展,这变成了一项艰巨的任务。这也增加了用户的风险,由于他们要写下他们的密码,因而这就暴露了密码。
基于这些原因,大多数系统管理员更喜欢让用户创建自己的密码,但积极地验证这些密码是否足够强大。在某些情况下,管理员可能会强制用户定期更改密码,防止密码过期。
当用户被要求创建或更改密码时,可以使用 passwd 命令行实用程序,这就是PAM-检测软件 ( 可插入验证模块(Pluggable Authentication Modules)) ,可检查密码是否过短或是否容易被破解。这个检查过程是由 pam_pwquality.so PAM 模块执行的。

注意

红帽企业版 Linux 7 中, pam_pwquality PAM 模块取代了 pam_cracklib,这原先用于红帽企业版 Linux 6 作为密码质量检测的默认模块。它与 pam_cracklib 使用相同的后端。
pam_pwquality 模块是根据一系列规则,用于检查密码的强度。其程序有两个步骤:首先,它检查所提供的密码是否能在字典中找到。如果不能,它将继续进行另外一些额外检查。pam_pwquality 与 其他 PAM 模块一起堆叠在/etc/pam.d/passwd 文件下的 密码 部分。而自定义规则将在 /etc/security/pwquality.conf 配置文件中具体说明。至于这些检查步骤的完整列表,请参阅 pwquality.conf (8) 手册页。

例 4.1. 在 pwquality.conf 中密码强度检查的参数配置

为了能够使用 pam_quality ,须在/etc/pam.d/passwd 文件下的 password 堆叠中添加以下命令行:
password    required    pam_pwquality.so retry=3
选择这些检查步骤有明确的要求,要每行一项。例如,要求一个密码的长度至少有8个字符,包含全部四种字符,则须添加以下命令行到/etc/security/pwquality.conf 文档:
minlen=8 
minclass=4
要设置一个密码强度检查以检测是否有连续或重复的字符,则须在 /etc/security/pwquality.conf 中添加以下命令行:
maxsequence=3 
maxrepeat=3
在本例中,输入的密码不能够含有超过 3 个连续字符,如“abcd” 或“1234”。此外,完全相同的连续字符也不能超过 3 个。

注意

由于root 用户是施行密码创建规则的人,尽管有出现警告消息,他也能够为自己或普通用户设置任何密码。

4.1.1.3. 密码有效期的参数配置

密码有效期是另一个系统管理员用来保护在机构中防止不良密码的技术。密码有效期的意思就是在指定时段后(通常为 90 天),会提示用户创建新密码。它的理论基础是如果强制用户周期性修改其密码,那么破解的密码对与入侵者来说只在有限的时间内有用。密码有效期的负面影响是用户可能需要写下这些密码。
在 Red Hat Enterprise Linux 7 中有两个用来指定密码有效期的主要程序:chage 命令或者图形 用户管理者system-config-users)应用程序。

重要

在红帽企业版 Linux 7 中,影子口令是默认启用的。更多信息,请参阅 《红帽企业版  Linux 7 系统管理员指南》。
chage 命令的 -M 选项指定该密码有效的最长天数。例如:要将用户的密码设定为 90 天内有效,请执行以下命令:
chage -M 90 <username>
在上面的命令中使用用户名称替换 <username>。要禁用密码过期功能,通常在 -M 选项后使用值 99999(这相当于 273 年多一点)。
关于 chage 命令的可使用选项的更多信息,请参阅下表。

表 4.1. chage 命令行选项

选项描述
--hesiodlhs=<lhs>指定了从 1970 年 1 月 1 日密码更改后的天数
--hesiodlhs=<lhs>指定帐户被锁的日期,以年-月-日的格式出现。除了使用日期,还可以使用从 1970 年 1 月 1 日以来的天数。
--hesiodlhs=<lhs>指定了在密码过期后,但在锁住帐户前的非活跃天数。如果数值是 0,密码过期后帐户不会被锁住。
-l列出当前账户的过期设置参数。
--hesiodlhs=<lhs>指定了用户必须修改密码的最小天数间隔。如果数值为 0,则密码未到期。
--hesiodlhs=<lhs>指定了有效密码的最大天数。当此选项指定的天数加上 -d 选项指定的天数未到当前日期,用户必须在使用账户前修改密码。
--hesiodlhs=<lhs>指定在密码到期日期之前对用户发出警告的天数。
您还可以使用 chage 命令以互动形式修改多个密码过期功能以及帐户信息。请使用以下命令进入互动模式:
chage <username>
以下是使用这个命令的示例互动会话:
~]# chage juan
Changing the aging information for juan
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 10
Maximum Password Age [99999]: 90
Last Password Change (YYYY-MM-DD) [2006-08-18]:
Password Expiration Warning [7]:
Password Inactive [-1]:
Account Expiration Date (YYYY-MM-DD) [1969-12-31]:
您可以在用户首次登录时,对密码进行参数配置,使密码过期。这就可迫使用户及时修改密码。
  1. 设置初始密码。有两种常用的方法可实现这个步骤:您可以指定默认的密码,或使用空密码。
    要指定默认的密码,则须作为 root 用户使用 shell 提示符打出下列信息 :
    passwd username
    或者,您可以分配一个空值密码,而不要一个原始密码。如果想要这样进行的话,请使用以下命令:
    passwd -d username

    警告

    尽管使用空密码十分便利,却是极不安全的做法。因为任何第三方都可以先行登录,使用这个不安全的用户名进入系统。可能的话,请避免使用空密码。如果无法不使用的话,请一定要确保用户在未用空密码锁定账户前登录。
  2. 要迫使密码即刻到期,则须作为 root 用户运行以下命令:
    chage -d 0 username
    这个命令会将密码上次作出改动的日期设定为(1970 年 1 月 1 日)这个时间。这样,无论有什么密码到期政策,它都会迫使密码作出即时到期这一行动。
在用户 初次登录时,则立即会提示输入新密码。
您还可以使用图形 用户管理者 程序创建密码过期策略,如下。请注意:您需要管理员特权执行这个过程。
  1. 请点击面板中的 系统 菜单,指向 管理 并点击 用户和组群 显示用户管理器。您还可在 shell 提示符后输入命令 system-config-users
  2. 请点击 用户 标签,并选择用户列表中需要的用户。
  3. 请点击工具栏中的 首选项显示用户属性对话框(或者选择文件菜单中的首选项)。
  4. 点击 密码信息 标签,并选择 启用密码过期 单选框。
  5. 多少天前需要更改 字段输入所需值,并点击 确定

4.1.2. 锁定未激活的用户账户

4.1.3. 登录尝试失败后锁定用户账户

在红帽企业版 Linux 6 中, pam_faillock PAM 模块允许系统管理员锁定在指定次数内登录尝试失败的用户账户。限制用户登录尝试的次数主要是作为一个安全措施,旨在防止可能针对获取用户的账户密码的暴力破解。
通过 pam_faillock 模块,将登录尝试失败的数据储存在 /var/run/faillock 目录下每位用户的独立文件中。

注意

在登录尝试失败的文件中,命令行的顺序很重要。在此顺序中有任何改变都会导致所有用户账户的锁定。当使用了 even_deny_root 选项,也会导致 root 用户账户的锁定。
根据这些步骤对账户锁定进行参数配置:
  1. 要实现在三次失败尝试后,对任何非 root 用户进行锁定,并在十分钟后对该用户解锁,则须添加以下命令行到 /etc/pam.d/system-auth 文件和/etc/pam.d/password-auth 文件中的 auth 区段:
    auth        required       pam_faillock.so preauth silent audit deny=3 unlock_time=600
    auth        sufficient     pam_unix.so nullok try_first_pass
    auth        [default=die]  pam_faillock.so authfail audit deny=3 unlock_time=600
    
  2. 在前一步骤指定的两个文件中的 account 区段中添加以下命令行:
    account     required      pam_faillock.so
    
  3. 要让账户锁定也适用于 root 用户,则须在 /etc/pam.d/system-auth 文件和 /etc/pam.d/password-auth 文件中的pam_faillock 条目里添加 even_deny_root 选项:
    auth        required      pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=600
    auth        sufficient    pam_unix.so nullok try_first_pass
    auth        [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=600
    auth        sufficient    pam_faillock.so authsucc audit deny=3 even_deny_root unlock_time=600
    
用户 john 在前三次登录失败后,尝试第四次登录时,他的账户在第四次尝试中被锁定:
[yruseva@localhost ~]$ su - john
Account locked due to 3 failed logins
su: incorrect password
要让一个用户即使在数次登录失败之后,其账户仍未被锁定,则须在 /etc/pam.d/system-auth/etc/pam.d/password-auth 中的 "first call of" pam_faillock 之前添加以下命令行。也可以用user1, user2, user3 代替实际用户名。
auth [success=1 default=ignore] pam_succeed_if.so user in user1:user2:user3
要查看每个用户的尝试失败次数,则须作为 root 用户运行以下命令行:
[root@localhost ~]# faillock
john:
When                Type  Source                                           Valid
2013-03-05 11:44:14 TTY   pts/0                                                V
要解锁一个用户的账户,则须作为 root 用户运行以下命令行:
faillock --user <username> --reset
当使用 authconfig 功能对验证配置参数进行修改时, authconfig 功能的设置参数会覆盖 system-auth 文件和 password-auth 文件。要同时使用配置文件和authconfig ,您必须使用以下步骤对账户锁定进行参数配置:
  1. 创建以下符号链接:
    ~]# ln -s /etc/pam.d/system-auth /etc/pam.d/system-auth-local
    ~]# ln -s /etc/pam.d/password-auth /etc/pam.d/password-auth-local
  2. /etc/pam.d/system-auth-local 文件应含有以下命令行:
    auth        required       pam_faillock.so preauth silent audit deny=3 unlock_time=600 include system-auth-ac
    auth        [default=die]  pam_faillock.so authfail silent audit deny=3 unlock_time=600
    
    account     required       pam_faillock.so
    account     include        system-auth-ac
    
    password    include        system-auth-ac
    
    session     include        system-auth-ac
    
  3. /etc/pam.d/password-auth-local 文件应含有以下命令行:
    auth        required       pam_faillock.so preauth silent audit deny=3 unlock_time=600 include password-auth-ac
    auth        [default=die]  pam_faillock.so authfail silent audit deny=3 unlock_time=600
    
    account     required       pam_faillock.so
    account     include        password-auth-ac
    
    password    include        system-auth-ac
    
    session     include        system-auth-ac
    
关于 pam_faillock 不同配置选项的更多信息,请参阅 pam_faillock(8) 手册页。

4.1.4. 会话锁定

在每天的操作中,用户可能会因一些原因需离开他们的工作站,使得工作站无人值守。这可能会让攻击者有物理访问机器的机会,尤其在物理安全措施不完备的情况下(参阅第 1.2.1 节 “物理控制”)。这个问题在笔记本电脑中尤为突出,因为它们的便携性影响了其物理安全。您可以通过利用会话锁定来减少这些风险。会话锁定的特征就是除非输入了正确的密码,否则禁止访问系统。

注意

锁定屏幕,而不是进行注销,这一做法的主要优势是允许用户进程(例如文件传输)持续进行。而注销则会停止这些进程。

4.1.4.1. 使用 vlock 锁定虚拟控制台

用户可能也需要锁定虚拟控制台。这可以通过使用一个名为 vlock 实用程序来实现。要安装这个实用程序,则须作为 root 用户执行以下命令:
~]# yum install vlock
安装之后,可以通过使用 vlock 命令,无需其他任何参数,对任何控制台会话进行锁定。这能够在锁定当前活动的虚拟控制台会话的同时,仍允许访问其他虚拟控制台。要禁止访问工作站所有的虚拟控制台,则须执行以下命令:
vlock -a
在本例中, vlock 锁定了当前活动的控制台,而 -a 选项则是防止切换到其他虚拟控制台。
其他信息请参阅 vlock(1) 手册页。

重要

那些与 vlock 版本有关的问题仍存在于当前的 Red Hat Enterprise Linux 7 。
  • 这个程序目前不允许通过使用 root 密码对控制台进行解锁。其他信息可见 BZ#895066
  • 锁定控制台并不能清除滚动控制台屏幕缓冲区,但允许任何人物理访问工作台,查看原先在控制台上发出的命令和任何所显示的输出内容。更多信息请参阅 BZ#807369