Red Hat Training

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

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

4.1. 桌面安全

红帽企业 Linux 7 提供了多种方法来强化桌面免受攻击和防止未经授权的访问。本节论述了有关用户密码、会话和帐户锁定以及可移动介质安全处理的建议做法。

4.1.1. 密码安全性

密码是 Red Hat Enterprise Linux 7 用于验证用户身份的主要方法。这就是密码安全性对于保护用户、工作站和网络非常重要的原因。
出于安全考虑,安装程序将系统配置为使用安全哈希算法 512(SHA512 )和影子密码。强烈建议您不要更改这些设置。
如果在安装期间取消选择影子密码,则所有密码都作为单向哈希存储在全局可读的 /etc/passwd 文件中,这使得系统易受离线密码破解攻击。如果入侵者能够以普通用户身份访问计算机,他可以将 /etc/passwd 文件复制到自己的计算机上,并针对它运行任意数量的密码破解程序。如果文件中存在不安全的密码,则仅需等待密码破解程序发现密码。
影子密码通过将密码哈希存储在文件 /etc/shadow 中(仅可由 root 用户读取)来消除这种类型的攻击。
这强制潜在攻击者通过登录计算机上的网络服务(如 SSH 或 FTP)来远程尝试窃取密码。这种暴力攻击的速度非常慢,随着数百次登录尝试写入到系统文件,会出现明显的跟踪。当然,如果攻击者在密码较弱的系统上夜间开始攻击,破解者在进入并编辑日志文件以覆盖他的记录之前便获得了访问权限。
除了格式和存储注意事项之外,还需要考虑内容问题。为了防止其帐户遭到密码破解攻击,用户可以执行的一项最重要的事情就是创建强大的密码。
注意
红帽建议使用中央身份验证解决方案,如 Red Hat Identity Management(IdM)。使用中央解决方案优先于使用本地密码。详情请查看:

4.1.1.1. 创建 Strong 密码

在创建安全密码时,用户必须记住,很长的密码比短而复杂的密码强大。创建仅包含八个字符的密码并不理想,即使它包含数字、特殊字符和大写字母。密码破解工具(如 John The Ripper)针对破坏此类密码进行了优化,因此个人很难记住这些密码。
在信息理论中,熵是与随机变量相关的不确定性级别,以位数表示。熵值越大,密码安全性越高。根据 NIST SP 800-63-1,未在由 50000 个常用选择密码组成的字典中不存在的密码应至少具有 10 位熵。因此,由四个随机单词组成的密码包含大约 40 位熵。包含多个用于添加安全性的词语的长密码也称为密码短语,例如:
randomword1 randomword2 randomword3 randomword4
如果系统强制使用大写字母、数字或特殊字符,则遵循上述建议的密码短语可以简单修改,例如,将第一个字符更改为大写字母并附加"1"!"。请注意,此类修改不会显著提高密语的安全性
自我创建密码的另一种方法是使用密码生成器。Thepwmake 是用于生成随机密码的命令行工具,由全部四组字符组成,即大写、小写、数字和特殊字符。实用程序允许您指定用于生成密码的熵位数。熵从 /dev/urandom 中拉取。您可以指定的最少位数是 56,这足以满足暴力攻击的系统和服务的密码。64 位适合攻击者无法直接访问密码哈希文件的应用程序。对于攻击者可能获得对密码哈希的直接访问权限或将密码用作加密密钥的情况,应该使用 80 到 128 位。如果您指定了无效的熵位数,pwmake 将使用默认位数。要创建 128 位的密码,请输入以下命令:
pwmake 128
虽然创建安全密码的方法有所不同,但请务必避免以下错误做法:
  • 使用单个字典单词、外部语言中的词语、颠倒的词语或仅数字。
  • 将少于 10 个字符用作密码或密码短语.
  • 使用键盘布局中的一系列键.
  • 写下您的密码。
  • 使用密码中的个人信息,如生日、横线、成员姓名或宠物名称。
  • 在多台计算机上使用相同的密语或密码.
在创建安全密码的同时,务必要对它们进行正确管理,特别是对于大型企业内的系统管理员而言。以下小节详细介绍了在组织内创建和管理用户密码的良好做法。

4.1.1.2. 强制使用 Strong 密码

如果组织拥有大量用户,系统管理员可以通过两个基本选项来强制使用强密码:他们可以为用户创建密码,也可以让用户在验证密码时创建自己的密码。
为用户创建密码可确保密码正确,但随着组织的扩展,它是一项艰巨的任务。它还会增加用户写密码的风险,从而公开密码。
因此,大多数系统管理员更喜欢让用户创建自己的密码,但会主动验证这些密码是否足够强大。在某些情况下,管理员可以强制用户通过密码有效期定期更改其密码。
当要求用户创建或更改密码时,他们可以使用 passwd 命令行实用程序(即 PAM-a可插拔验证模块)并检查密码是否太短或易于破解。此检查由 pam_pwquality.so PAM 模块执行。
注意
在红帽企业 Linux 7 中,pam_pwquality PAM 模块取代 pam_cracklib,该模块在红帽企业 Linux 6 中用作密码质量检查的默认模块。它使用与 pam_cracklib 相同的后端。
pam_pwquality 模块用于根据一组规则检查密码的强度。其过程由两个步骤组成:首先检查提供的密码是否在字典中找到。如果没有,它会继续执行几个附加检查。pam_pwquality/etc/pam.d/passwd 文件 的密码 组件中的其他 PAM 模块一起堆叠,自定义规则集在 /etc/security/pwquality.conf 配置文件中指定。有关这些检查的完整列表,请查看pwquality.conf(8) 手册页。

例 4.1. 配置密码强度检查 inpwquality.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 中指定密码期限,请使用 chage 命令。
重要
在 Red Hat Enterprise Linux 7 中,默认启用 shadow 密码。如需更多信息,请参阅《红帽企业 Linux 7 系统管理员指南 》。
chage 命令的 -M 选项指定密码有效的最长天数。例如,要将用户的密码设置为 90 天后过期,请使用以下命令:
chage -M 90 username
在上述命令中,将 username 替换为用户名称。要禁用密码过期,请在 - M 选项后使用 - 1 值。
有关 chage 命令可用选项的更多信息,请参考下表。

表 4.1. chage 命令行选项

选项 描述
-d days 指定自 1 月 1 日以来的天数,即 1970 年更改密码的天数。
-e date 以 YYYY-MM-DD 格式指定帐户锁定的日期。也可以使用 1970 年 1 月 1 日起的天数,而不是日期。
-I days 指定在锁定帐户之前密码过期后的非活动天数。如果值为 0,则帐户在密码过期后不会被锁定。
-l 列出当前的帐户过期设置.
-m days 指定用户必须更改密码的最小天数。如果值为 0,则密码不会过期。
-m days 指定密码有效的最长天数。如果此选项指定的天数加上通过 -d 选项指定的天数小于当前日期,用户必须在使用该帐户之前更改密码。
-W days 指定密码到期日期前的天数,以提醒用户。
您还可以在交互模式中使用 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 实用程序具有可设置空密码的选项。使用空密码时,使用空密码是一种高度不安全的做法,因为任何第三方都可以使用不安全的用户名登录和访问系统。尽可能避免使用空密码。如果不可能,请务必确保用户已准备好登录,然后再解锁具有空密码的帐户。
  2. root 用户身份运行以下命令强制立即过期密码:
    chage -d 0 username
    此命令将上次更改为 epoch 的日期的值设置为 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. 要在 10 分钟后尝试三次并解锁该用户后锁定任何非 root 用户,请在 /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 作业会重置正在运行 cron 作业的 pam_faillock 的失败计数器,因此不应为 cron 配置 pam_faillock如需更多信息,请参阅知识中心支持(KCS)解决方案

使用 authconfig 保留自定义设置

使用 authconfig 实用程序修改身份验证配置时,system-authpassword-auth 文件会被 authconfig 实用程序的设置覆盖。这可以通过创建符号链接来代替配置文件(authconfig 可识别且不会覆盖这些文件 )来避免这种情况。要在配置文件和 authconfig 中同时使用自定义设置,请按照以下步骤配置帐户锁定:
  1. 检查 system-authpassword-auth 文件是否为指向 system-auth-ac 和 password-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 选项

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

4.1.3. 会话锁定

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

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

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

4.1.4. 强制只手动挂载可移动介质

要强制以只读方式挂载可移动介质(如 USB 闪存磁盘),管理员可以使用 udev 规则检测可移动介质并使用 blockdev 实用程序将其配置为只读挂载。这足以强制以只读方式挂载物理介质。

使用 blockdev 强制只读挂载可移动介质

要强制以只读方式挂载所有可移动介质,请使用以下内容创建一个新的 udev 配置文件,例如: /etc/udev/rules.d/ 目录中的 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