数据库安全性控制
数据库安全性控制
复习定位
数据库存储的是企业最核心的数据——客户信息、订单、财务记录——这些数据的机密性、完整性和可用性必须得到保障。数据库安全控制是多层的:认证(你是谁)→授权(你能做什么)→审计(你做了什么)→加密(数据在传输和存储时不被窃取)。在web应用中——SQL注入是数据库安全最常见的威胁——必须使用参数化查询而非字符串拼接开发SQL。
用户身份认证
数据库管理系统在用户登录时验证用户的身份——最常见的方式是密码认证(输入用户名密码——与系统表中存储的密码哈希值比对)。还支持基于操作系统的认证(无需输入密码——利用SSPI或PAM集成登录)、双因子认证(密码+硬件Token)、SSL证书认证(客户端需要提供有效的证书)。
存取控制
自主存取控制(DAC, Discretionary Access Control)——用户对自己创建的表可以授予(GRANT)或收回(REVOKE)其他用戶的访问权限。SQL标准通过GRANT和REVOKE实现:
GRANT SELECT, INSERT ON orders TO alice;
GRANT ALL PRIVILEGES ON orders TO alice WITH GRANT OPTION;
-- WITH GRANT OPTION使alice可以将此权限授予其他人
REVOKE INSERT ON orders FROM alice CASCADE;SQL权限涵盖SELECT/INSERT/UPDATE/DELETE/REFERENCES(引用外键)/USAGE(使用序列等)/ALL PRIVILEGES。
强制存取控制(MAC, Mandatory Access Control)——系统为每个主体(用户/进程)和客体(表/行)分配一个安全级别或安全标签——主体只能读取级别不高于自己级别的数据——只能写入级别不低于自己级别的数据。MAC在军事和政府机构中用于多级安全(如绝密/机密/秘密/非密)分类。DBMS的典型实现使用安全标签和强制规则。
视图机制
视图可以隐藏表中的某些列或行——限制用户只能看到允许查看的部分。例如——创建一个不含薪位列的视图——将视图的查询权限授予普通用户——用户不能通过视图看到薪金列。
审计
审计日志记录所有对数据库的操作(登录、查询、修改、权限变更)。审计是安全的事后追溯手段——当发生数据泄露时——通过审计日志追踪到责任人。大多数DBMS可以配置审计规则——例如只审计对特定敏感表(如salary)的修改操作。
数据加密
传输加密——客户端与数据库服务器之间的通信通过TLS加密——防止中间人窃听或篡改。
存储加密——数据文件在磁盘上加密(TDE, Transparent Data Encryption)——即使磁盘被偷——没有密钥就无法读取数据文件中的数据。列级加密——只对敏感列(如信用卡号、身份证号)加密。
SQL注入防御
参数化查询(Prepared Statement)是防止SQL注入最有效的方法。将SQL骨架和数据分开——数据库驱动程序不将用户输入当作SQL代码执行。
复习检查
自主存取控制和强制存取控制的根本区别——DAC中用户可以传递权限(Oracle的GRANT OPTION)——客体(表)的所有者可以决定谁能访问;MAC中系统通过安全标签强制决定访问权限——用户不能改变。
GRANT和REVOKE如何控制授权——GRANT授予权限——REVOKE收回权限——
CASCADE选项在REVOKE时同时收回该用户的后续授权。视图如何帮助限制数据访问——创建的视图只包含部分列(如排除工资列)或行(如只显示该部门的行)授予用户视图的权限而不是基表的权限。
审计日志在漏洞响应中的作用——当发现某用户查询了大量客户记录——可以通过审计日志找到该用户的具体操作包括执行的SQL语句记录——用于内部调查和取证。
SQL注入的参数化查询原理——用户输入的值作为参数绑定到SQL的占位符——数据库内核将输入视为数据而不是SQL代码——所以恶意用户输入的
' OR '1'='1只是字符数据被当作比较——而不是破坏原有SQL的闭合引号。