MySQL 安全方案

  • 前言
  • MySQL服务器安全
    • 存储安全
      • 自建MySQL服务器
      • 公有云RDS
    • 网络安全
      • 设置白名单
      • 外网访问
    • 操作系统安全
      • root启动MySQL
      • 账号弱密码
      • 对外开放端口
      • 服务漏洞
      • 密码登录
      • 审计功能
      • 操作命令历史
      • 资源限制
      • 服务器备份
  • MySQL数据库安全
    • 账号安全
      • 账号密码
      • 账号分离
      • 账号权限
      • 使用SSL连接
    • 系统权限
      • mysql.user权限
      • 修改账号密码
      • 修改密码认证方式
      • 权限风险
      • FILE权限
      • 审计功能
      • 数据备份
    • 异地容灾
  • 数据安全
    • 数据访问范化
    • 数据脱敏
    • 数据加密
    • 延迟从库
  • 总结

前言

安全对任何一个系统都至关重要,只有在保证安全的前提下,才能追求稳定性和高性能。

对于一个企业来说,数据就是企业的财富,之前我们也听说过微盟删库以及顺丰删库导致服务长时间不可用的惨案,那么如何保证数据的安全变得尤为重要,这期就聊聊跟MySQL安全相关的那些事。

MySQL服务器安全

对于自建机房的MySQL服务器安装都会经历网络配置,存储规划,安装服务器以,安装MySQL。

存储安全

自建MySQL服务器

对于自建MySQL服务器来说,为了磁盘不出现单点故障,一般都会使用RAID磁盘冗余阵列的方式。

有两种模式:硬件RAID和软件RAID,硬件RAID需要购买RAID卡支撑,软件RAID通过软件包mdadm生成即可,生产环境建议选择硬件RAID,一般需要对多块盘先做RAID,对于数据库服务器来说,通常选择RAID10(也称为RAID 1 + 0,先进行镜像RAID1,再进行条带化RAID0存储),读写性能都比较好。

在实际的生产环境,一般都会有8块盘,每块盘800G,在服务器启动的时候,先做磁盘RAID划分,通常划分两个卷组(volume group),一个是操作系统内置目录使用rootvg,一个就是MySQL的数据相关的卷组datavg,LVM操作主要的步骤如图:

通过以上的存储划分及配置RAID10,MySQL产生的数据都会写到 /data 目录下,同步到逻辑卷lvdata中,进而同步到物理卷中,最终同步到物理磁盘中镜像存储,有效避免了单盘损坏导致的数据不可用。

公有云RDS

对于RDS来说,线上环境一般都选择高可用版,即一主一从模式,默认情况下Slave只做failover(故障切换),主要是由于Master和Slave服务器的磁盘没有做RAID。

网络安全

设置白名单

对于自建机房,一般都会使用硬件防火墙来做网络隔离以及IP白名单限制,只允许指定的应用服务器通过3306端口连接MySQL Server,其他的恶意请求应该在防火墙层面进行拦截,例如RDS控制台的数据安全可以添加指定IP。

外网访问

数据库服务器只需要内网访问,禁止开通外网地址或者公网地址。

操作系统安全

安装完操作系统(例如CentOS 7.4)后,要进行安全漏洞扫描及定期巡检,主要有以下几个方面需要注意:

root启动MySQL

MySQL Server安装完之后,如果用root启动MySQL,则任何具有FILE系统权限的用户都可以读写root用户下的文件,会造成严重的安全隐患,应该将软件目录属主设置成root用户,数据目录属主设置成mysql用户,使用mysql用户启动MySQL实例。

账号弱密码

Linux服务器的所有账号密码不能是弱密码(例如密码是纯数字,纯字母,账号的一部分等,长度太短),建议所有的账号都设置20位长度,包括数字,大写字母,小写字母以及特殊字符。

对外开放端口

对于MySQL数据库服务器,除了3306端口开发给指定的应用服务器访问外,其他的端口都应该禁用掉,例如ssh, ftp, telent服务端口。

服务漏洞

在用绿盟或者其他工具进行安全扫描时,都会发现一些系统漏洞,常见的有ntp漏洞,vsftpd的漏洞等。这时就需要停机去打patch修复,再次进行扫描,直到全部通过才能安装MySQL。

密码登录

对于生产服务器,严禁本地通过密码直接登录,建议采用跳板机 jumpserver 的方式,每个用户都用自己 jumpserver 账号去登录,然后选择自己要访问的服务器(需要提前告知管理员添加),默认的登录用户(例如 server 用户)只有只读权限,不能做任何修改操作。

审计功能

用户通过 jumpserver 登录到生产服务器的所有操作都应该被审计和录屏,并且定时回放这些操作,确认每一步都是最优的,没有不必要的多操作。

操作命令历史

用户登录到 Linux 服务器上的所有操作命令都会记录到 history 中,将 history 设置大一点,保存更多的操作命令记录。

$vi /etc/profile
export HISTSIZE=5000 #命令最大保留量

资源限制

通过配置 /etc/security/limits.conf 文件限制用户资源使用,例如打开进程数,文件数,文件大小及内存等。

服务器备份

定期的对服务器进行备份,备份内容主要包括 Linux 内置目录(/usr /var /lib)和MySQL数据目录(数据文件,binlog,undolog, redolog),同时要定期检查备份的有效性以及恢复演练,以下是阿里云 ECS 的快照,建议每天一个快照,保留7天。

MySQL数据库安全

账号安全

账号密码

建议所有的账号都设置20位长度,包括数字,大写字母,小写字母以及特殊字符,如^N9UxOR&ydQWCBvIwqql

账号分离

对于分布式系统来说,会有多个服务,且服务之间存在调用关系,比如交易 trade-service 会调用支付 payment-service。

为了安全起见,给每个服务创建一个数据库,同时分配自己的账号,禁止跨库访问。

账号权限

保证账号权限最小化原则,对于业务账号来说,只需要授予连接,查询,新增,修改的权限即可。

使用SSL连接

对于数据安全性要求比较高的业务,建议启用SSL连接,这样即使用抓包工具分析,也不能看到具体的SQL文本。但从SSL实现方式来看,建立连接时需要进行握手、加密、解密等操作,连接建立阶段比较耗时,如果使用连接池或者长连接不会有太大影响,如果是短连接性能损耗比较大。

系统权限

mysql.user权限

除了MySQL root账号之外,其他任何账号对mysql.user的表有修改权限,会带来安全风险:账号密码被修改和认证插件修改。

修改账号密码

修改密码认证方式

MySQL默认都是本地密码认证插件 mysql_native_password,如果改成 auth_socket,则不需要密码,只检查用户是否使用UNIX套接字进行连接,然后比较用户名即可。

权限风险

一般允许普通开发人员通过 jumpserver 登录到中转机,然后用mysql -h -u -p以只读账号的方式访问数据库,有时也想看一下information_schema下长事务(innodb_trx)等相关的信息,需要授予process系统管理权限,会带来一些安全隐患。

这样只读账号也能查看innodb_trx表中所有业务账号正在执行的SQL语句,SQL可能包含敏感信息。

在以前的MySQL版本,拥有process系统权限的用户还可以锁定系统表,比如lock table mysql.user read,导致正常修改用户的操作

FILE权限

具有FILE权限可以将数据通过 **SELECT……INTO OUTFILE……**写到服务器上有写权限的目录下,作为文本格式存放,也可以通过 **LOAD DATA INFILE…**将文本文件数据导入到数据表中。

审计功能

安装 MySQL Server 之后,应该配置和开启 Audit Plugin,这样经过 MySQL Server 执行所有的 SQL 都会被记录下来,一方面可以排除问题,另一方面可以做性能监控分析(例如一段时间内某个SQL的QPS,TPS)。

数据备份

需要定时备份数据文件和 binlog,对于自建 MySQL 服务器,可以使用xtrabackup去做每天的物理全备,对于RDS来说,需要配置备份策略,同时也要定期的检查的备份完整性和有效性。

异地容灾

对于核心的业务系统,比如交易,支付等,要做好数据库的异地容灾,避免由于地震等自然灾害造成数据不可恢复。

数据安全

数据是企业宝贵的资源,每个业务域产生的数据以及需要的数据都不一样,如何保证安全的访问数据是非常重要的,一般大公司都有自己的数据管理平台,比如阿里的iDB,现在已经是一个服务DMS(数据管理服务),可以管理各种类型的数据库。

数据访问范化

所有数据变更都应该走审批流程,发起人和审批人不能是同一个,重要敏感的数据操作需要提交工单,进行多级审批,确认没有问题才能执行,执行之前要先做好备份,以便回滚时使用。

建议使用数据库管理平台来管理数据库,一般需要用户注册账号,申请权限(数据导出,结构变更,数据变更),服务Owner审批,提交工单进入审批流程等操作,所有的操作环节都会记录操作日志。

数据脱敏

对核心业务表的敏感字段要进行脱敏处理,例如姓名,邮箱,电话号码,身份证号码,可以利用中间平台去处理,例如阿里云的DMS可以配置数据脱敏,支持数据库,表,字段三个级别,默认在平台上查询都是以*号显示,如果想要查看明文,需要申请敏感数据权限,并提交工单,审批通过后才可以查看,权限时间默认为一天,最长不超过7天。

在做营销活动之前,都会做数据库性能压测,需要把PROD数据库全量导入UAT环境,会涉及一些敏感数据,一般需要通过中间层做脱敏处理,例如手机号可以前3位后3位进行打码处理,15222210123脱敏成152****123。

数据加密

从MySQL 5.7开始,InnoDB支持对独立表空间静态数据加密,是引擎内部数据页级别的加密手段,当数据页写入文件系统时加进行加密,从数据文件读到内存中时解密,基于旋转秘钥文件而起作用,对于数据保护非常有用。

主秘钥文件存储在磁盘上,同时要做好备份,对于加密的表,表空间秘钥由主秘钥并存储在表空间文件的头部中,使用的加密算法是AES,加密模式是块加密。

我们来看一下 加密ENCRYPTION=‘Y’未加密ENCRYPTION=‘N’ 的区别在哪


从这里就可以看出,通过Keyring的加密方式,主秘钥是存储表空间文件的头部信息中,这样增强了数据文件的安全性,对于一些社交软件产生的聊天消息,可以采用这种方式来加密数据文件,防止数据文件被窃取之后进行恢复。

延迟从库


Oracle数据库有两个特性:回收站(recyclebin)和闪回(flashback)功能,drop table如果不加purge选项,Oracle会把这个表rename一个新的表名存放到回收站里,需要还原时执行flashback table即可。

那如果delete能恢复吗?

也是可以的,利用flashback query去Undo Log里获取删除时间前的数据,回插到原表即可,这两个功能是很棒的,可惜MySQL里都没有。

通常MySQL的主从复制是实时的一致性复制,Master执行的变更会立刻通过binlog复制同步到Slave执行。

如果不想让Slave那么快的执行Master的变更,可以配置延迟从库,利用它可以实现数据误删的快速恢复,例如延迟一个小时。

总结

安全存在于系统的方方面面,涉及安全的都是大事,今天主要聊的是MySQL安全的那些事,主要包括MySQL服务器安全,数据库安全以及数据安全,聊完之后发现安全的东西还蛮多,这些能够让我们对MySQL安全有更加深刻的认识,同时也能规避一些安全风险,让系统安全稳定的运行。

作为开发可能更多关注的是代码安全和质量,其实MySQL的安全也很重要,需要更多的关注和了解咯。

MySQL 安全方案设计相关推荐

  1. go 获得 mysql 实际运行 SQL,Golang实践录:一个数据库迁移的代码记录

    实现一个数据库迁移的案子.有些知识点值得记录. 技术框架 github.com/go-xorm/xorm:数据库操作 github.com/denisenkom/go-mssqldb:sqlserve ...

  2. Golang实践录:一个数据库迁移的代码记录

    实现一个数据库迁移的案子.有些知识点值得记录. 技术框架 github.com/go-xorm/xorm:数据库操作 github.com/denisenkom/go-mssqldb:sqlserve ...

  3. 迁移到MySQL的业务架构演进实战

    来自:DBAplus社群 作者介绍 杨建荣,dbaplus社群联合发起人,竞技世界资深DBA,前搜狐畅游数据库专家,Oracle ACE,腾讯云TVP.具有十多年数据库开发和运维经验,目前专注于开源技 ...

  4. elasticsearch 数据类型_基于 MySQL Binlog 的 Elasticsearch 数据同步实践

    来源;马蜂窝 一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存 ...

  5. MySQL DBA面试全揭秘

    来源:http://ourmysql.com/archives/1426 本文起源于有同学留言回复说想了解下MySQL DBA面试时可能涉及到的知识要点,那我们今天就来大概谈谈吧. MySQL DBA ...

  6. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践

    一.为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数 ...

  7. mysql多大_洞悉MySQL底层架构:游走在缓冲与磁盘之间

    提起MySQL,其实网上已经有一大把教程了,为什么我还要写这篇文章呢,大概是因为网上很多网站都是比较零散,而且描述不够直观,不能系统对MySQL相关知识有一个系统的学习,导致不能形成知识体系.为此我撰 ...

  8. Mysql高级考试题_MySQL高级应用答案试题题目及答案,期末考试题库,章节测验答案...

    MySQL高级应用答案试题题目及答案,期末考试题库,章节测验答案 更多相关问题 MgSO4?7H2O在医药上常用做泻药,工业上可用氯碱工业中的一次盐泥为原料生产.已知一次盐泥中含有镁.钙.铁.铝. 下 ...

  9. mysql 迁移 nosql_从关系型Mysql到Nosql HBase的迁移实践

    2013年11月22-23日,作为国内唯一专注于hadoop技术与应用分享的大规模行业盛会,2013 Hadoop中国技术峰会(China Hadoop Summit 2013)于北京福朋喜来登集团酒 ...

最新文章

  1. java系统排序_Java实现二进制排序树
  2. 新手入门深度学习 | 4-4:保存模型的N种方法
  3. java bigdecimal乘法_Java BigDecimal类型的 加减乘除运算
  4. C#控制管理VisualSVN Server
  5. php程序yii是什么意思,Yii框架啥意思
  6. 网络协议之:还在用HTTP代理?过时了,快试试SOCKS5
  7. apache日志 waf_WAF对WebShell流量检测的性能分析
  8. 欧拉函数 - HDU1286
  9. 直接内存与元空间_深入浅出 JVM 内存管理
  10. 每日英语:Electronics Develop A Sixth Sense
  11. java cas原理_Java中的锁[原理、锁优化、CAS、AQS]
  12. java线程知识点拾遗(1)
  13. 【车牌识别】基于matlab GUI RGB颜色模型车牌识别【含Matlab源码 888期】
  14. 大数据与云计算课后习题
  15. 学习oracle一个月心得
  16. 【JavaScript】使用DOM修改和查询CSS内联样式
  17. 基因型填充中的phasing究竟是什么
  18. HPE的通信技术集团将如何加速电信5G的普及和应用?
  19. 开放式耳机新巅峰!南卡OE Pro兼备澎湃音质、舒适佩戴、创新设计
  20. 计算机通电后自动断电,电脑开机自动断电,详细教您电脑开机自动断电怎么解决...

热门文章

  1. MySQL本地安装与配置(超详细,附带安装包)
  2. 【转】Linux那些事儿 之 戏说USB(23)设备的生命线(二)
  3. 数学分析教程(科大)——3.1笔记+习题
  4. FINAL CUT 当中设置左右声道及多声道的方法
  5. proteus中仿真D触发器CD4013
  6. 苹果安卓虚拟视频插件刷机包
  7. 短视频中的MCN是什么?与PGC UGC有什么不同
  8. 什么是资金主力的撤资?主力撤资方式有哪些?
  9. 微信小程序-体育场馆场地预约系统
  10. java中文乱码终极解决方案