数据库系统の安全与完整性谁来保护你的数据你存在银行的钱、你的社交账号密码、你的体检报告——这些数据在数据库里到底靠什么保证不被偷看、不被乱改数据库的保护伞有两把安全性防的是坏人非法用户完整性防的是坏数据非法操作。这篇文章把这两把伞从里到外讲透——身份鉴别怎么验明正身、GRANT/REVOKE怎么管权限、三大完整性约束怎么防错数据、触发器怎么自动兜底。期末考试要考安全与完整性的同学这一篇就够了。本文目录安全性概述数据库面临哪些威胁身份鉴别你是你吗存取控制DAC与MAC视图、审计与加密完整性概述防坏数据三大完整性约束详解高级完整性机制触发器与断言安全性 vs 完整性一文厘清一、安全性概述数据库面临哪些威胁1.1 什么是数据库安全性数据库安全性简单说就是防止非法用户对数据库的非法使用防止合法用户对数据库的非法操作。核心目标是防止数据被泄露、篡改或破坏。数据库安全面临的威胁与防护方法注意一个常见混淆安全性 ≠ 完整性。安全性防的是谁在操作Who——不让不该碰数据的人碰到数据。完整性防的是操作什么What——不让合法用户往数据库里塞错误数据。打个比方安全性是门禁只有持卡人能进大楼完整性是规章制度进了大楼也不能乱扔垃圾。1.2 数据库面临的四大威胁非授权用户存取数据——没有账号的黑客通过SQL注入等手段非法访问数据。授权用户越权操作——有合法账号但干了不该干的事。比如一个普通员工偷偷查看了全公司的工资表。数据泄露推理攻击——用户虽然不能直接看到敏感数据但可以通过多次查询的结果推理出来。比如查部门A的平均工资和部门A除张三外的平均工资两个一减就能算出张三的工资。拒绝服务攻击DoS——通过大量无效请求耗尽数据库资源让正常用户无法使用。1.3 安全控制的五大方法面对这些威胁DBMS提供了五层防护身份鉴别Authentication——验明正身确认你是谁。存取控制Authorization——权限管理决定你能做什么。审计Audit——操作记录追踪你做了什么。数据加密Encryption——数据保护即使被偷走也看不懂。视图机制View——数据过滤只让你看到该看的部分。二、身份鉴别你是你吗用户要访问数据库首先得证明我是我。身份鉴别是安全控制的第一道关卡。2.1 静态口令鉴别最常见的方案用户名 密码。简单、成本低但安全性也最低——密码可能被猜到、被偷看、被暴力破解。大多数数据库系统MySQL、Oracle等都支持这种方式。2.2 动态口令鉴别一次性密码OTP——每次登录的密码都不同。常见形式手机短信验证码、动态令牌银行U盾。比静态口令安全得多因为即使本次密码被偷窥下次也用不了。2.3 生物特征鉴别利用指纹、虹膜、面部识别等生物特征来鉴别。安全性高、不可伪造但成本也高。目前主要用于高安全级别的场景如银行金库、军事设施。2.4 数字证书鉴别基于PKI公钥基础设施用数字证书证明身份。安全性最高常用于网络传输和重要系统之间的身份认证。三、存取控制DAC与MAC身份鉴别解决了你是谁的问题存取控制解决你能做什么。3.1 自主存取控制DACDAC与MAC两种存取控制方式对比DACDiscretionary Access Control——数据的所有者可以自主决定把数据的使用权限授予谁。这是最灵活、最常用的存取控制方式。GRANT授权GRANT SELECT ON TABLE Employee TO Alice; GRANT INSERT, UPDATE ON TABLE Student TO Bob; GRANT ALL PRIVILEGES ON TABLE Course TO Charlie;GRANT语句的格式GRANT 权限 ON 对象 TO 用户。权限包括SELECT查询、INSERT插入、UPDATE修改、DELETE删除、ALL PRIVILEGES全部权限。WITH GRANT OPTION——如果加上这个选项被授权的用户还可以把权限转授给其他人。这就形成了一个权限链GRANT SELECT ON TABLE Employee TO Alice WITH GRANT OPTION; -- Alice 可以再授权给 Bob GRANT SELECT ON TABLE Employee TO Bob; -- Alice执行REVOKE回收权限REVOKE SELECT ON TABLE Employee FROM Alice; REVOKE INSERT ON TABLE Student FROM Bob CASCADE;CASCADE级联回收——如果Alice曾经把权限转授给了Bob那么回收Alice的权限时Bob的权限也会被一起回收。这是为了防止权限链失控。3.2 强制存取控制MACMACMandatory Access Control——系统强制实施存取规则用户不能自行控制。主要用于高安全性场景军事、政府。MAC给每个数据对象和每个用户分别标记密级。密级从低到高公开 秘密 机密 绝密。MAC的核心规则只有两条读向下Read Down——用户只能读取密级不高于自己安全级别的数据。绝密级用户可以读所有数据公开级用户只能读公开数据。写向上Write Up——用户只能写入密级不低于自己安全级别的数据。这是为了防止高密级用户把敏感信息写到低密级的数据对象中信息泄露。DAC与MAC的关系——DAC是基础MAC更严格。实际系统中先检查DAC用户有没有被授权通过后再检查MAC用户的密级是否满足要求。3.3 角色Role当用户很多时逐个授权太麻烦。角色Role把一组权限打包CREATE ROLE manager; GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE Employee TO manager; GRANT manager TO Alice, Bob, Charlie; -- 一次性给三个人授权角色的好处简化权限管理。员工入职时授予角色离职时回收角色权限变更时只需修改角色的权限定义。GRANT与REVOKE权限的授予与回收四、视图、审计与加密4.1 视图的安全作用视图View是一种虚拟表它不存储实际数据而是从基本表中查询数据。视图的安全作用在于隐藏敏感列——比如员工表有工资列可以通过视图只暴露姓名、部门隐藏工资。限制行级访问——比如普通部门经理只能看到本部门员工的数据。CREATE VIEW EmpView AS SELECT Ename, Dno, Job FROM Employee; -- 用户查询EmpView时看不到Salary列但视图的安全能力有限——它只是辅助手段不能替代DAC和MAC。4.2 审计Audit审计就是装监控——记录用户对数据库的所有操作谁在什么时间对什么数据做了什么。审计日志用于事后追踪和安全分析。比如发现数据被篡改了可以查审计日志找到是谁在什么时间做的修改。审计的代价每次操作都需要额外写日志会影响系统性能。因此审计通常只在高安全性要求的环境中开启。4.3 数据加密即使攻击者绕过了所有身份鉴别和存取控制把数据偷走了加密也能让他们拿到的只是一堆乱码。透明数据加密TDE——对应用层透明数据库自动加密和解密。应用不需要改代码。应用级加密——应用层加密后存入数据库数据库本身存的是密文。安全性更高但应用需要处理加解密逻辑。列级加密——只对敏感列如密码、身份证号加密其他列不加密。加密算法分两类对称加密如AES——加解密使用同一个密钥速度快适合大量数据。非对称加密如RSA——公钥加密、私钥解密安全性更高常用于密钥交换和数字签名。五、完整性概述防坏数据从这一节开始话题从防坏人转向防坏数据。5.1 什么是完整性完整性Integrity是指数据的正确性Correctness和相容性Compatibility。正确性数据是否符合现实世界的事实。比如年龄不能是负数性别只能是男或女。相容性同一事物在不同地方的描述是否一致。比如学生表里张三的学号和选课表里张三的学号必须一致。5.2 完整性控制的三个环节定义完整性约束——声明数据必须满足什么条件。比如主码不能为空、年龄必须在0到150之间。检查完整性约束——每当用户执行插入、修改、删除操作时DBMS自动检查操作是否违反了已定义的约束。处理违约操作——如果违反了约束怎么办拒绝操作级联修改还是置为空值六、三大完整性约束详解6.1 实体完整性三大完整性约束实体完整性、参照完整性、用户定义完整性规则主码不能为空NOT NULL且主码值必须唯一。为什么因为主码的作用是唯一标识一个元组一行记录。如果主码为空就无法区分不同的元组如果主码重复就无法唯一确定某个元组。定义方式-- 列级约束 CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Sname VARCHAR(20) NOT NULL ); -- 表级约束 CREATE TABLE SC ( Sno CHAR(9), Cno CHAR(4), Grade INT, PRIMARY KEY (Sno, Cno) -- 复合主码 );违反处理直接拒绝插入或更新操作。比如试图插入一条Sno为空的记录DBMS会报错并拒绝。6.2 参照完整性规则外码的值必须是被引用关系主码的有效值或者为空值NULL。为什么因为外码表示的是引用关系——比如学生表里的院系编号引用了院系表的主码。如果学生的院系编号在院系表中不存在就意味着这个学生属于一个不存在的院系——这显然是不合理的。定义方式CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Sname VARCHAR(20), Dno CHAR(3), FOREIGN KEY (Dno) REFERENCES Department(Dno) );参照完整性的四种违约处理策略违约处理策略——当操作导致参照完整性被违反时有四种处理方式NO ACTION拒绝——直接拒绝导致违约的操作。这是默认策略也是最安全的。CASCADE级联——连带执行相关操作。比如删除一个院系时自动删除该院系下所有学生。SET NULL置空——将外码值设为NULL。比如删除一个院系时该院系学生的院系编号设为空。SET DEFAULT置默认值——将外码值设为预定义的默认值。CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Dno CHAR(3), FOREIGN KEY (Dno) REFERENCES Department(Dno) ON DELETE CASCADE -- 删除院系时级联删除学生 ON UPDATE SET NULL -- 修改院系编号时将学生院系置空 );选择哪种策略取决于具体业务需求。一般情况下NO ACTION最安全CASCADE适合父子关系订单和订单明细。6.3 用户定义完整性除了实体完整性和参照完整性这两种通用约束每个应用还有自己特定的数据约束——这就是用户定义完整性。NOT NULL——非空约束。某些属性不能为空如姓名。UNIQUE——唯一约束。某些属性的值不能重复如身份证号。CHECK——检查约束。属性值必须满足指定条件CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Sname VARCHAR(20) NOT NULL, Sage INT CHECK (Sage 15 AND Sage 45), Ssex CHAR(2) CHECK (Ssex IN (男, 女)), Dno CHAR(3) UNIQUE );DEFAULT——默认值。如果插入时没有指定该列的值自动使用默认值。七、高级完整性机制触发器与断言7.1 触发器Trigger触发器是一种特殊的存储过程——在特定事件发生时自动执行。CREATE TRIGGER delete_student_courses AFTER DELETE ON Student FOR EACH ROW BEGIN DELETE FROM SC WHERE Sno OLD.Sno; END;这个触发器的含义当从Student表中删除一条记录时自动从SC选课表中删除该学生的所有选课记录。触发器三要素触发事件INSERT/UPDATE/DELETE、触发时机BEFORE/AFTER、触发器体要执行的SQL语句。触发器的用途很广实现复杂的完整性约束跨表约束、自动审计记录谁在什么时间修改了什么数据、自动维护派生数据如自动更新统计表。7.2 存储过程Stored Procedure存储过程是预编译的SQL语句集合可以包含业务逻辑和完整性检查。CREATE PROCEDURE enroll_student(IN sno CHAR(9), IN cno CHAR(4)) BEGIN DECLARE max_cap INT; SELECT capacity INTO max_cap FROM Course WHERE Cno cno; IF (SELECT COUNT(*) FROM SC WHERE Cno cno) max_cap THEN INSERT INTO SC VALUES (sno, cno, NULL); ELSE SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT 课程已满; END IF; END;存储过程的好处封装业务逻辑选课人数限制在过程里检查不用每个应用都写一遍、减少网络传输一次调用完成多个操作、提高性能预编译不用每次解析SQL。7.3 断言Assertion断言是一种更一般化的完整性约束可以涉及多个表的全局约束CREATE ASSERTION student_course_limit CHECK (NOT EXISTS ( SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) 10 ));这个断言的含义每个学生最多选10门课。断言功能强大但目前大多数主流DBMSMySQL、PostgreSQL等并不完全支持断言。实际开发中通常用触发器或存储过程来替代断言实现类似的全局约束。八、安全性 vs 完整性一文厘清安全性与完整性两种不同的数据保护机制这两个概念容易混淆这里做一个清晰的对比对比维度安全性Security完整性Integrity保护对象防止非法用户/非法操作防止错误数据/不一致数据核心问题Who——谁能访问数据What——什么数据是合法的比喻门禁系统规章制度主要手段身份鉴别、授权、加密、审计约束、触发器、存储过程SQL实现GRANT/REVOKEPRIMARY KEY/FOREIGN KEY/CHECK/触发器违反后果数据泄露、被篡改、被破坏数据错误、不一致、失去意义两者的联系它们相辅相成共同保护数据库。视图既是安全机制限制用户只能看到部分数据也是完整性的辅助手段。触发器可以同时服务于安全审计触发器记录操作和完整性约束触发器检查数据。总结数据库的保护伞有两把缺一不可安全性——五层防护层层把关身份鉴别你是谁→ 存取控制你能做什么DAC用GRANT/REVOKE管理权限MAC用密级控制读写→ 视图只让你看该看的→ 审计记录你做了什么→ 加密即使偷走也看不懂。完整性——三个环节环环相扣定义约束声明规则→ 检查约束操作时自动验证→ 处理违约拒绝/级联/置空/默认值。三大完整性约束各司其职实体完整性保主码、参照完整性保引用、用户定义完整性保业务规则。高级机制触发器、存储过程、断言处理更复杂的场景。一句话总结安全性是不让不该碰数据的人碰到数据完整性是不让合法的人往数据库里塞垃圾数据——一个防外贼一个防内鬼的失误。