Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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

4.1. 桌面安全性

Red Hat Enterprise Linux 7 提供了多种方法来强化桌面免受攻击,并防止未经授权的访问。这部分论述了用户密码、会话和帐户锁定以及可移动介质的安全处理的建议实践。

4.1.1. 密码安全性

密码是 Red Hat Enterprise Linux 7 用于验证用户身份的主要方法。这就是为什么密码安全性如此重要,对保护用户、工作站和网络至关重要。
为安全起见,安装程序会将系统配置为使用 安全哈希算法 512 (SHA512 )和影子密码。强烈建议您不要更改这些设置。
如果在安装过程中取消选择影子密码,则所有密码都以单向哈希形式存储在全局可读的 /etc/passwd 文件中,这样会使系统容易受到离线密码攻击。如果入侵者能够以普通用户身份获取对计算机的访问权限,他可将 /etc/passwd 文件复制到自己的计算机上,并对其运行任意数量的密码阻止程序。如果文件中有不安全的密码,则只需要在密码破解程序发现它之前的时间。
影子密码通过将密码哈希存储在文件 /etc/shadow 中消除此类攻击,这只对 root 用户可读。
这会强制潜在的攻击者通过登录到机器上的网络服务(如 SSH 或 FTP)来远程破解密码。此类 brute-force 攻击非常慢,因为数百个失败的登录尝试会写入系统文件。当然,如果攻击者在带有弱密码的系统上在夜中启动攻击,则攻击者可能会在 dawn 前获得访问权限,并编辑日志文件以覆盖其跟踪。
除了格式和存储注意事项外,还需要考虑内容。用户可以防止其帐户遭受攻击的单个最重要的事情是创建一个强大的密码。
注意
红帽建议使用中央身份验证解决方案,如 Red Hat Identity Management (IdM)。首选使用中央解决方案使用本地密码。详情请查看:

4.1.1.1. 创建强密码

在创建安全密码时,用户必须记住长的密码比短和复杂的密码更强。创建仅有 8 个字符的密码是个好主意,即使它包含数字、特殊字符和大写字母。密码破解工具(如 John The Ripper)针对破坏此类密码进行了优化,这也很难记住。
在信息理论中,熵是与随机变量关联的不确定性级别,以位为单位。熵值越大,保护密码越高。根据 NIST SP 800-63-1,在字典中没有包括 50000 的密码,通常选择的密码应至少有 10 位熵。因此,由四个随机单词组成的密码包含大约 40 位熵。包含用于添加安全性的多个词语的长密码也称为 密码短语,例如:
randomword1 randomword2 randomword3 randomword4
如果系统强制使用大写字母、数字或特殊字符,则遵循上述建议的密码短语可以以简单方式修改,例如,将第一个字符更改为大写并附加 "1!"。请注意,此类修改 不会 显著增加密码短语的安全性。
另一种创建密码的方式是使用密码生成器。pwmake 是一个命令行工具,用于生成由所有四个字符组成的随机密码 - 大写、小写、数字和特殊字符。实用程序允许您指定用于生成密码的熵位数。熵从 /dev/urandom 拉取。您可以指定的最小位数为 56,它足以用于系统和服务的密码,其中 brute 强制攻击非常罕见。64 位对于攻击者无法直接访问密码哈希文件的应用程序来说是足够的。对于攻击者可能会获得对密码哈希的直接访问或者密码用作加密密钥的情况,应使用 80 到 128 位。如果您指定了无效数量的熵位,pwmake 将使用默认位。要创建 128 位的密码,请输入以下命令:
pwmake 128
虽然创建安全密码的方法不同,但总是避免以下错误的实践:
  • 使用单个字典词语,一个外部语言中的词语、一个 inverted 字词或仅数字。
  • 使用少于 10 个字符的密码或密码短语。
  • 使用键盘布局中的一系列键。
  • 写出您的密码。
  • 在密码中使用个人信息,如过期日期、年金、家庭成员名称或片断名称。
  • 在多台机器上使用相同的密码短语或密码。
虽然创建安全密码是必然的,但正确管理它们也很重要,特别是大型组织内的系统管理员。以下部分详细介绍了在组织内创建和管理用户密码的良好做法。

4.1.1.2. 强制密码

如果组织有大量用户,系统管理员可以有两个基本选项来强制使用强密码。它们可以为用户创建密码,或者允许用户在验证密码时创建自己的密码。
为用户创建密码可确保密码正常,但随着组织不断增长,它就成为了任务。它还会增加用户停用密码的风险,从而公开密码。
因此,大多数系统管理员更喜欢用户创建自己的密码,但主动验证这些密码是否足够强大。在某些情况下,管理员可能会强制用户在密码过期时定期更改密码。
当要求用户创建或更改密码时,他们可以使用 passwd 命令行工具,该实用程序为 PAM- 感知(可插拔验证模块),并检查密码是否太短,或者易于破解。此检查由 pam_pwquality.so PAM 模块执行。
注意
在 Red Hat Enterprise Linux 7 中,pam_pwquality PAM 模块替换了 pam_cracklib,它在 Red Hat Enterprise Linux 6 中使用它作为密码质量检查的默认模块。它使用与 pam_cracklib 相同的后端。
pam_pwquality 模块用于检查密码对一组规则的强度。其流程由两个步骤组成:首先它检查在字典中是否找到提供的密码。如果没有,它会继续执行很多额外的检查。pam_pwquality/etc/pam.d/passwd 文件 的密码 组件中的其他 PAM 模块一同堆叠,在 /etc/security/pwquality.conf 配置文件中指定自定义规则集。有关这些检查的完整列表,请查看 pwquality.conf (8) 手册页。

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

要使用 pam_quality 启用,请将以下行添加到 /etc/pam.d/passwd 文件中的 密码 堆栈中:
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,以及 3 个相同的连续字符,如 1111
注意
由于 root 用户是强制创建密码的规则,他们可以为自己或普通用户设置任何密码,尽管警告消息也是如此。

4.1.1.3. 配置密码过期

密码过期是系统管理员用于防御机构中损坏的密码的另一种技术。密码过期意味着在指定周期(通常为 90 天)后,系统将提示用户创建新密码。这样做的理论是,如果用户强制定期更改其密码,则攻击者密码只对有限时间的入侵者有用。但是,在密码过期之外,用户更有可能将其密码写出。
要在 Red Hat Enterprise Linux 7 下指定密码过期,请使用age 命令。
重要
在 Red Hat Enterprise Linux 7 中,默认启用影子密码。如需更多信息,请参阅 Red Hat Enterprise Linux 7 系统管理员指南
concurrency 命令的 - M 选项指定密码有效的最大天数。例如,要将用户的密码设置为在 90 天后过期,请使用以下命令:
chage -M 90 username
在上述命令中,使用用户名替换 username。要禁用密码过期,请在 -M 选项后使用 -1
有关可用选项的更多信息 请参阅下表。

表 4.1. age 命令行选项

选项 描述
-d days 指定 1970 年 1 月 1 日之后的天数,密码已改变。
-E date 指定帐户被锁定的日期,格式为 YYYY-MM-DD。也可以使用 1970 年 1 月 1 日之后的天数。
-I days 指定在锁定帐户前密码过期的非活动天数。如果值为 0,则帐户在密码过期后不会被锁定。
-l 列出当前帐户过期设置。
-m days 指定用户必须更改密码的最小天数。如果值为 0, 则密码不会过期。
-M days 指定密码有效的最大天数。当此选项指定的天数加上 -d 选项指定的天数小于当前日期的天数时,用户必须先更改密码。
-W days 指定密码到期日期前的天数,以警告用户。
您也可以在交互模式中使用 interaction 命令修改多个密码过期和帐户详细信息。使用以下命令进入交互模式:
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 实用程序具有设置 null 密码的选项。使用 null 密码是非常方便的做法,因为任何第三方都可以使用不安全的用户名登录并访问系统。尽可能避免使用 null 密码。如果无法实现,请始终确保用户已准备好登录,然后再使用 null 密码解锁帐户。
  2. root 用户身份运行以下命令来强制立即密码过期:
    chage -d 0 username
    此命令设置密码上次更改为 epoch (January 1, 1970)的日期的值。这个值会强制立即过期密码过期策略(如果有的话)。
在初始登录时,用户现在会提示您输入新密码。

4.1.2. 帐户锁定

在 Red Hat Enterprise Linux 7 中,pam_faillock PAM 模块允许系统管理员在指定次数尝试失败后锁定用户帐户。限制用户登录尝试主要作为安全措施,旨在防止针对获取用户帐户密码的可能的暴力攻击。
使用 pam_faillock 模块时,失败的登录尝试存储在 /var/run/faillock 目录中每个用户的独立文件中。
注意
失败的尝试日志文件中的行顺序非常重要。这个顺序的任何更改都可以锁定所有用户帐户,包括在使用 even_deny_ root 选项时包括 root 用户帐户。
按照以下步骤配置帐户锁定:
  1. 要在 3 次失败后锁定任何非 root 用户,并在 10 分钟后解锁该用户,请将两行添加到 / etc/pam.d/system- auth/ etc/pam.d/password-auth 文件的 auth 部分。编辑后,两个文件中的整个 auth 部分都应该类似如下:
    auth        required      pam_env.so
    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
    auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
    auth        required      pam_deny.so
    添加了行号 2 和 4。
  2. 在上一步中指定的两个文件的 account 部分添加以下行:
    account     required      pam_faillock.so
  3. 要对 root 用户应用帐户锁定,请将 even_deny_root 选项添加到 /etc/pam.d/system-auth/etc/pam.d/password-auth 文件中的 pam_faillock 条目:
    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
    
    account     required      pam_faillock.so
当用户 john 在之前登录三次后尝试登录时,其帐户会在第四个尝试时被锁定:
~]$ su - john
Account locked due to 3 failed logins
su: incorrect password
要防止系统在多次登录失败后锁定用户,请在行的上面添加以下行:在 /etc/pam.d/system-auth/etc/pam.d/password-auth 中首次调用 pam_faillock。另外,将 user1user2user3 替换为实际用户名。
auth [success=1 default=ignore] pam_succeed_if.so user in user1:user2:user3
要查看每个用户失败的尝试次数,请以 root 用户身份运行 :
~]$ faillock
john:
When                Type  Source                                           Valid
2013-03-05 11:44:14 TTY   pts/0                                                V
要解锁用户帐户,请以 root 用户身份运行:
faillock --user <username> --reset
重要
运行 cron 作业会重置该用户的 pam_faillock 的故障计数器,因此不应为 cron 配置 pam_faillock。如需更多信息,请参阅 知识库支持(KCS)解决方案

使用 authconfig 保留自定义设置

当使用 authconfig 工具修改身份验证配置时,system-authpassword-auth 文件会被 authconfig 工具中的设置覆盖。这可以通过创建符号链接来代替配置文件,authconfig 识别且不会被覆盖。要在配置文件和 authconfig 中同时使用自定义设置,请按照以下步骤配置帐户锁定:
  1. 检查 system-authpassword-auth 文件是否已指向 system-auth-acpassword-auth-ac (这是系统默认设置):
    ~]# ls -l /etc/pam.d/{password,system}-auth
    如果输出类似如下,符号链接就就位,您可以跳过到第 3 步:
    lrwxrwxrwx. 1 root root 16 24. Feb 09.29 /etc/pam.d/password-auth -> password-auth-ac
    lrwxrwxrwx. 1 root root 28 24. Feb 09.29 /etc/pam.d/system-auth -> system-auth-ac
    如果 system-authpassword-auth 文件不是符号链接,请继续下一步。
  2. 重命名配置文件:
    ~]# mv /etc/pam.d/system-auth /etc/pam.d/system-auth-ac
    ~]# mv /etc/pam.d/password-auth /etc/pam.d/password-auth-ac
  3. 使用自定义设置创建配置文件:
    ~]# vi /etc/pam.d/system-auth-local
    /etc/pam.d/system-auth-local 文件应包含以下行:
    auth        required       pam_faillock.so preauth silent audit deny=3 unlock_time=600
    auth        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
    ~]# vi /etc/pam.d/password-auth-local
    /etc/pam.d/password-auth-local 文件应包含以下行:
    auth        required       pam_faillock.so preauth silent audit deny=3 unlock_time=600
    auth        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        password-auth-ac
    
    session     include        password-auth-ac
  4. 创建以下符号链接:
    ~]# ln -sf /etc/pam.d/system-auth-local /etc/pam.d/system-auth
    ~]# ln -sf /etc/pam.d/password-auth-local /etc/pam.d/password-auth
有关各种 pam_faillock 配置选项的更多信息,请参阅 pam_faillock(8) 手册页。

删除 nullok 选项

如果 /etc/shadow 文件中的 password 字段为空,则 nullok 选项允许用户使用空白密码登录。要禁用 nullok 选项,请从 /etc/pam.d/ 目录中的配置文件中删除 nullok 字符串,如 /etc/pam.d/system-auth/etc/pam.d/password-auth
请参阅 nullok 选项,允许用户在不输入密码的情况下登录?KCS 解决方案以了解更多信息。

4.1.3. 会话锁定

用户可能需要因为日常操作过程中有很多原因而使其工作站无人值守。这可能会给攻击者物理访问机器提供了机会,特别是在物理安全措施不足的环境中(请参阅 第 1.2.1 节 “物理控制”)。笔记本电脑特别公开,因为其移动性会干扰物理安全性。您可以使用会话锁定功能来缓解这些风险,这些功能会阻止访问系统,直到输入正确的密码为止。
注意
锁定屏幕而不是注销的主要优点是,锁允许用户的进程(如文件传输)继续运行。注销将停止这些进程。

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

要锁定虚拟控制台,请使用 vlock 工具。以 root 身份输入以下命令安装它:
~]# yum install kbd
安装后,您可以使用 vlock 命令锁定任何控制台会话,而无需附加参数。这会锁定当前活动的虚拟控制台会话,同时仍然允许访问其他控制台。要防止访问工作站上的所有虚拟控制台,请执行以下操作:
vlock -a
在这种情况下,vlock 会锁定当前活跃的控制台,而 -a 选项会阻止切换到其他虚拟控制台。
详情请查看 vlock (1) 手册页。

4.1.4. 强制只读挂载 Removable Media

要强制对可移动介质进行只读挂载(如 USB 闪存磁盘),管理员可以使用 udev 规则来检测可移动介质,并使用 blockdev 工具将它们配置为只读挂载。这足以强制物理介质的只读挂载。

使用 blockdev 强制只读挂载 Removable Media

要强制以只读方式挂载所有可移动介质,请在 /etc/ udev /rules.d/ 目录中创建一个名为 的 udev 配置文件,例如: 80-readonly-removables.rules:
SUBSYSTEM=="block",ATTRS{removable}=="1",RUN{program}="/sbin/blockdev --setro %N"
以上 udev 规则确保所有新连接的可移动块(存储)设备都使用 blockdev 工具自动配置为只读。

应用新的 udev 设置

要使这些设置生效,需要应用新的 udev 规则。udev 服务自动检测对其配置文件的更改,但新设置不会应用到已存在的设备。只有新连接的设备会受到新设置的影响。因此,您需要卸载并拔出所有连接的可移动介质,以确保在下一次插入时将新设置应用到它们。
要强制 udev 将所有规则重新应用到已存在的设备,请以 root 用户身份输入以下命令:
~# udevadm trigger
请注意,强制 udev 使用上述命令重新应用所有规则不会影响任何已经挂载的存储设备。
要强制 udev 重新加载所有规则(出于某种原因不会自动检测到新规则),请使用以下命令:
~# udevadm control --reload