# Linux 系统安全与防护

2023年4月10日33分钟阅读

- FormalSciences/ComputerScience
- OperatingSystem/Linux

## 基本概念和原则

系统安全的基本目标是保护信息系统的可用性，确保数据的机密性和完整性，同时预防、检测和应对各种形式的威胁。这涵盖了多个层次，包括物理安全、网络安全、操作系统安全、应用安全以及人为因素等。其核心的目标是防止未经授权的访问、使用、披露、破坏、修改、检查或干扰。

理解系统安全的关键原则是掌握其核心理念，并将其应用于实际安全策略和操作中。以下是一些基本原则：

1. 最小权限原则：只给用户或程序足够的权限，让他们完成任务，无需多余的权限。这样如果有人或某程序想要滥用权限，他们的破坏范围也会被限制在最小。
2. 防御深度原则：在系统的每一层都设置防御措施，从物理设备到网络，再到软件。这样如果有人攻击，他们需要一层一层地突破防线，增加了攻击的难度。
3. 故障隔离原则：如果系统的一部分出现问题，其他部分不会受到影响。这样可以防止问题扩大化，保护整个系统的稳定。
4. 开放性设计原则：不通过隐藏信息来保证系统安全，而是通过优秀的设计和实现来保护系统。哪怕攻击者知道系统的全部信息，也找不到破绽。
5. 安全生命周期管理原则：从设计到废弃，整个过程都要考虑安全性。每一步都不能忽视，否则可能会留下安全隐患。
6. 复杂性是敌人原则：系统越复杂，安全隐患就越多，也越难管理。所以应该尽量使系统简单，避免不必要的复杂性。
7. 默认拒绝原则：除非明确允许，否则一律拒绝。这样可以避免未知的威胁，增强系统的安全性。

## 常见的威胁和攻击

在我们的日常生活中，信息系统可能会面临各种形式的威胁和攻击。以下是对常见的威胁和攻击类型进行的详细解释：

1. 恶意软件（Malware）：这是一个广泛的类别，包括许多类型的恶意软件。其中包括：
   - 病毒：这是一种自我复制的恶意代码，它可以附着在其他程序上，并在这些程序运行时执行。病毒可能会删除或修改文件，或者对系统造成其他形式的破坏。
   - 蠕虫：蠕虫与病毒类似，都是自我复制的恶意代码。然而，与病毒不同的是，蠕虫可以自我复制并在网络中传播，无需附着在其他程序上。
   - 特洛伊木马：这是一种伪装成合法程序的恶意软件，它可以提供一个后门，让攻击者远程控制受感染的计算机。
   - 勒索软件：这种类型的恶意软件会对用户的文件或系统进行加密，并要求用户支付赎金以获取解密密钥。近年来，勒索软件的使用日益普遍，并已对许多个人和组织造成了重大影响。
2. 网络攻击：这个类别包括各种利用网络进行的攻击：
   - 分布式拒绝服务（DDoS）：这种攻击涉及使用大量的计算机（通常是通过恶意软件感染的计算机组成的僵尸网络）向目标发送大量的网络流量，从而使目标的网络服务变得不可用。
   - 嗅探：这种攻击涉及监听网络通信，以窃取敏感信息，如密码或信用卡号。
   - 欺骗：这种攻击涉及伪装成另一个系统或用户，以获取敏感信息或进行其他形式的欺诈行为。
   - 会话劫持：这种攻击涉及接管用户的网络会话，以便在没有用户知情的情况下代替用户进行操作。
3. 身份欺诈和权限提升：这个类别的攻击涉及尝试以某种方式绕过系统的认证机制：
   - 身份欺诈：这种攻击涉及伪装成另一个用户，以获得其在系统中的权限。这通常涉及某种形式的密码破解或欺骗。
   - 权限提升：这种攻击涉及利用系统的漏洞或配置错误，以提升攻击者在系统中的权限。这通常涉及利用系统或应用程序的漏洞。
4. 社会工程攻击：这个类别的攻击涉及利用人类的信任和习惯进行欺骗：
   - 钓鱼攻击：这种攻击涉及发送伪装成来自合法组织（如银行或邮件服务商）的电子邮件，以诱使用户提供他们的用户名和密码。
   - 预言攻击：这种攻击涉及利用用户的可预测性（如使用弱密码或在多个网站使用同一密码）来猜测他们的密码。
   - 垃圾邮件：这种攻击涉及发送大量的垃圾邮件，以诱使用户点击恶意链接，或提供他们的个人信息。

## Linux 安全性设置和机制

### SELinux

SELinux（Security-Enhanced Linux）是一个强大的 Linux 内核安全模块，用于实现访问控制安全策略。它通过强制访问控制（MAC）限制用户和进程对系统资源的访问，从而提高系统安全性。

SELinux 的起源可以追溯到 1998 年，当时美国国家安全局（NSA）与安全系统研究小组（SFR）共同开发了一个名为 Flask 的安全架构。该架构的目标是为操作系统提供一种强大且灵活的访问控制机制。在 2000 年，NSA 将 Flask 架构集成到 Linux 内核中，从而诞生了 SELinux。

SELinux 的开发过程受到了开源社区的广泛支持。Red Hat 在 2003 年发布的 Red Hat Enterprise Linux 4（RHEL 4）中首次将 SELinux 作为默认安全模块。此后，许多其他 Linux 发行版，如 CentOS、Fedora 和 Gentoo，也开始支持 SELinux。

SELinux 的实现是通过 Linux 内核安全模块（LSM）框架，这使得内核能够支持额外的安全策略。在 SELinux 中，安全策略和安全上下文标签用于对进程和对象进行访问控制。这种访问控制不仅基于传统的 UNIX 文件权限，也考虑了诸如进程类型、文件类型等其他因素，从而提供更强大的安全保护。同时，SELinux 的安全策略规则集定义了允许的操作、角色和类型。这些规则集能够提供详尽的权限设置，进一步强化了系统的安全性。

SELinux 目前的发展方向主要集中在以下几个方面：

1. **提高安全性：**SELinux 将继续优化安全策略，提高系统安全性。例如，通过引入更多安全策略类型，如基于属性的访问控制（ABAC），以满足不断变化的安全需求。
2. **简化配置和管理：**尽管 SELinux 的学习曲线较陡，但它将继续努力简化安全策略的配置和管理，以便降低使用门槛。
3. **性能优化：**SELinux 将持续改进性能，以减轻其对系统性能的影响，同时确保高度安全性。
4. **社区合作与支持：**SELinux 将继续与开源社区合作，共同推动 Linux 安全模块的发展和完善。此外，它将继续提供支持和培训，帮助用户更好地理解和应用 SELinux。

#### 运行模式

**SELinux 的运行模式主要有两种，Targeted 和 Strict。**在 Targeted 模式中，只有被标记为需要保护的进程会受到 SELinux 的管控，其余的进程则运行在传统的 Linux 访问控制下。而在 Strict 模式下，所有的进程都会受到 SELinux 的管控。这两种模式提供了灵活性，使得用户可以根据他们的具体需求选择适合的模式。

#### 优缺点

1. 提供详细的安全策略和访问控制，支持多种安全策略，如基于角色的访问控制（RBAC）和类型强制访问控制（TE）等。
2. 通过强制访问控制（MAC）限制用户和进程对系统资源的访问，从而提高系统安全性。
3. 被广泛应用于许多 Linux 发行版，如 Red Hat Enterprise Linux (RHEL)、CentOS 和 Fedora 等。
4. 完全集成在内核中，提供强大的安全保护。

SELinux 的缺点包括配置和学习复杂，性能开销较大。因此，**它更适用于高度安全要求的环境，如政府、金融和敏感数据处理等场景。**在这些场合，SELinux 能够提供强大且灵活的安全策略，以满足不同的安全需求。

#### 常用命令

1. Enforcing：在此模式下，**SELinux 会执行所有安全策略并强制访问控制。**如果发现违反了安全策略，SELinux 将阻止访问并在审计日志中记录相关信息。这是 SELinux 的默认模式，旨在提供最高级别的系统安全保护。
2. Permissive：在此模式下，**SELinux 不会阻止任何违反安全策略的操作，但仍会在审计日志中记录违规行为。**这种模式通常用于调试和排错，因为它允许管理员了解哪些操作可能被阻止，同时不会对系统造成实际影响。
3. Disabled：在此模式下，**SELinux 完全禁用，不会执行任何安全策略。**所有操作都将按照传统的 Linux 访问控制（如文件权限和所有者）进行，而不受 SELinux 的影响。这种模式可能会降低系统安全性，因此不推荐在生产环境中使用。

    # 显示当前 SELinux 状态和概述
    sudo sestatus

    # 显示当前 SELinux 模式（enforcing, permissive, disabled）
    sudo getenforce

    # 设置 SELinux 模式（0 = permissive, 1 = enforcing）
    sudo setenforce 1

    # 更改文件或目录的 SELinux 上下文
    sudo chcon -t httpd_sys_content_t /var/www/html

    # 恢复文件或目录的默认 SELinux 上下文
    sudo restorecon -Rv /var/www/html

    # 管理 SELinux 的配置、布尔值、上下文等
    sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"

    # 搜索和分析 SELinux 的审计日志
    sudo ausearch -m AVC

    # 从审计日志生成 SELinux 策略模块
    sudo audit2allow -a -M my_new_module

    # 管理 SELinux 策略模块
    sudo semodule -i my_new_module.pp

### AppArmor

AppArmor（Application Armor）是一种 Linux 安全模块，目标是保护应用程序免受潜在威胁。AppArmor 通过强制访问控制（MAC）限制应用程序对系统资源的访问，以此增强系统的安全性。AppArmor 的安全策略配置相对简单，易于理解和配置，这主要得益于它基于路径的访问控制方式。

AppArmor 于 1998 年诞生，最初由 Immunix 公司开发，旨在为 Linux 系统提供一个易于管理且高效的安全解决方案。2005 年，Novell 收购了 Immunix 公司，并在同年将 AppArmor 开源。从那时起，AppArmor 成为了一个独立的开源项目，吸引了众多开发者和维护者的加入。

2007 年，AppArmor 成为 Ubuntu 7.10（Gutsy Gibbon）的默认安全模块。之后，其他 Linux 发行版，如 openSUSE 和 Debian，也开始支持 AppArmor。作为一种与 SELinux 并行的 Linux 安全模块，AppArmor 在易用性和性能上表现出了明显的优势，这使得它在个人电脑和服务器领域得到了广泛应用。

AppArmor 的实现是通过 Linux 内核安全模块（LSM）框架，这使得内核能够支持额外的安全策略。在 AppArmor 中，基于路径的访问控制策略被用来控制应用程序的访问权限。此外，通过简单的文本策略文件，AppArmor 可以定义允许的操作、文件访问权限等，进一步简化了策略配置和管理。

AppArmor 目前的发展方向主要集中在以下几个方面：

1. **简化策略配置和管理：**AppArmor 将继续简化安全策略的配置和管理，使其更易于使用和部署。
2. **提升性能：**AppArmor 会持续优化其性能，以满足日益增长的系统安全需求，并尽量减少性能开销。
3. **扩展功能和支持：**AppArmor 将继续扩展其功能，支持更多的 Linux 发行版和应用场景。同时，也可能引入新的安全机制，以增强其安全性能。
4. 社区合作：AppArmor 将继续与开源社区紧密合作，共同推动 Linux 安全模块的发展和完善。

#### 优缺点

1. **策略配置相对简单：**AppArmor 的访问控制策略基于路径，这使得策略配置易于理解和配置。
2. 增强系统安全性：通过限制应用程序对文件系统和其他资源的访问，AppArmor 能够有效增强系统的安全性。
3. 广泛应用于各种 Linux 发行版：AppArmor 已被多种 Linux 发行版如 Ubuntu、openSUSE 和 Debian 所支持和使用。
4. 策略隔离良好：AppArmor 可以针对单个应用程序进行策略配置，从而实现策略的隔离。
5. 低性能开销：相较于其它一些安全模块，AppArmor 的性能开销较低。

虽然 AppArmor 在许多方面表现出色，但它也存在一些缺点。例如，其安全策略相对简单，可能无法满足某些高度安全要求的场景。另外，AppArmor 不支持基于角色的访问控制。因此，**AppArmor 更适合于安全要求一般的环境，例如个人电脑和服务器等场景。**在这些场景中，AppArmor 可以提供简单而实用的安全策略，帮助用户有效地保护系统资源和数据。

#### 常用命令

    # 显示当前 AppArmor 状态和概述
    sudo apparmor_status

    # 设置指定配置文件为强制模式（enforce）
    sudo aa-enforce /etc/apparmor.d/usr.bin.firefox

    # 设置指定配置文件为投诉模式（complain）
    sudo aa-complain /etc/apparmor.d/usr.bin.firefox

    # 禁用指定配置文件
    sudo aa-disable /etc/apparmor.d/usr.bin.firefox

    # 生成指定程序的 AppArmor 配置文件
    sudo aa-genprof /usr/bin/firefox

    # 分析日志，根据需求更新 AppArmor 配置文件
    sudo aa-logprof

    # 自动生成 AppArmor 配置文件的依赖项
    sudo aa-autodep /usr/bin/firefox

    # 清理无用的配置文件
    sudo aa-cleanprof

    # 列出未受 AppArmor 限制的进程
    sudo aa-unconfined

### SELinux 与 AppArmor 对比

SELinux（Security-Enhanced Linux）和 AppArmor（Application Armor）都是为 Linux 系统设计的安全模块，用于实现访问控制安全策略，以增强系统安全性。尽管它们都提供了用于增强系统安全性的强制访问控制（MAC）机制，但每个框架都有其自己的优点和缺点，使其适用于不同的场景。

以下是 SELinux 和 AppArmor 的一些主要对比点：

特性 / 安全模块 | SELinux | AppArmor
--- | --- | ---
优点 | 详细的安全策略和访问控制；支持多种安全策略 | 策略配置简单；基于路径的访问控制；较低的性能开销
缺点 | 配置和学习复杂；性能开销较大 | 安全策略相对简单；不支持基于角色的访问控制
适用场景 | 高度安全要求的环境，例如军事或政府机构 | 一般安全要求的环境，例如个人电脑和服务器等
发行版本 | RHEL、CentOS、Fedora 等 | Ubuntu、openSUSE、Debian 等
学习曲线 | 陡峭，需要深入理解 SELinux 的安全策略 | 平缓，基于路径的策略使得配置更为简单
性能影响 | 可能较大，尤其是在处理大量文件访问时 | 通常较小，对性能的影响比 SELinux 小
策略灵活性 | 高，支持多种类型的安全策略，包括 RBAC 和 MLS | 较低，主要支持基于路径的访问控制
支持的访问控制 | 支持类型强制、角色基础访问控制和多级安全 | 主要是基于路径的访问控制
安全策略管理 | 涉及许多配置文件，策略更复杂 | 使用简单的文本策略文件，更易于管理和配置

总的来说，选择 SELinux 还是 AppArmor 取决于特定的需求和环境。如果需要一个强大而精细的安全策略，那么 SELinux 可能是更好的选择。然而，如果优先考虑易用性和性能，那么 AppArmor 可能更适合。

### TCP Wrappers

TCP Wrappers（TCP 包装器）是一个开源的网络服务请求过滤系统，用于实现主机基础的网络访问控制列表（ACL）。它通过使用访问控制文件来限制客户端对服务器资源的访问，进而增强服务器的安全性。

TCP Wrappers 最初由 Wietse Venema 开发，目的是提供一种简单的保护方式，能防止未经授权的访问者对服务器的潜在威胁。这个系统在网络管理员中非常受欢迎，因为它提供了一种简单有效的方式，用于监控和限制对网络服务的访问。

TCP Wrappers 的核心功能包括访问控制和日志记录：

1. 访问控制：TCP Wrappers 可以定义哪些主机或主机组能够访问服务器的某个特定服务。例如，你可以设置一个规则，仅允许来自特定 IP 地址的用户访问你的 SSH 服务。这种访问控制功能通过两个配置文件实现：/etc/hosts.allow 和 /etc/hosts.deny。当一个来自远程主机的请求尝试连接服务器的服务时，TCP Wrappers 会首先查看这两个文件，以确定是否允许或拒绝该连接。
2. 日志记录：除了访问控制，TCP Wrappers 也可以记录有关远程主机尝试连接服务器的信息。这些日志对于审计、问题诊断和网络管理都非常有用。如果发现有可疑的活动，网络管理员可以快速查看日志，以确定发生了什么，并采取相应的行动。

#### 优缺点

1. 提供简单而有效的访问控制和日志记录功能。
2. 容易安装和配置。
3. 可以与其他网络服务（如 xinetd 和 inetd）配合使用，以增强服务器的安全性。

虽然 TCP Wrappers 能够提供一定的网络服务保护，但是，这种保护并不是全方位的。具体来说，只有那些在编译时链接了 libwrap 库的服务才能受到 TCP Wrappers 的保护。此外，当面临一些复杂的网络攻击时，比如分布式拒绝服务攻击（DDoS），TCP Wrappers 可能无法提供充分的防护。

#### 常用命令

    # 编辑 /etc/hosts.allow 文件以允许某个主机或主机组访问一个服务
    echo "sshd : 192.168.1.0/255.255.255.0 : allow" >> /etc/hosts.allow

    # 编辑 /etc/hosts.deny 文件以拒绝某个主机或主机组访问一个服务
    echo "sshd : 192.168.1.0/255.255.255.0 : deny" >> /etc/hosts.deny

    # 使用 tcpdchk 命令检查 hosts.allow 和 hosts.deny 文件的语法和逻辑错误
    tcpdchk

    # 使用 tcpdmatch 命令模拟来自特定主机的连接请求，看它是否会被允许或拒绝
    tcpdmatch sshd 192.168.1.100

通过正确地配置和使用 TCP Wrappers，你可以大大提高你的服务器的安全性，并有能力追踪和控制对你的网络服务的访问。

### Auditd

Auditd 是 Linux 审计框架的核心组件，用于收集来自内核中的审计记录。它允许系统管理员跟踪在系统上发生的活动，以便在系统安全出现问题时追溯和分析。

Auditd 的起源可以追溯到 Linux 内核版本 2.6 的早期，当时引入了新的审计框架。该框架由内核部分（生成审计事件记录）和用户空间部分（接收和处理这些记录）组成。Auditd 就是用户空间部分的主要组件。

主要功能包括系统调用追踪、文件和目录访问监控、系统启动和关闭日志等。其主要用于帮助管理员诊断问题、满足合规性要求、并提高系统的安全性。

Auditd 的运行可以通过 service 或 systemctl 命令进行管理，如启动（service auditd start）、停止（service auditd stop）、查看状态（service auditd status）等。

Auditd 可以通过 audit.rules 文件配置审计规则，这些规则定义了应生成哪些类型的审计记录。例如，可以跟踪所有对特定文件的操作，或者监视所有的用户和组管理活动。审计规则的配置需要具有很高的灵活性和精确性，以便系统管理员可以精确地获取他们需要的信息。

然而，auditd 的使用和配置可能会相当复杂，需要一定的专业知识才能有效地使用。

#### 运行模式

auditd 的运行模式主要是启动和停止，启动 auditd 后，它将开始收集审计事件并将其记录到日志文件中，通常是 /var/log/audit/audit.log。停止 auditd 后，系统将停止记录审计事件。

#### 优缺点

1. 提供了详尽的系统活动日志记录，可以帮助系统管理员诊断问题、满足合规性要求，并提高系统的安全性。
2. 审计规则的配置具有很高的灵活性和精确性。
3. 广泛用于许多 Linux 发行版，如 Red Hat Enterprise Linux (RHEL)、CentOS 和 Fedora 等。

auditd 的主要缺点是配置和使用相对复杂，对于新手可能有些困难。

#### 常用命令

    # 启动 auditd 服务
    systemctl start auditd

    # 停止 auditd 服务
    systemctl stop auditd

    # 显示 auditd 服务状态
    systemctl status auditd

    # 显示当前的审计规则
    auditctl -l

    # 监控对 /etc/passwd 文件的写访问和更改属性操作
    auditctl -w /etc/passwd -p wa

    # 创建一个审计规则，用于记录所有因权限不足而失败的文件打开尝试
    auditctl -a always,exit -F arch=b64 -S open -F exit=-EACCES -k access_denied

    # 搜索今天的所有 SELinux AVC 事件
    ausearch -m avc -ts today

    # 生成一个包含所有被执行程序的摘要报告
    aureport -x --summary

## 加密和认证技术

加密和认证技术对于确保系统安全至关重要。以下是一些常见的加密和认证技术：

1. SSL 和 TLS：SSL（Secure Sockets Layer）和 TLS（Transport Layer Security）是用于在网络通信中提供安全层的协议。它们用于保护数据的隐私和完整性。TLS 是 SSL 的后续版本，目前更为常用。
2. SSH：SSH（Secure Shell）是一种网络协议，用于安全地远程连接到服务器。SSH 提供了强大的认证和安全通信功能，包括加密远程会话和传输文件。
3. PGP（Pretty Good Privacy）：PGP 是一种数据加密和解密程序，提供加密、解密和数字签名的服务。它常用于保护电子邮件的隐私和完整性，同时也可用于加密文件和存储设备。
4. 公钥基础设施（PKI）和证书颁发机构（CA）：PKI 是一套基于公钥密码学的加密体系结构，用于生成、管理和分发数字证书。证书颁发机构是负责验证用户身份并颁发数字证书的可信实体。
5. 一次性密码（OTP）和多因素认证（MFA）：OTP 是一种仅限单次使用的密码，用于增强身份验证的安全性。MFA 要求用户提供两个或多个不同类型的身份验证因素，例如密码、指纹识别、硬件令牌或手机验证码。
6. IPSec（Internet Protocol Security）：IPSec 是一组协议和算法，用于在网络层提供数据的机密性、完整性和身份验证。它常用于虚拟私有网络（VPN）和远程访问连接的安全保护。
7. 数字证书：数字证书是由证书颁发机构颁发的电子文件，用于验证用户、服务器或组织的身份。数字证书使用公钥密码学来验证身份，并可用于安全通信和电子交易。
8. 访问控制列表（ACL）：ACL 是一种用于控制网络设备上的流量的机制。它基于源 IP 地址、目标 IP 地址、协议和端口号等条件来决定数据包的接受或拒绝。
9. 防火墙：防火墙是一种网络安全设备，用于监控和控制进出网络的流量。它可以根据预定义的安全策略过滤流量，以阻止未经授权的访问和网络攻击。
10. 单点登录（SSO）：SSO 是一种身份验证机制，允许用户使用单一的凭据（如用户名和密码）访问多个相关系统。这减少了用户需要记住多个凭据的负担，并提供了更方便的身份验证体验。
11. 加密硬件设备：加密硬件设备（如硬件安全模块）提供了物理级别的安全性，用于存储和处理敏感数据、生成和管理密钥，并执行加密操作。这些设备通常具有更高的安全性和防护能力。
12. 双因素认证（2FA）：双因素认证要求用户在登录过程中提供两个或多个不同类型的身份验证凭据，如密码、硬件令牌、指纹识别或短信验证码。这提供了更强的身份验证保护，即使密码被泄露也能降低风险。
13. 安全套接层虚拟专用网（SSL VPN）：SSL VPN 是一种通过 SSL/TLS 协议提供远程访问安全性的技术。它允许用户通过加密通道连接到内部网络，并通过认证和授权机制进行访问控制。

综上所述，系统安全涉及许多复杂的方面。了解和应用这些基本概念、原则以及正确使用相关工具和技术，对于有效保护信息系统免受威胁和攻击至关重要。