第10章 安全(保护系统资源)
一、导读
1.1 本章学习目标
理解计算机安全的基本概念:机密性、完整性和可用性(CIA三元组)
掌握常见的安全威胁类型:病毒、蠕虫、特洛伊木马、缓冲区溢出等
了解认证(Authentication)的机制和方法:密码、令牌、生物特征
理解授权(Authorization)的模型:访问控制列表、能力表、RBAC
掌握加密技术的基本原理:对称加密、非对称加密和哈希函数
了解操作系统提供的安全机制:地址空间布局随机化、数据执行保护等
理解审计(Audit)的作用和实现方式
了解现代操作系统的安全架构和发展趋势
1.2 为什么本章如此重要
安全是操作系统设计中最重要也最具挑战性的方面。随着互联网的普及和计算环境的复杂化,安全威胁日益严峻。恶意软件每年造成数千亿美元的经济损失,数据泄露事件频繁发生,勒索软件攻击威胁着企业和个人的数据安全。操作系统作为计算机系统的核心,其安全性直接决定了整个系统的安全水平。
从技术角度看,安全问题贯穿操作系统的所有子系统。进程管理需要防止进程间的非法干扰,内存管理需要实现地址空间隔离,文件系统需要控制文件的访问权限,I/O系统需要保护设备不被非法访问,网络子系统需要防御网络攻击。安全不是独立的功能模块,而是需要融入系统设计的每个方面。
从职业发展角度看,安全知识已经成为IT从业者的必备技能。无论是系统管理员、软件开发者还是安全工程师,都需要理解操作系统的安全原理。了解缓冲区溢出有助于编写安全的代码,了解加密技术有助于保护敏感数据,了解访问控制有助于设计安全的系统架构。安全意识的培养对于每个计算机专业人员都至关重要。
1.3 核心问题引导
什么是CIA三元组?机密性、完整性和可用性之间有什么权衡关系?
缓冲区溢出攻击的原理是什么?操作系统提供了哪些防护措施?
对称加密和非对称加密有什么区别?各自适用于什么场景?
访问控制列表(ACL)和能力表(Capability Table)各有什么优缺点?
为什么密码存储使用哈希而不是加密?加盐(Salt)的作用是什么?
强制访问控制(MAC)和自主访问控制(DAC)有什么区别?
零信任(Zero Trust)安全模型的核心思想是什么?与传统安全模型有什么不同?
二、核心概念详解
2.1 安全威胁与攻击类型
安全威胁(Threat)是可能危害系统安全的潜在事件或行为。常见的安全威胁包括以下几类。
恶意软件(Malware)是故意设计用于破坏系统或窃取信息的软件。病毒(Virus)附着在合法程序上,通过用户执行被感染程序传播,需要宿主程序。蠕虫(Worm)是独立的程序,通过网络自动传播,不需要宿主程序,可以快速感染大量主机。特洛伊木马(Trojan Horse)伪装成合法程序,暗中执行恶意功能,如窃取密码或安装后门。勒索软件(Ransomware)加密用户文件并要求赎金解密。间谍软件(Spyware)秘密收集用户信息并发送给攻击者。
缓冲区溢出(Buffer Overflow)是向程序的缓冲区写入超出其容量的数据,覆盖相邻内存区域。攻击者可以精心构造溢出数据,覆盖返回地址使程序跳转到恶意代码。缓冲区溢出是最经典的攻击方式之一,影响了大量软件。栈溢出覆盖函数的返回地址,堆溢出覆盖堆上的数据结构,格式化字符串漏洞利用printf等函数的格式化参数泄露或修改内存。
拒绝服务攻击(Denial of Service, DoS)通过大量请求耗尽目标系统的资源(CPU、内存、带宽),使合法用户无法获得服务。分布式拒绝服务(DDoS)使用大量被控制的计算机(僵尸网络)同时发起攻击,流量可达数百Gbps。SYN Flood利用TCP三次握手的缺陷,发送大量SYN请求但不完成握手,耗尽服务器的半连接队列。
社会工程学(Social Engineering)通过欺骗、诱导等心理操纵手段获取敏感信息。钓鱼(Phishing)通过伪造网站或邮件诱骗用户输入密码和信用卡信息。鱼叉式钓鱼(Spear Phishing)针对特定个人或组织的精准钓鱼。
2.2 认证机制
认证(Authentication)是验证用户或进程身份的过程,是访问控制的第一道防线。常见的认证方式基于三个因素:你知道什么(Knowledge Factor)——如密码、PIN码;你拥有什么(Possession Factor)——如智能卡、手机令牌、硬件安全密钥;你是什么(Inherence Factor)——如指纹、虹膜、面部识别。多因素认证(MFA)结合两种或以上因素,安全性远高于单因素认证。
密码认证是最广泛使用的方式,但面临诸多挑战。密码存储不能使用明文或可逆加密——如果数据库被攻破,所有密码泄露。正确的做法是存储密码的哈希值(Hash),验证时计算输入密码的哈希并与存储值比较。但简单的哈希仍然容易受到彩虹表(Rainbow Table)攻击——预计算大量常见密码的哈希值。加盐(Salt)为每个用户的密码添加随机字符串后再哈希,即使两个用户使用相同密码,存储的哈希值也不同,彩虹表失效。现代密码哈希算法(如bcrypt、scrypt、Argon2)故意设计为计算缓慢,增加暴力破解的成本。
生物特征认证使用指纹、面部、虹膜等生理特征进行身份验证。优点是方便(不需要记忆密码)且难以伪造。缺点是存在误识率(False Acceptance Rate)和拒识率(False Rejection Rate),且生物特征一旦泄露无法更换。
2.3 授权与访问控制
授权(Authorization)决定已认证的用户或进程可以访问哪些资源,执行哪些操作。访问控制模型定义了授权的策略和机制。
自主访问控制(Discretionary Access Control, DAC)允许资源的所有者自主决定谁可以访问其资源。UNIX的文件权限(rwxrwxrwx)是DAC的典型实现——文件所有者可以设置读、写、执行权限给所有者、组和其他用户。DAC灵活但安全性有限——恶意用户可以将文件权限设置为所有人可读,导致信息泄露。
强制访问控制(Mandatory Access Control, MAC)由系统强制执行安全策略,用户不能更改。MAC为每个主体(用户/进程)和客体(文件/资源)分配安全标签(Security Label),如绝密、机密、秘密、公开。访问决策基于主体标签和客体标签的比较。Bell-LaPadula模型保证机密性——不上读(不能读取更高密级)、不下写(不能向更低密级写入)。MAC适用于军事和政府系统,SELinux是Linux上的MAC实现。
基于角色的访问控制(Role-Based Access Control, RBAC)将权限分配给角色,用户通过被分配角色获得权限。RBAC简化了权限管理——不需要为每个用户单独配置权限,只需要管理角色和角色分配。角色可以分层(如管理员→经理→员工),支持职责分离(Separation of Duty)——敏感操作需要多个角色协同完成。
访问控制列表(Access Control List, ACL)为每个资源维护一个列表,记录哪些主体可以访问以及访问权限。ACL灵活且直观,Windows NTFS文件系统使用ACL。能力表(Capability List)为每个主体维护一个列表,记录该主体可以访问哪些资源及权限。能力表以主体为中心,查找某用户可以访问的资源更高效。能力令牌(Capability Token)可以安全地传递给其他进程,实现权限的安全委托。
2.4 加密技术
加密(Encryption)使用数学算法将明文转换为密文,保护数据的机密性。对称加密(Symmetric Encryption)使用相同的密钥进行加密和解密,如AES(Advanced Encryption Standard)。对称加密速度快,适用于大量数据加密,但密钥分发是挑战——通信双方需要安全地共享密钥。
非对称加密(Asymmetric Encryption)使用公钥/私钥对,公钥加密的数据只有私钥能解密,如RSA和ECC(Elliptic Curve Cryptography)。非对称加密解决了密钥分发问题——公钥可以公开,私钥保密。但非对称加密速度远慢于对称加密(慢100-1000倍)。实际应用中通常结合两者:使用非对称加密协商对称密钥,然后使用对称密钥加密数据(如TLS协议)。
哈希函数(Hash Function)将任意长度的输入映射为固定长度的输出(哈希值),具有单向性(不可逆)和抗碰撞性(难以找到两个不同输入产生相同输出)。哈希函数用于密码存储、数据完整性校验和数字签名。常见的哈希算法包括SHA-256和SHA-3。MD5和SHA-1已被证明不安全,不应再使用。
数字签名(Digital Signature)使用发送者的私钥对数据的哈希值进行加密,接收者使用发送者的公钥验证签名。数字签名保证数据的完整性(数据未被篡改)和不可否认性(发送者不能否认发送过该数据)。数字证书(Digital Certificate)由证书颁发机构(CA)签发,将公钥与身份绑定,防止中间人攻击。
三、深入分析与讨论
3.1 操作系统安全机制
现代操作系统提供了多层次的安全机制。地址空间布局随机化(ASLR, Address Space Layout Randomization)在每次程序启动时随机化代码段、数据段、堆和栈的基地址,使攻击者无法预测目标地址,大幅增加缓冲区溢出攻击的难度。
数据执行保护(DEP, Data Execution Prevention)/不可执行位(NX Bit)将数据区域(堆、栈)标记为不可执行,即使攻击者成功注入了恶意代码也无法执行。DEP是硬件级别的保护,由CPU的页表项中的NX位实现。
栈保护(Stack Canary/Stack Cookie)在函数的栈帧中插入随机值(Canary),函数返回前检查Canary是否被修改。如果缓冲区溢出覆盖了返回地址,必然也会覆盖Canary,检测到Canary被修改则终止程序。
控制流完整性(Control-Flow Integrity, CFI)确保程序的执行流只遵循合法的控制流图。即使攻击者修改了内存,也无法将执行流重定向到任意位置。Intel CET(Control-flow Enforcement Technology)提供了硬件级的CFI支持。
沙箱(Sandbox)将程序限制在一个受限的环境中运行,限制其对文件系统、网络和系统资源的访问。Chrome浏览器的每个标签页运行在独立的沙箱中,即使某个标签页被攻破也无法影响系统。Linux的seccomp-bpf和namespaces提供了沙箱的底层支持。容器(如Docker)基于namespaces和cgroups实现进程隔离。
3.2 安全模型的发展趋势
零信任(Zero Trust)安全模型的核心思想是"永不信任,始终验证"。与传统基于边界的防御模型不同,零信任假设网络内部和外部同样危险,每次访问请求都需要验证身份和权限。零信任的关键原则包括:身份验证(每个用户和设备都需要认证)、最小权限(只授予完成任务所需的最小权限)、微分段(将网络划分为小区域限制横向移动)、持续验证(不是一次认证永久信任,而是持续评估风险)。
可信执行环境(Trusted Execution Environment, TEE)在CPU中创建隔离的执行区域,即使操作系统被攻破也无法访问TEE中的数据。Intel SGX(Software Guard Extensions)和ARM TrustZone提供了TEE的硬件支持。TEE用于保护敏感操作如数字版权管理、支付处理和密钥管理。
形式化验证(Formal Verification)使用数学方法证明系统的安全属性。seL4微内核是经过形式化验证的安全内核,数学上证明了其隔离性和安全属性的正确性。形式化验证成本高昂但提供了最高级别的安全保证,适用于航空航天和军事等高安全需求领域。
四、实践案例
4.1 Linux安全架构
Linux提供了多层次的安全机制。用户/组权限(DAC)通过UID/GID和rwx权限控制文件访问。ACL扩展了传统权限,支持更细粒度的访问控制。SELinux实现了MAC,通过安全策略强制限制进程和文件的访问,即使root用户也受策略约束。Capabilities将root权限细分为多个独立的能力(如CAP_NET_BIND_SERVICE允许绑定特权端口),减少过度特权的风险。
namespaces提供进程隔离,每个namespace有独立的PID、网络、文件系统和用户空间。容器技术(Docker、Kubernetes)基于namespaces实现。cgroups限制进程组的资源使用(CPU、内存、I/O),防止资源耗尽攻击。seccomp限制进程可以使用的系统调用,减少攻击面。
4.2 TLS/SSL协议的安全保障
TLS(Transport Layer Security)保护网络通信的机密性和完整性,广泛用于HTTPS、电子邮件和即时通讯。TLS握手过程:客户端发送支持的加密套件列表 → 服务器选择套件并发送证书 → 客户端验证证书 → 客户端生成预主密钥并用服务器公钥加密发送 → 双方根据预主密钥计算会话密钥 → 使用会话密钥进行对称加密通信。
TLS的安全依赖于多个层面:非对称加密用于密钥交换(RSA或ECDHE),对称加密用于数据传输(AES-GCM),哈希函数用于完整性校验(SHA-256),数字证书用于身份验证(X.509证书由CA签发)。TLS 1.3简化了握手过程(1-RTT甚至0-RTT),移除了不安全的加密算法,提高了安全性和性能。
五、常见误区与注意事项
加密不等于安全:加密只保护数据的机密性,安全还包括完整性、可用性、认证和授权等多个方面。一个系统可能使用了强加密但仍然存在其他安全漏洞(如SQL注入、XSS)。
密码复杂度不等于安全性:强密码策略是必要的,但如果密码存储方式不安全(如明文存储或使用弱哈希算法),再复杂的密码也无法保护。密码安全需要综合考虑存储、传输和验证的各个环节。
防火墙不能防止所有攻击:防火墙控制网络流量,但不能检测加密流量中的恶意内容,不能防止社会工程学攻击,不能修复软件漏洞。安全需要纵深防御(Defense in Depth),结合多种安全措施。
权限最小化不是限制用户:最小权限原则是为了降低安全风险——如果程序被攻破,攻击者只能获得有限的权限。这不是对用户的不信任,而是对系统安全的负责。
安全没有银弹:没有单一的安全措施可以解决所有问题。安全是一个持续的过程,需要技术、管理和人员三方面的配合。定期的安全审计、漏洞扫描和补丁更新是维持安全的必要措施。
六、本章小结
本章全面介绍了操作系统安全的核心概念和防护机制。安全威胁形式多样且不断演进,包括恶意软件、缓冲区溢出、拒绝服务攻击和社会工程学等。认证和授权构成了访问控制的基础,多因素认证提高了身份验证的安全性。DAC、MAC和RBAC是三种主要的访问控制模型,各有适用场景。加密技术为数据传输和存储提供了安全保障,对称加密和非对称加密各有优势,实际应用中通常结合使用。现代操作系统通过ASLR、DEP、栈保护和沙箱等机制增强了安全性。零信任模型代表了安全架构的发展趋势,强调持续验证和最小权限。安全是一个持续的过程,需要系统设计者、开发者和用户的共同努力。
七、思考题与练习
解释CIA三元组的含义,分析三者之间的权衡关系。
描述缓冲区溢出攻击的原理,说明ASLR和DEP如何防御这种攻击。
比较对称加密和非对称加密的优缺点,说明TLS协议如何结合两者。
设计一个RBAC方案,为一个小型公司定义角色和权限。
解释密码哈希和加盐的作用,说明为什么不能使用简单的MD5存储密码。
比较DAC、MAC和RBAC三种访问控制模型的特点和适用场景。
分析零信任安全模型的核心思想,与传统边界防御模型有什么区别?
研究SELinux的安全策略配置,说明它如何实现强制访问控制。