LFCA:如何提高 Linux 系统安全性 - 第 20 部分
众所周知,root用户为王,对Linux系统拥有无限的权限。但是,非 root 用户仅限于执行基本任务。此外,sudo 用户仅被授予 root 用户认为适合执行特定提升任务的一定程度的 root 权限。
当普通用户对资源的访问不受控制或无意中升级为 root 时,就会出现问题。这是一个严重的安全风险,可能会导致漏洞、意外修改,在最坏的情况下甚至会导致系统崩溃。另一个潜在风险是文件的文件权限安全性较低。例如,具有全局用户写入权限的启动文件很容易被修改或损坏,从而导致系统损坏。
虽然我们可以实现物理、网络和数据安全,但恶意用户可以规避安全措施并利用此类安全漏洞。正是由于这个原因,文件系统的安全性才应该受到重视。它在面对来自恶意员工的攻击或内部威胁时提供了额外的防御层,这些员工无需费力地绕过安全措施来访问文件。
在系统安全方面,我们将重点抓好以下几个重点:
- 访问权限 – 用户和组权限。
- 使用 PAM 模块实施密码策略。
访问权限 – 用户和组分离
您可能听说过 Linux 中的所有内容都被视为文件。如果不是,这也是一个过程。 Linux 系统上的每个文件都由一个用户和一个组用户拥有。它还具有 3 个用户类别的文件权限:用户 (u)、组 (g) 和其他 (o)。每个用户类别的权限以读、写和执行 (rwx) 形式表示。
rwx rwx rwx
User Group Others
如前所述,在 Linux 基础知识部分中,您可以使用 ls 命令的长格式查看文件权限,如下所示。
ls -l
回顾一下,权限通常由九个字符表示。前三个字符代表拥有该文件的实际用户的访问权限。第二组字符代表文件的组所有者的权限。最后,为其他或全球用户设置最后一组。这些字符始终按读取、写入、执行 (rwx) 顺序排列。
权限之后,我们拥有用户和组所有权,然后是文件或目录大小、修改日期,最后是文件名。
更改文件/目录权限和所有权
文件和目录的用户权限可以根据需要进行修改。经验法则是使用最小权限安全原则。简而言之,确保用户获得完成工作所需的最低访问权限或权限。
最小权限原则将用户仅限制为某些角色,这样可以最大限度地降低攻击者利用低级别用户帐户访问和修改关键数据的风险。如果攻击者控制了您的系统,它还可以减少攻击面并限制恶意软件传播。
因此,如果用户只需要查看文件或目录的内容,则不应授予他们执行或写入权限。在最基本的级别上,仅授予用户完成任务所需的最少权限和所有权。我们已经在基本 Linux 命令主题中解决了如何使用 chmod 和 chown 命令修改文件/目录的用户权限和所有权。
粘滞位权限模式
为了使系统管理员能够更轻松地管理权限,可以向整个目录授予特殊权限或访问权限。可用于限制删除和修改文件或目录的特殊权限之一是粘滞位。
粘性位
在系统或网络中的所有用户都可以访问共享目录的情况下,存在某些用户可以删除或修改目录内文件的潜在风险。如果您想保持目录内容的完整性,这是不希望的。这就是粘性位的用武之地。
粘滞位是对文件或整个目录设置的特殊文件权限。它仅授予该文件/目录的所有者删除或更改文件或目录内容的权限。其他用户不能删除或修改该文件/目录。它的符号值为t
,数值为1000。
要打开目录上的粘滞位,请使用 chmod 命令,如下所示:
chmod +t directory_name
在下面的示例中,我们对名为 test 的目录应用了粘滞位。对于目录,所有内容都将继承粘滞位权限。您可以使用ls -ld命令验证粘性位权限。请务必注意文件权限末尾的 t
符号。
ls -ld test
如果其他用户尝试删除该目录或修改该目录中的文件,他们会收到权限被拒绝错误。
这就是 Stick 位文件权限的要点。
监控 SUID 和 SGID 权限
SUID(设置用户 ID)是另一种特殊的文件权限,它允许其他常规用户以文件所有者的文件权限运行文件。它通常在用户的文件权限部分用符号值 s
表示,而不是表示执行权限的 x
。 SUID 的数值为 4000。
SGID(设置组ID)允许普通用户继承文件组所有者的组权限。您将在文件权限的组部分看到 s
,而不是表示执行权限的 x
。 SGID 的数值为 2000。
无论它们多么方便,SUID 和 SGID 权限都与安全风险相关,应不惜一切代价避免。这是因为他们向普通用户授予特殊权限。如果冒充普通用户的入侵者遇到 root 用户拥有的可执行文件,并且该文件上设置了 SUID 位,他们就可以利用该漏洞并利用系统。
要查找 Linux 中设置了 SUID 位的所有文件,请以 root 用户身份运行 find 命令。
find / -perm -4000 type -f
对于目录运行:
find / -perm -4000 type -d
要查找所有设置了 SGID 位的文件,请运行:
find / -perm -2000 type -f
对于目录执行:
find / -perm -2000 type -d
要删除文件上的 SUID 位,请运行 chmod 命令,如下所示:
chmod u-s /path/to/file
要删除文件上的 SGID 位,请执行以下命令:
chmod g-s filename /path/to/file
使用 PAM 模块强制执行密码策略
用户设置弱密码的情况并不罕见。最好设置简短、简单且易于猜测的密码,以避免在登录过程中忘记密码。虽然很方便,但弱密码很容易通过暴力攻击脚本被破解。
PAM 模块(可插入身份验证模块)是一个允许系统管理员在 Linux 系统上实施密码策略的模块。为此,您需要 libpam_pwquality 库提供的 pam_pwquality 模块。 pam_pwquality 模块根据一组规则和系统字典检查密码的强度,并查明弱密码选择。
要在 Ubuntu 18.04 及更高版本上安装 pam_pwquality 模块,请运行:
sudo apt install libpam_pwquality
对于RHEL/CentOS 8,运行命令:
sudo dnf install libpwquality
配置文件位于以下位置:
- 在 Debian 系统上 – /etc/pam.d/common-password
- 在 RedHat 系统上 – /etc/pam.d/system-auth
配置密码策略
在开始修改 PAM 配置文件之前,我们首先考虑收集有关密码时效控制的见解。
密码时效详细信息
这些可以在 /etc/login.defs 文件中找到。
该文件包含以下关键密码控件:
- PASS_MAX_DAYS:密码可以使用的最大天数。
- PASS_MIN_DAYS:最小数量。密码更改之间允许的天数。
- PASS_WARN_AGE:密码过期前发出警告的天数。
默认值如下所示。
PASS_MAX_DAYS 属性限制用户可以使用其密码的天数。当达到此值或密码过期时,用户将被迫更改密码才能登录系统。默认情况下,该值设置为 99999,即 273 年。就安全性而言,这没有多大意义,因为用户可以在一生中继续使用其密码。
您可以将其设置为有意义的值,例如 30 天,如图所示。
PASS_MAX_DAYS 30
30 天后,用户将被迫更改密码。
PASS_MIN_DAYS 属性规定了用户在更改密码之前可以使用其密码的最短期限。这是什么意思?例如,如果该值设置为 15 天,则用户将无法在 15 天过去之前再次更改密码。
PASS_MAX_DAYS 15
PASS_WARN_AGE 属性指定用户在密码过期之前收到密码即将过期警告的天数。例如,您可以将其设置为 7 天,如图所示。
PASS_MAX_DAYS 7
注意:这些密码控件不适用于预先存在的帐户。它们仅适用于定义规则后创建的新帐户。
使用 PAM 模块设置密码复杂性
在编辑 /etc/pam.d/common-password 文件之前,请创建备份副本。在此示例中,我们创建了 common-password.bak 备份副本文件。
sudo cp /etc/pam.d/common-password /etc/pam.d/common-password.bak
然后打开文件。
sudo vim /etc/pam.d/common-password
找到下图所示的行。
password requisite pam_pwquality.so retry=3
重试选项设置在出现错误之前您需要输入正确密码的最大次数。默认情况下,该值设置为 3。这只是一个选项,我们将包括多个选项。
将以下属性添加到该行:
minlen=10 difok=3 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 reject_username
让我们充实这些属性。
- minlen=10:设置可接受的最小密码大小。在本例中为 10 个字符。
- difok=3:这是先前密码中出现的最大字符数。
- lcredit=-1:这是密码中应包含的最小小写字符数。
- ucredit=-1:密码中应包含的小写字符的最大数量。
- dcredit=-1:密码中应定义的最少数字字符数。
- ocredit=-1:密码中应定义的特殊字符(例如 @、# 和 &)的最少数量。
- reject_username:如果密码是直接或反向格式的用户名,则此选项将触发密码拒绝。
如果您尝试创建不符合密码策略的新用户,您将遇到如图所示的错误。
概括
关于系统安全和一般安全基础知识的主题到此结束。在整章中,我们阐明了您可以实施的基本安全措施,以保护您的 Linux 系统免受黑客或心怀不满的员工等恶意用户的侵害。