`

数据库记录安全解决方案

 
阅读更多

via: http://netkiller.github.io/journal/mysql.security.html

 

1. 什么是防删除,防撰改

禁止数据删除,数据一旦增加不允许数据被任何人删除

禁止数据修改,数据一旦建立不允许对数据做修改操作

2. 为什么要做防删除,防撰改限制

很多时候我们的数据是只增加,不会删除数据。有些敏感子段一旦数据家里是不允许再修改的,例如银行账户表中的资金子段。

另一个原因是我们防止误操作

3. 何时做防删除,防撰改限制

我认为在数据库设计时就应该考虑倒这些问题,如果发现数据被删除或者被撰改,亡羊补牢也不晚,我们不能允许再次发生。

你可以取消用户的 DELETE 权限,使之只能做查询操作,但修改(UPDATE)呢?你就无能为力!如果取消UPDATE程序将不能正常运行。

4. 在哪里做防删除,防撰改限制

程序设计之初你就应该想到这些问题,如果没有考虑倒,你只能修改现有逻辑。通常的做法是所有表增加一个删除状态子段,删除操作即是更新状态。这种方式也有弊端就是垃圾数据会不停地膨胀。

5. 谁去做防删除,防撰改限制

我认为可以分为两种人,一种是DBA,一种是开发者。这里主要将数据库部分。

6. 怎样实现防删除,防撰改限制

6.1. 限制删除

CREATE DEFINER=`dba`@`192.168.%` TRIGGER `account_before_delete` BEFORE DELETE ON `account` FOR EACH ROW BEGIN
	SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Permission denied', MYSQL_ERRNO = 1001;
END
			

对account表中的记录做删除操作,数据库抛出异常 Permission denied

6.2. 限制修改

禁止所有修改操作

DELIMITER $$
CREATE DEFINER=`dba`@`192.168.%` TRIGGER `logging_before_update` BEFORE UPDATE ON `logging` FOR EACH ROW BEGIN
	SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Permission denied', MYSQL_ERRNO = 1001;
END			
			

限制部分子段修改,其他子段扔允许修改

CREATE DEFINER=`dba`@`192.168.%` TRIGGER `members_before_update` BEFORE UPDATE ON `members` FOR EACH ROW BEGIN
	SET NEW.`id` = OLD.id;
	SET NEW.`name` = OLD.name;
	SET NEW.`chinese_name` = OLD.chinese_name;
	SET NEW.`english_name` = OLD.english_name;
	SET NEW.`sex` = OLD.sex;
	SET NEW.`address` = OLD.address;
	SET NEW.`zipcode` = OLD.zipcode;
	SET NEW.`country_code` = OLD.country_code;
	SET NEW.`mobile` = OLD.mobile;
	SET NEW.`email` = OLD.email;
	SET NEW.`qq` = OLD.qq;
	SET NEW.`question` = OLD.question;
	SET NEW.`answer` = OLD.answer;
	SET NEW.`ctime` = OLD.ctime;
END
			

在数据库修改前我们覆盖掉修改的数据,使之更新后数据保持不变。

6.3. 为数据安全而分库

我们通常使用一个数据库开发,该数据库包含了前后台所有的功能,我建议将前后台等等功能进行分库然后对应各种平台分配用户权限,例如

我们创建三个数据库cms,frontend,backend 同时对应创建三个用户 cms,frontend,backend 三个用户只能分别访问自己的数据库,注意在系统的设计之初你要考虑好这样的划分随之系统需要做相应的调整。

CREATE DATABASE `cms` /*!40100 COLLATE 'utf8_general_ci' */;
CREATE DATABASE `frontend` /*!40100 COLLATE 'utf8_general_ci' */;
CREATE DATABASE `backend` /*!40100 COLLATE 'utf8_general_ci' */;
			

backend 负责后台,权限最高

mysql> SHOW GRANTS FOR 'backend'@'localhost';
+--------------------------------------------------------------------------------------+
| Grants for backend@localhost                                                         |
+--------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'backend'@'localhost'                                          |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `cms`.* TO 'backend'@'localhost'             |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `frontend`.* TO 'backend'@'localhost'        |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON `backend`.* TO 'backend'@'localhost' |
+--------------------------------------------------------------------------------------+
4 rows in set (0.04 sec)		
			

frontend 是前台权限,主要是用户用户中心,用户注册,登录,用户信息资料编辑,查看新闻等等

mysql> SHOW GRANTS FOR 'frontend'@'localhost';
+------------------------------------------------------------------------+
| Grants for frontend@localhost                                          |
+------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'frontend'@'localhost'                           |
| GRANT SELECT, INSERT, UPDATE ON `frontend`.* TO 'frontend'@'localhost' |
| GRANT SELECT ON `cms`.`news` TO 'frontend'@'localhost'                 |
+------------------------------------------------------------------------+
3 rows in set (0.00 sec)		
			

cms 用户是网站内容管理,主要负责内容更新,但登陆CMS后台需要`backend`.`Employees`表用户认证,所以他需要读取权限,但不允许修改其中的数据。

mysql> SHOW GRANTS FOR 'cms'@'localhost';
+----------------------------------------------------------------------+
| Grants for cms@localhost                                             |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'cms'@'localhost'                              |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `cms`.* TO 'cms'@'localhost' |
| GRANT SELECT ON `backend`.`Employees` TO 'cms'@'localhost'           |
+----------------------------------------------------------------------+
3 rows in set (0.00 sec)		
			

cms与backend 通常我们会限制IP地址来源,安全相对好控制。

frontend 主要对外提供服务,我们假设一旦被骇客入侵,所波及的范围被限制在frontend权限下,至少`backend`.`Employees`不会被撰改,CMS内容也得到了保护。

想100%解决数据的安全是非常空难的,但我们至少保护了一部份数据的安全。使其安全不会进一步扩散影响。

7. 怎样实现数据修改留痕

数据记录每一次修改我们都需要保留之前的数据,这样可以随时调出历史数据,用户审计等等。

7.1. 版本控制

主表

CREATE TABLE `article` (
	`article_id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
	`cat_id` SMALLINT(5) NOT NULL DEFAULT '0',
	`title` VARCHAR(150) NOT NULL DEFAULT '',
	`content` LONGTEXT NOT NULL,
	`author` VARCHAR(30) NOT NULL DEFAULT '',
	`keywords` VARCHAR(255) NOT NULL DEFAULT '',
	PRIMARY KEY (`article_id`),
	INDEX `cat_id` (`cat_id`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=1			
			

本版控制表,用于记录每次变动

CREATE TABLE `article_history` (
	`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
	`article_id` MEDIUMINT(8) UNSIGNED NOT NULL,
	`cat_id` SMALLINT(5) NOT NULL DEFAULT '0',
	`title` VARCHAR(150) NOT NULL DEFAULT '',
	`content` LONGTEXT NOT NULL,
	`author` VARCHAR(30) NOT NULL DEFAULT '',
	`keywords` VARCHAR(255) NOT NULL DEFAULT '',
	PRIMARY KEY (`id`),
	INDEX `article_id` (`article_id`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=1
			

版本控制触发器

DROP TRIGGER article_history;

DELIMITER //
CREATE TRIGGER article_history BEFORE update ON article FOR EACH ROW
BEGIN
	INSERT INTO article_history SELECT * FROM article WHERE article_id = OLD.article_id;
END; //
DELIMITER;					
			

任何数据的变化都会复制一份到历史表,我们可以随时比较两个版本数据的变化,我还为此开发了一个类似diff的工具,可以逐行比较,通过色彩变化现实数据的不同。

7.2. 一张表实现历史日志记录

我有一个表,里面只有固定行数的行记录,这些数据就是配置参数,我们将配置文件保存在数据库中,因为需要做负载均衡而不能使用文件配置文件。

有这样一个需求,这个记录每次修改都要保存历史记录,用于审计等等。我是这样设计该表的

CREATE TABLE `config_fee` (
	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`level` INT(11) NULL DEFAULT NULL COMMENT '层级',
	`type` ENUM('Deposit','Withdrawing') NOT NULL DEFAULT 'Withdrawing' COMMENT '类型,存款,取款',
	`min_fee` FLOAT(10,2) NOT NULL COMMENT '最低手续费',
	`max_fee` FLOAT(10,2) NOT NULL COMMENT '最高手续费',
	`ratio` FLOAT(10,2) NOT NULL COMMENT '手续费比例',
	`operator` VARCHAR(10) NOT NULL COMMENT '操作者',
	`status` ENUM('Current','Trash') NOT NULL DEFAULT 'Current',
	`ctime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
	`mtime` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`)
)
COMMENT='手续费管理'
COLLATE='utf8_general_ci'
ENGINE=InnoDB;			
			

数据记录的形态

mysql> select type,operator,status,ctime,mtime from config_mtf_fee;
+---------+----------+---------+---------------------+---------------------+
| type    | operator | status  | ctime               | mtime               |
+---------+----------+---------+---------------------+---------------------+
| Deposit | jam      | Trash   | 2014-07-20 11:10:17 | 2014-07-20 11:10:57 |
| Deposit | lucy     | Trash   | 2014-08-24 11:10:17 | 2014-08-24 11:10:57 |
| Deposit | lily     | Trash   | 2014-08-25 11:10:17 | 2014-08-25 11:10:57 |
| Deposit | kitty    | Trash   | 2014-08-27 11:10:17 | 2014-08-27 11:10:57 |
| Deposit | neo      | Current | 2014-08-28 11:10:54 | 2014-08-28 11:10:59 |
+---------+----------+---------+---------------------+---------------------+
2 rows in set (0.00 sec)			
			

如上图所示,状态 Current 是当前记录,而Trash是废弃的历史记录。

每次修改数据,首先将Current改为Trash,然后插入一条新数据状态为Current,我们只会使用最后一条状态为current的数据。

我们使用更新触发器控制除了status,mtime意外的字段修改

CREATE DEFINER=`root`@`%` TRIGGER `config_fee_before_update` BEFORE UPDATE ON `config_fee` FOR EACH ROW BEGIN
	SET NEW.`id` = OLD.id;
	SET NEW.`level` = OLD.level;
	SET NEW.`type` = OLD.type;
	SET NEW.`min_amount` = OLD.min_amount;
	SET NEW.`min_fee` = OLD.min_fee;
	SET NEW.`max_fee` = OLD.max_fee;
	SET NEW.`ratio` = OLD.ratio;
	SET NEW.`operator` = OLD.operator;
	SET NEW.`ctime` = OLD.ctime;
END;			
			

限制删除的触发器

CREATE DEFINER=`dba`@`192.168.%` TRIGGER `config_fee_before_delete` BEFORE DELETE ON `config_fee` FOR EACH ROW BEGIN
	SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Permission denied', MYSQL_ERRNO = 1001;
END

 

 

分享到:
评论

相关推荐

    数据库安全技术白皮书汇总

    的解决方案。深入分析这次事件,不难看出,数据库泄露事件仅仅是信息安全事 件的一种表现形式而已。这次被公布的账户信息不过是黑客产业链输出的已经失 去价值的信息残渣;这背后可能存在修改核心数据库的记录、获取...

    帕拉迪数据库风险分析、安全监控审计及合规解决方案

    帕拉迪数据库风险分析、安全监控审计及合规解决方案 数据十大安全风险 1. 滥用过高权限 2. 滥用合法权限 3. 权限提升 4. 数据库平台漏洞 5. SQL 注入 6. 审计记录不足 7. 拒绝服务 8. 数据库通信协议漏洞 9. 身份...

    数据库安全审计系统介绍.pptx

    全方位信息安全审计方案 互联网 维护人员 业务系统 用户 "天锐锋"安全审计产品 提供全用户、全业务、全方位的信息安全审计解决方案 SSO业务软件单点登录系统 OSAG Manager运维安全审计系统 DBAG Manager数据库安全...

    数据中心--构建医院安全大脑解决方案模板v1.0.docx

    针对传统安全保障体系难以新型威胁和APT攻击,以及缺乏看到看懂的感知环节的不足,深信服提出了基于行为检测和关联分析技术、对全网流量进行安全监测的可视化和预警检测解决方案。方案设计体现适用性、前瞻性、可行...

    服务器数据库维护方案.doc

    服务器数据库维护方案 @@@ 服务器及网络系统维护方案 @@软件系统有限公司 @@@-11-5 重影响@@@集团在全市业务工作的开展。 维持中心网络设备的正常运转,为@@@集团更好的为广大北京市民进行服务提供高 效、稳定、可靠...

    安全数据库系统.pdf

    课程设计按指导书要求, 综合应用所学的网络安全知识解决实际问题,并进 行理论分析,依据合理关系进行设计。功能实用性、界面友好、方便用户操作。 本次课程设计是设计实现一个安全的数据库系统, 对数据库进行...

    公交线路查询系统的数据库设计.doc

    因此,本文基于公交线路查询系统,提出了数据库的设计方案,从根本上解决了公交线 路查询的弊端问题,便于人们在出现之前获取到最优的路线信息,节约了人们的出行时 间,又降低了城市公交的运输压力,有利于城市...

    用触发器生成数据库表的数据操作日志

    本文将介绍如何使用触发器,把DML(数据操作语言)...因此,设计一个C/S结构的应用程序供多用户运行,或许不是一个可行的解决方案。更合理的方案是,设计一个三层应用程序,由你的中 间层组件对单用户数据库进行调用。

    金属材料标准的应用数据库MtrRvw

    订制方案的价格=基本费率×{[Σ(产品规范独占的数据量×产品规范的使用天数)]+[Σ(分享的数据库对象的数据量×最大使用天数)]}×账户数 账户数:“客户用户”的数目不超过2时,账户数=1;“客户用户”的数目...

    基于加密数据库的高效安全HW-PIR方案

    将数据库记录转化为(0,1)比特流后进行置换,并采用代理重加密算法,实现对密文数据库的查询,从而保证用户的查询隐私不会泄露给数据库服务器,还能防止用户的查询内容与数据库的隐私泄露给安全协处理器及恶意攻击者。...

    服务器数据库维护方案.docx

    对于特定的系统安全性修正性软件以及IBM紧急要求的系统修正性软件可能会被随时安装 5) 提供与系统软件相关的技术支持及咨询 二、远程技术支持服务 @@将通过电话和/或其它远程方式帮助@@@集团解决或解答以下与系统...

    sql数据库相关加密知识

    数据库数据的安全问题越来越受到重视,数据库加密技术的应用极大的解决了数据库中数据的安全问题,但实现方法各有侧重。 随着电子商务逐渐越来越多的应用,数据的安全问题越来越受到重视。一是企业本身需要对自己...

    springboot-:记录实现高并发的解决方案

    记录实现高并发的解决方案 day01 1.springboot整合druid多数据源和log4j2 (1)实现数据源,主数据库(写),从数据库(读),读写分离的方案之一 (2)mysql主从复制,保持数据一致性 (3)使用druid的监控功能 (4...

    智能呼叫中心解决方案.pptx

    提升客户体验 智能质检+情绪识别 海量平台沉淀语音数据库 全量实时用户数据标签 精准大数据分析 核心数据库 智能板块 核心系统 智能呼叫中心解决方案全文共14页,当前为第5页。 初衷与理念智能语音生态圈 核心系统 ...

    方正“王管”网络安全管理系统解决方案

    对企业内部网络管理人员而言,...其独特的信息处理技术和网络技术,对经由代理 服务器和网关进出的各协议层、端口数据,特别是上行的主动数据包,进行旁路监听、分析,最终放到数据库进行存储,并记录详尽的数据信息。

    5.4空间数据库管理系统.pdf

    提供了类似Oracle Spatial 的数据类型和一个对象关系模式 存储多维的网格化数据和栅格层 栅格数据拥有空间参考信息 进行空间检索 对象关系数据库管理特点 3 解决了空间数据的变长记录管理问题,由数据库软 件商扩展...

    数据库系统的核心(3).docx

    数据库系统: 数据库系统(Database System),是由数据库及其管理软件组成的系统。 数据库系统是为适应数据处理的需要而发展起来的一种较为理想的数据处理系统...可以使客户选择最适合的解决方案。对开发商全力支持。

    软件开发类投标项目全套解决方案模板

    4.1 项目解决方案内容 26 4.1.1 系统总体目标、设计架构、系统详细设计方案 27 4.1.1.1 设计原则 27 1. 统一设计原则 27 2. 稳定性原则 27 3. 统一设计原则 27 4. 稳定性原则 27 5. 先进性原则 27 6. 高可靠...

    大数据资源体系解决方案.docx

    大数据资源体系解决方案是一个综合性的项目,旨在建立一个高效、安全、可靠的大数据资源体系,以满足企业、政府等组织在数据管理和应用方面的需求。以下是该解决方案的核心内容: 一、数据集成与管理 数据采集与...

    Note:系统,数据库,开发,安全,源代码分析,解决方案

    系统,数据库,开发,安全,源代码分析,解决方案 一直以来都没有记笔记的习惯,以至于我现在遇到曾经出现过的问题和学习过的知识都忘记了不少。从发现问题到思考问题再到解决问题这个过程中,在没有笔记和大脑既不...

Global site tag (gtag.js) - Google Analytics