系统安全指南与最佳实践
1. 常见攻击类型及影响
在信息安全领域,了解常见的攻击类型及其影响是保障系统安全的基础。以下是几种常见的攻击类型:
-
任意代码执行攻击
:这是最危险的攻击类型之一。攻击者可向目标系统引入新的程序逻辑,而非仅利用或滥用系统中已运行的软件。若存在漏洞使远程未认证攻击者能通过网络发送特制请求执行任意代码,这是最严重的威胁,可能需在修复前将受影响系统完全离线。但如果攻击需用户认证,其影响会大大受限,因为攻击者首先要窃取有效用户凭证。而且,若在权限高度受限且无法访问敏感信息的进程中执行任意代码,攻击者可能获利不大。
-
权限提升攻击
:合法用户可借此执行本不应有的操作。其影响可能很严重,例如,若存在漏洞使任何认证用户可读取系统上的所有文件,允许非管理员用户登录的机器就有隐私泄露风险。不过,外部攻击者需先找到登录方式才能利用此漏洞。对于仅允许管理员登录的系统,若不同时存在远程任意代码执行漏洞或凭证窃取问题,这种漏洞一般无需担忧。
-
拒绝服务攻击
:攻击者借此破坏系统的可用性。
2. 保障系统安全的总体思路
在信息安全领域有个常见玩笑,即唯一完全安全的系统是关机的系统。当然,这样的系统仅在完整性和保密性方面安全,是以牺牲可用性为代价的。现实场景中总是需要权衡,且风险始终存在。系统管理员的目标是防止已知攻击并降低未知攻击的影响,随时准备应对新威胁并减轻其危害。幸运的是,遵循一些简单指南可显著降低风险,下面将讨论防止特定攻击类型的通用策略和战术。
3. 缩小攻击面
系统的攻击面大致是指所有可访问系统的途径。例如,同时运行 Web 服务器和邮件服务器的机器比仅运行其中一个的系统攻击面更大。假设这些服务中出现漏洞和配置问题的概率相同且相互独立,那么同时运行两者的系统出现漏洞的可能性是前者的两倍。
然而,许多实际系统需要同时提供多种服务,如电子邮件提供商需要邮件服务器和面向客户的网站。缩小攻击面并非减少服务数量,而是要将服务相互隔离,理想情况下还要与攻击者隔离。
以典型的 Web 应用程序栈为例,它通常包含应用服务器和数据库服务器。大多数情况下,数据库服务器无需公开访问,将其访问权限限制在内部网络是个好主意。此外,应用服务器也无需直接公开访问,可将其置于负载均衡器之后。负载均衡器不仅能提高系统可用性,还能减少攻击者从公共互联网可利用的攻击面。另外,它还能提供速率限制和威胁检测系统,保护应用服务器免受至少部分攻击流量的影响。
4. 隔离与权限分离
过去,隔离系统不同组件的唯一方法是在不同物理机器上运行它们。这种方法成本高昂,只有在有重要原因时才会采用,例如处理高负载的应用程序为满足性能要求,而非仅仅为缩小系统攻击面,才会使用单独的数据库和应用服务器。
但在过去二十年里,即使在普通硬件上也有了更多精细的进程隔离方法。虚拟化技术允许在单个物理机器上运行多个操作系统实例,现代虚拟机管理器使创建这些实例变得容易,更不用说云平台只需点击一下或通过 API 调用就能创建所需操作系统的虚拟机。
除了完全虚拟化,还有多种方法可在单台机器上隔离应用程序,包括 chroot 环境、容器和强制访问控制系统。
4.1 使用 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 之外的任何文件。不过,他们仍可与系统上的其他进程进行交互。若需要更深入的隔离,可使用容器。
4.2 使用容器
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 守护进程,都不可见,容器内的进程也无法以任何方式与它们交互。
4.3 使用强制访问控制
还可以为用户和进程授予不同的能力,理想情况下仅授予它们执行功能所需的能力。这种机制称为强制访问控制(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 可以创建灵活且精细的安全策略,初学者应首先使用发行版的默认设置。
5. 防止凭证窃取和暴力攻击
凭证窃取问题必须在用户工作站上解决。目前没有绝对防止凭证窃取的方法,因此应努力保护笔记本电脑或桌面系统免受一般攻击,保持系统更新,防范恶意软件,避免陷入包含恶意链接的钓鱼邮件等社会工程攻击。
对于暴力攻击,有两种互补的方法:使密码难以猜测和限制认证尝试次数。
大多数 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
。
6. 降低软件漏洞风险
确保系统中没有易受攻击的软件的最佳方法是使用发行版仓库中的软件并及时安装更新。应避免手动安装软件包,因为这些软件包不会自动从发行版维护者处获取更新。如果确实需要手动安装,应订阅其发布公告并自行检查更新。
很多时候,漏洞是在已发布的软件版本中发现的,而非在开发过程中,这种情况称为零日漏洞(通常简称为 0day)。有时,这些漏洞在被发现之前可能已经存在了数月甚至数年。修复此类漏洞的更新软件包可能在恶意行为者开始利用它们之后才出现。在这种情况下,软件维护者通常会建议采取临时缓解策略,可能包括更改配置选项、禁用特定功能或对系统进行其他更改,使攻击更难执行。因此,关注常用发行版和软件项目的博客或邮件列表也是个好主意。
综上所述,保障系统安全是一个持续的过程,需要系统管理员不断学习和实践,采取多种措施来降低风险,保护系统免受各种攻击的威胁。
系统安全指南与最佳实践
7. 总结
在前面的内容中,我们详细了解了计算机系统面临的各种攻击类型,包括任意代码执行攻击、权限提升攻击和拒绝服务攻击,以及攻击者实施这些攻击的动机和可能给用户带来的后果。同时,我们也探讨了保护系统免受攻击的常见策略,如缩小攻击面、利用隔离与权限分离技术、防止凭证窃取和暴力攻击以及降低软件漏洞风险等。
不过,信息安全是一个庞大的领域,系统管理员需要不断更新自己的知识,将所学的安全策略和方法应用到实际工作中,持续关注新出现的安全威胁,及时调整安全措施,以确保系统始终处于安全状态。这是一个需要长期投入精力和努力的过程。
8. 常见问题解答
为了帮助大家更好地理解和应用上述安全知识,下面整理了一些常见问题及解答:
|问题|解答|
| ---- | ---- |
|任意代码执行攻击在什么情况下最危险?|当存在漏洞使远程未认证攻击者能通过网络发送特制请求执行任意代码时,这是最严重的威胁,可能需在修复前将受影响系统完全离线。若攻击需用户认证,其影响会因攻击者需先窃取有效用户凭证而大大受限;若在权限高度受限且无法访问敏感信息的进程中执行,攻击者获利也不大。|
|如何判断系统是否启用了 SELinux?|可以使用
getenforce
命令检查。若输出为
Enforcing
,表示处于强制模式;若为
Permissive
,表示宽容模式;若为
Disabled
,表示禁用模式。|
|手动安装软件包有什么风险?|手动安装的软件包不会自动从发行版维护者处获取更新,可能存在安全漏洞未及时修复的风险。若确实需要手动安装,应订阅其发布公告并自行检查更新。|
|防止暴力攻击的方法有哪些?|有两种互补的方法:一是使用
pam_pwquality.so
模块使密码难以猜测,防止非特权用户使用不安全密码;二是使用速率限制工具,如
fail2ban
限制认证尝试次数。|
9. 操作流程总结
为了更清晰地展示保障系统安全的操作步骤,下面以 mermaid 格式的流程图呈现主要的操作流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始保障系统安全]):::startend --> B{选择安全策略}:::decision
B -->|缩小攻击面| C(隔离服务):::process
B -->|隔离与权限分离| D{选择隔离方式}:::decision
D -->|chroot| E(设置 chroot 环境):::process
D -->|容器| F(使用 Docker 或 Podman 等工具):::process
D -->|强制访问控制| G(启用 SELinux 或 AppArmor):::process
B -->|防止凭证窃取和暴力攻击| H{选择防护方法}:::decision
H -->|设置强密码| I(使用 pam_pwquality.so 模块):::process
H -->|限制认证尝试| J(使用 fail2ban 等工具):::process
B -->|降低软件漏洞风险| K(使用发行版仓库软件并及时更新):::process
C --> L([完成缩小攻击面]):::startend
E --> M([完成 chroot 隔离]):::startend
F --> N([完成容器隔离]):::startend
G --> O([完成强制访问控制设置]):::startend
I --> P([完成强密码设置]):::startend
J --> Q([完成认证尝试限制]):::startend
K --> R([完成软件漏洞风险降低]):::startend
10. 进一步学习建议
信息安全领域不断发展,新的攻击技术和安全漏洞不断涌现。为了持续提升系统安全保障能力,建议大家进一步学习相关知识。以下是一些学习资源推荐:
-
NIST 漏洞数据库
:提供了大量的安全漏洞信息,可帮助你及时了解最新的安全威胁。访问地址:https://nvd.nist.gov/
-
通用漏洞评分系统
:用于评估漏洞的严重程度,有助于你对不同漏洞进行优先级排序。访问地址:https://nvd.nist.gov/vuln-metrics/cvss
-
OWASP 风险评级方法
:可以帮助你评估应用程序的安全风险,制定相应的安全策略。访问地址:https://owasp.org/www-community/OWASP_Risk_Rating_Methodology
-
Fail2Ban 速率限制守护进程
:详细介绍了
fail2ban
的使用方法和配置技巧。访问地址:https://www.fail2ban.org
通过学习这些资源,你可以深入了解信息安全的各个方面,不断提升自己的安全技能和知识水平,更好地保护系统免受各种攻击的威胁。
总之,系统安全是一个复杂而重要的领域,需要我们不断探索和实践。希望大家能够将所学的知识应用到实际工作中,为保障系统安全贡献自己的力量。
超级会员免费看

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



