系统安全指南与最佳实践
1. 常见攻击类型及影响
在计算机系统中,存在多种攻击类型,每种攻击都有其独特的特点和潜在影响。
-
任意代码执行攻击
:这是最危险的攻击类型之一。攻击者可以向目标系统引入新的程序逻辑,而不仅仅是利用或滥用系统上已运行的软件。不过,存在许多缓解因素。例如,若漏洞允许远程未认证攻击者通过网络向目标系统发送特制请求来执行任意代码,这是最严重的威胁,可能需要将受影响的系统完全离线,直到漏洞被修复。但如果攻击者必须先进行用户认证才能执行攻击,其影响就会大大受限,因为攻击者首先需要窃取有效的用户凭证。此外,如果在具有高度受限权限且无法访问任何敏感信息的进程中执行任意代码,攻击者可能无法从中获得太多好处。
-
权限提升攻击
:合法用户可以执行原本不被允许的操作。其影响可能很严重,例如,若漏洞允许任何已认证用户读取系统上的所有文件,无论文件权限如何,那么允许非管理员用户登录的机器就存在隐私泄露的风险。不过,外部攻击者在利用此漏洞之前,首先需要找到登录系统的方法。对于只允许管理员登录的系统,这种漏洞通常不是问题,除非同时存在远程任意代码执行漏洞或凭证盗窃问题。
-
拒绝服务攻击
:攻击者可以破坏系统的可用性。
2. 保障系统安全的通用策略
保障系统安全是一个持续的过程,需要系统管理员采取多种策略来降低风险。
-
减少攻击面
:系统的攻击面大致是指所有可以访问该系统的方式。例如,同时运行 Web 服务器和邮件服务器的机器比只运行其中一个服务的系统具有更大的攻击面。如果假设这些服务中出现漏洞和配置问题的概率相同且相互独立,那么运行两个服务的系统受攻击的可能性是运行单个服务系统的两倍。但实际上,许多系统需要同时提供多种服务,如电子邮件提供商需要邮件服务器和面向客户的网站。减少攻击面并非减少服务的运行数量,而是要将服务彼此隔离,理想情况下还要与攻击者隔离。
例如,典型的 Web 应用程序栈包括应用服务器和数据库服务器。大多数情况下,数据库服务器无需公开访问,将其访问权限限制在内部网络是个不错的选择。此外,应用服务器也无需直接公开访问,可以将其置于负载均衡器之后。负载均衡器不仅可以提高系统的可用性,还能减少攻击者从公共互联网可访问的攻击面。此外,它还可以提供速率限制和威胁检测系统,保护应用服务器免受至少部分攻击流量的影响。
- 隔离与权限分离 :过去,隔离系统不同组件的唯一方法是在不同的物理机器上运行它们,但这种方法成本高昂,通常仅在有充分理由时才会采用,例如处理高负载的应用程序为满足性能要求而使用单独的数据库和应用服务器,而不仅仅是为了减少系统的攻击面。
然而,在过去的二十年中,即使在普通硬件上,也出现了许多更精细的进程隔离方法。虚拟化技术允许在单个物理机器上运行多个操作系统实例,现代虚拟机管理器使创建这些实例变得容易,更不用说云平台只需一键点击或通过 API 调用就能创建所需操作系统的虚拟机。
除了完全虚拟化,还有许多方法可以在单台机器上隔离应用程序,包括 chroot 环境、容器和强制访问控制系统。
- **使用 chroot**:chroot 是最古老的完全分离进程的方法。从技术上讲,chroot(更改根目录)是内核中的一个系统调用,它会更改进程的根目录。根目录被更改的进程将无法访问该目录之外的任何文件,对该进程来说,其根目录就像是系统中唯一存在的目录。手动为进程设置 chroot 环境可能是一项耗时的任务,因此许多发行版提供了特殊的软件包来简化这个过程。
例如,Fedora 提供了一种简单的方法,可在 chroot 环境中运行流行的 DNS 服务器 ISC BIND(也称为 named):
$ sudo dnf install bind9-next-chroot
Installed:
bind9-next-32:9.19.11-1.fc37.x86_64 bind9-next-chroot-32:9.19.11-1.fc37.x86_64 bind9-next-dnssec-utils-32:9.19.11-1.fc37.x86_64 bind9-next-libs-32:9.19.11-1.fc37.x86_64 bind9-next-license-32:9.19.11-1.fc37.noarch
Complete!
$ sudo systemctl enable named-chroot
Created symlink /etc/systemd/system/multi-user.target.wants/named-chroot.service → /usr/lib/systemd/system/named-chroot.service.
$ tree /var/named/chroot/
/var/named/chroot/
├── dev
├── etc
│ ├── crypto-policies
│ │ └── back-ends
│ ├── named
│ └── pki
│ └── dnssec-keys
├── proc
│ └── sys
│ └── net
│ └── ipv4
...
可以看到,作为 BIND 进程有限根目录的目录模拟了真实的根目录,包含 /dev 和 /proc 层次结构,全局版本的这些目录对该进程不可用。因此,即使攻击者利用远程代码执行漏洞将恶意代码注入 BIND 进程,他们也无法读取 /var/named/chroot 之外的任何文件。不过,他们仍然可以与系统上的其他进程进行交互。如果需要更深入的隔离,可以使用容器。
- **使用容器**:Linux 内核提供了名为 LXC 的容器技术,它由多个子组件组成,如进程组、控制组和网络命名空间。手动创建和启动容器环境是一项繁琐的任务,因此人们开发了自动化工具以及现成容器镜像的注册表。目前,在 Linux 上管理容器最流行的工具是 Docker,不过也有其他替代方案,如 Podman。下面通过使用 Docker 启动 Fedora 镜像来演示进程隔离:
$ sudo dnf install docker
$ sudo docker pull fedora:latest
$ docker run -it fedora:latest bash
[root@df231cc10b87 /]# dnf install procps-ng
[root@df231cc10b87 /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4720 3712 pts/0 Ss 15:21 0:00 /bin/bash
root 55 0.0 0.0 5856 2688 pts/0 R+ 15:23 0:00 ps aux
可以看到,当在容器中启动 bash shell 进程时,从容器内部看,它就像是系统中唯一的进程。主机系统的任何进程,如 systemd 或 Docker 守护进程,都不可见,容器内的进程也无法以任何方式与它们进行交互。
- **使用强制访问控制**:可以为用户和进程授予不同的权限,理想情况下只授予它们执行所需功能的权限。这种机制称为强制访问控制(MAC)系统,与经典的自主访问控制(即 Unix 文件权限系统)相对。目前,Linux 上最流行的 MAC 系统是 Security Enhanced Linux(SELinux),不过也有不太常见的替代方案,如 AppArmor 内核模块。
如今,许多 Linux 发行版默认启用 SELinux,并为流行的服务包含了权限和对象上下文。可以使用 getenforce 命令检查系统上是否启用了 SELinux:
$ getenforce
Enforcing
在强制模式下,SELinux 会禁止用户或进程执行未被授予权限的操作。例如,没有 can_network_connect 权限的进程将无法发起任何网络连接。在宽容模式下,SELinux 会在系统日志中生成警报,但不会强制执行权限,这种模式非常适合测试。如果处于禁用模式,SELinux 则不会进行任何权限检查。
配置 SELinux 策略是一个复杂的主题,超出了入门级书籍的范围。但如果选择启用 SELinux,通常需要了解如何授予进程访问文件的权限。例如,在 Apache HTTPd 配置文件中,可以将任何目录指定为网站根目录。但如果攻击者控制了 Apache 进程,这可能会带来安全问题。因此,在 Fedora 中,该软件包的维护者为必须可由 Web 服务器访问的文件引入了一组特殊的 SELinux 上下文。
可以通过在 ls 命令中添加 -Z 选项来查看文件的 SELinux 上下文。例如,/var/lib/httpd 目录具有 httpd_var_lib_t 上下文,该上下文授予读取权限:
$ sudo ls -alZ /var/lib/httpd/
total 8
drwx------. 2 apache apache system_u:object_r:httpd_var_lib_t:s0 4096 Jun 17 2022 .
drwxr-xr-x. 55 root root system_u:object_r:var_lib_t:s0 4096 Nov 16 02:39 ..
可能可写的网站目录使用不同的上下文 - httpd_sys_content_t:
$ ls -alZ /var/www/html/
total 8
drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 4096 Jun 17 2022 .
drwxr-xr-x. 6 root root system_u:object_r:httpd_sys_content_t:s0 4096 Jun 17 2022 ..
如果将网站根目录设置为其他新创建的目录,即使根据 Unix 权限该目录应该是可读的,Apache 进程也可能无法访问它,因为它缺少所需的上下文。可以使用 chcon 命令授予访问权限:
$ sudo chcon system_u:object_r:httpd_sys_content_t:s0 /home/webmaster/public_html
使用 SELinux 可以创建灵活且精细的安全策略,但初学者应首先使用发行版的默认设置。
3. 防止凭证盗窃和暴力攻击
- 防止凭证盗窃 :凭证盗窃问题主要在用户工作站层面解决。目前没有绝对的方法可以防止凭证盗窃,因此应该努力保护笔记本电脑或桌面系统免受各种攻击,包括保持系统更新、防范恶意软件以及避免陷入钓鱼邮件等社会工程攻击,这些邮件可能包含恶意链接。
- 应对暴力攻击 :有两种互补的方法来应对暴力攻击,即设置难以猜测的密码和限制认证尝试次数。
大多数 Linux 发行版默认启用名为 pam_pwquality.so 的 PAM 模块,该模块可防止非特权用户使用不安全的密码。可以通过尝试将密码设置为过短或简单的字典单词来验证这一点:
$ passwd
Changing password for user ...
Current password:
New password: qwerty
BAD PASSWORD: The password is shorter than 8 characters
passwd: Authentication token manipulation error
$ passwd
Changing password for user ...
Current password:
New password: swordfish
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
passwd: Authentication token manipulation error
该模块使用的密码强度检查后端是 cracklib,它通常将数据存储在 /usr/share/cracklib 中。其字典采用二进制格式,但提供了操作这些字典文件和检查密码强度的工具,而无需实际设置密码:
$ echo "swordfish" | cracklib-check
swordfish: it is based on a dictionary word
需要注意的是,root 用户不受密码质量检查的限制,可以为任何用户设置任何密码。
此外,大多数 Linux 发行版的软件包仓库中都有一个名为 pwgen 的工具,用于生成安全的随机密码。它允许指定密码是否应完全随机、包含哪些字符、密码长度以及一次生成多少个密码:
$ pwgen --secure 40 1
DMYRsJNuXJQb98scCUASDzt3GFPa7yzGg9eS1L1U
$ pwgen --secure 8 16
Ob4r24Sp KwGCF63L 3bgKI79L aWK2K7aK MFf1ykum y74VTKqb OxbrNlI0 8Dl4yilz
bmI1RsKr oM4p8dsJ 2EXmmHIJ bt9Go1gg 3znmVqpo vZ9BDIlz QMZ7eME0 izkB15Xe
速率限制是一个广泛的主题,其设置因服务和应用程序而异。不过,也有一些支持多种服务的通用集成解决方案,如 fail2ban。
4. 降低软件漏洞风险
确保系统中没有易受攻击的软件的最佳方法是使用发行版软件仓库中的软件,并及时安装更新。应避免手动安装软件包,因为这些软件包不会自动从发行版维护者那里接收更新。如果确实需要手动安装,应确保订阅其发布公告并自行检查更新。
很多时候,漏洞是在已发布的软件版本中被发现的,而不是在开发过程中,这种情况被称为零日漏洞。有时,这些漏洞可能在被发现之前已经存在了数月甚至数年。修复这些漏洞的更新软件包可能在恶意行为者开始利用漏洞之后才出现。在这种情况下,软件维护者通常会建议采取临时缓解策略,可能包括更改配置选项、禁用特定功能或对系统进行其他更改,使攻击更难执行。因此,关注经常使用的发行版和软件项目的博客、邮件列表也是个不错的主意。
综上所述,保障系统安全是一个多方面的任务,需要系统管理员不断学习和实践,采取各种策略来降低风险。通过减少攻击面、隔离组件、防止凭证盗窃和暴力攻击以及降低软件漏洞风险等措施,可以大大提高系统的安全性。但信息安全是一个广阔的领域,系统管理员需要不断更新知识,以应对不断变化的威胁。
系统安全指南与最佳实践(续)
5. 总结与进一步学习
在前面的内容中,我们详细了解了计算机系统面临的各种攻击类型,包括任意代码执行攻击、权限提升攻击和拒绝服务攻击,以及攻击者实施这些攻击的动机和可能给用户带来的后果。同时,也学习了一系列保护系统免受攻击的常见策略,如减少攻击面、进行隔离与权限分离、防止凭证盗窃和暴力攻击以及降低软件漏洞风险等。
然而,信息安全是一个庞大且不断发展的领域,我们所探讨的内容仅仅是冰山一角。对于每一位系统管理员来说,保持对信息安全知识的更新以及确保系统的安全性是一项长期的任务。为了进一步提升自己在信息安全方面的知识和技能,以下是一些值得深入学习的资源:
-
NIST 漏洞数据库
:提供了大量的软件漏洞信息,可帮助我们及时了解最新的安全威胁。链接:https://nvd.nist.gov/
-
通用漏洞评分系统
:用于评估漏洞的严重程度,有助于我们对不同漏洞进行优先级排序。链接:https://nvd.nist.gov/vuln-metrics/cvss
-
OWASP 风险评级方法
:为我们评估应用程序的安全风险提供了一套科学的方法。链接:https://owasp.org/www-community/OWASP_Risk_Rating_Methodology
-
Fail2Ban 速率限制守护程序
:可以有效地限制暴力攻击,保护系统安全。链接:https://www.fail2ban.org
6. 常见攻击类型及防护策略总结
为了更清晰地展示各种攻击类型及其防护策略,我们可以通过以下表格进行总结:
| 攻击类型 | 特点 | 防护策略 |
| — | — | — |
| 任意代码执行攻击 | 攻击者可引入新程序逻辑,若远程未认证可执行则威胁极大;需认证则影响受限;受限权限进程执行收益小 | 减少攻击面,隔离服务;使用 chroot、容器、强制访问控制等进行隔离 |
| 权限提升攻击 | 合法用户执行越权操作,影响可能严重;外部攻击者需先登录 | 对于允许非管理员登录系统加强防护;结合其他安全措施,如限制远程任意代码执行和防止凭证盗窃 |
| 拒绝服务攻击 | 破坏系统可用性 | 使用负载均衡器进行防护,提供速率限制和威胁检测系统 |
| 凭证盗窃 | 攻击者窃取用户凭证 | 保护用户工作站,保持系统更新,防范恶意软件,避免社会工程攻击 |
| 暴力攻击 | 尝试猜测密码 | 使用 pam_pwquality.so 模块设置强密码;使用 pwgen 生成随机密码;使用 fail2ban 等进行速率限制 |
| 软件漏洞攻击 | 利用软件漏洞进行攻击,零日漏洞危害大 | 使用发行版仓库软件并及时更新;关注软件发布公告,采取临时缓解策略 |
7. 系统安全防护流程
为了更好地实施系统安全防护,我们可以遵循以下流程:
graph LR
A[系统初始化] --> B[减少攻击面]
B --> C[进行隔离与权限分离]
C --> D[防止凭证盗窃和暴力攻击]
D --> E[降低软件漏洞风险]
E --> F[定期检查与更新]
F --> G{是否发现新威胁?}
G -- 是 --> H[调整防护策略]
H --> F
G -- 否 --> F
在系统初始化阶段,我们首先要对系统进行全面的评估,确定系统的攻击面。然后,通过减少不必要的服务、隔离服务等方式来减少攻击面。接着,利用 chroot、容器和强制访问控制系统等进行隔离与权限分离,确保不同组件之间的安全性。
在日常使用过程中,要注重防止凭证盗窃和暴力攻击,如设置强密码、使用速率限制工具等。同时,及时更新系统软件,降低软件漏洞风险。
定期对系统进行检查和更新是非常重要的。通过检查,可以发现潜在的安全威胁。如果发现新的威胁,需要及时调整防护策略,以确保系统的安全性。
8. 操作示例总结
以下是文中涉及的一些重要操作示例总结:
-
在 Fedora 中使用 chroot 运行 ISC BIND
$ sudo dnf install bind9-next-chroot
$ sudo systemctl enable named-chroot
$ tree /var/named/chroot/
- 使用 Docker 启动 Fedora 镜像进行进程隔离
$ sudo dnf install docker
$ sudo docker pull fedora:latest
$ docker run -it fedora:latest bash
- 检查 SELinux 状态
$ getenforce
- 查看文件的 SELinux 上下文
$ sudo ls -alZ /var/lib/httpd/
$ ls -alZ /var/www/html/
- 授予进程访问文件的 SELinux 权限
$ sudo chcon system_u:object_r:httpd_sys_content_t:s0 /home/webmaster/public_html
- 验证 pam_pwquality.so 模块
$ passwd
- 使用 cracklib-check 检查密码强度
$ echo "swordfish" | cracklib-check
- 使用 pwgen 生成随机密码
$ pwgen --secure 40 1
$ pwgen --secure 8 16
通过以上操作示例,我们可以更好地掌握系统安全防护的具体方法。在实际操作中,要根据系统的实际情况和需求,灵活运用这些方法,确保系统的安全性。
总之,系统安全防护是一个复杂而长期的过程,需要我们不断学习和实践。通过综合运用各种防护策略和方法,我们可以有效地保护系统免受各种攻击,为用户提供一个安全可靠的使用环境。
超级会员免费看
9万+

被折叠的 条评论
为什么被折叠?



