安全对于任何系统来说都是非常重要的。只有在保证安全的前提下,才能追求稳定和高性能。对于企业来说,数据就是企业的财富。我们也看到了微盟删库、顺丰删库导致服务长时间不可用的悲剧。如何保证数据安全就显得尤为重要。这篇文章就讲一下希望对大家MySQL安全相关的东西有所帮助。MySQL服务器安全自建机房MySQL服务器安装,会经历网络配置、存储规划、服务器安装和MySQL安装。存储安全1)自建服务器对于自建的MySQL服务器,为了避免磁盘单点故障,一般采用RAID磁盘冗余阵列。有两种模式:硬件RAID和软件RAID。硬件RAID需要购买RAID卡支持。可以通过软件包mdadm生成软件RAID。生产环境建议选择硬件RAID。一般需要先对多个磁盘做RAID。对于数据库服务器来说,通常选择RAID10(又称RAID1+0,先镜像RAID1,再分条RAID0存储),读写性能较好。在实际生产环境中,一般有8块磁盘,每块800G。服务器启动时,首先对磁盘RAID进行划分,通常分为两个卷组(volumegroup),一个是使用rootvg的操作系统内置目录,一个是与MySQL数据相关的卷组datavg。LVM运行的主要步骤如图:通过上面的存储划分和RAID10的配置,将MySQL产生的数据写入/data目录,同步到逻辑卷lvdata,再同步到物理卷中,最终同步到物理磁盘进行镜像存储,有效避免单盘损坏导致数据不可用。2)公有云RDS对于RDS,线上环境一般选择高可用版本,即一主一从模式。默认情况下,Slave只进行故障转移(failover),主要是因为Master和Slave服务器的磁盘没有配置。袭击。网络安全1)设置白名单对于自建机房,一般采用硬件防火墙进行网络隔离和IP白名单限制。只允许指定的应用服务器通过3306端口连接MySQLServer,其他恶意请求应该在防火墙级别进行阻断,比如RDS控制台的数据安全可以添加指定IP。2)外网访问数据库服务器只需要内网访问,禁止开放外网地址或公网地址。操作系统安全安装操作系统(如CentOS7.4)后,需要进行安全漏洞扫描并定期检查。主要有以下几个方面需要注意:1)以root启动MySQL安装MySQLServer后,如果以root启动MySQL,那么任何具有FILE系统权限的用户都可以在root用户下读写文件,这将造成严重的安全隐患。设置软件目录的所有者为root用户,数据目录的所有者为mysql用户,并使用mysql用户启动MySQL实例。2)账户弱密码Linux服务器的所有账户密码都不能是弱密码(比如密码是纯数字、纯字母、账户的一部分等,长度太短),建议所有账户都是设置为20个字符的长度,包括数字和大写字母、小写字母和特殊字符。3)对外开放端口对于MySQL数据库服务器,除了3306端口是专门为指定应用服务器访问而开发的,其他端口都应该关闭,比如ssh、ftp、telent服务端口。4)服务漏洞使用绿盟科技或其他工具进行安全扫描时,会发现一些系统漏洞,如ntp漏洞、vsftpd漏洞等。这时需要停下来打补丁修复,重新扫描,直到全部通过安装MySQL。5)密码登录对于生产服务器,严禁在本地直接通过密码登录。推荐使用跳板jumpserver方式。每个用户使用自己的jumpserver账号登录,然后选择自己要访问的服务器(需要提前通知管理员添加),默认登录用户(如服务器用户)只有只读权限,不能进行修改任何修改操作。6)审计功能用户通过jumpserver登录生产服务器的所有操作都应该被审计和记录,并定期回放这些操作,以确认每一步都是最优的,没有不必要的操作。7)操作命令历史记录用户登录Linux服务器的所有操作命令都会记录在历史记录中,设置历史记录越大,保存的操作命令记录越多。8)资源限制通过配置/etc/security/limits.conf文件来限制用户资源的使用,例如打开的进程数、文件数、文件大小和内存。9)服务器备份定期对服务器进行备份,备份内容主要包括Linux内置目录(/usr/var/lib)和MySQL数据目录(数据文件、binlog、undolog、redolog),并定期检查其有效性备份恢复演练,以下为阿里云ECS快照。建议每天拍摄快照并保存7天。MySQL数据库安全账户安全1)账户密码建议设置为20个字符长度,包括数字、大写字母、小写字母和特殊字符,如^N9UxOR&ydQWCBvIwqql2)账户分离对于分布式系统,会有多个服务,并且服务之间存在调用关系,比如trade-service会调用payment-service。为了安全起见,为每个服务创建一个数据库,同时分配自己的账号,禁止跨数据库访问。3)账户权限保证账户权限最小化原则。对于企业账号,只需要授予连接、查询、添加、修改权限即可。4)对于使用SSL连接对数据安全性要求高的业务,建议开启SSL连接,这样即使使用抓包工具分析也看不到具体的SQL文本。但是,从SSL实现的角度来看,建立连接时需要进行握手、加密、解密等操作。连接建立阶段是耗时的。如果使用连接池或者长连接,影响不大。如果是短连接,性能损失比较大。.系统权限1)mysql.user权限除mysqlroot账户外,其他任何账户都有修改mysql.user表的权限,会带来安全隐患:修改账户密码,修改认证插件。2)修改账号密码3)修改密码认证方式MySQL默认使用本地密码认证插件mysql_native_password,如果改为auth_socket则不需要密码,只要检查用户是否使用UNIXsocket连接即可,以及然后比较用户名。4)权限风险一般允许普通开发者通过jumpserver登录中转机,然后使用mysql-h-u-p以只读账户访问数据库。有时他们还想查看information_schema下的长事务(innodb_trx)等相关信息,需要授予进程系统管理权限,这会带来一些安全隐患。这样只读账户也可以查看到innodb_trx表中所有业务账户正在执行的SQL语句,SQL中可能包含敏感信息。在以前的MySQL版本中,具有进程系统权限的用户也可以锁定系统表,比如locktablemysql.userread,导致用户操作的修改正常。5)FILE权限有了FILE权限,可以通过SELECT.....INTOOUTFILE.....将数据写入服务器上有写权限的目录,并以文本格式存储,也可以将文本文件数据导入到数据通过LOADDATAINFILE...表。6)Auditing功能安装MySQLServer后,需要配置并启用AuditPlugin,这样通过MySQLServer执行的所有SQL都会被记录下来。一方面可以排除问题,另一方面可以做性能监控和分析(比如某个SQLQPS,TPS)。7)数据备份需要定期备份数据文件和binlog。对于自建MySQL服务器,可以使用xtrabackup进行日常物理全量备份。对于RDS,需要配置备份策略,以及备份的完整性和有效性。异地容灾对于交易、支付等核心业务系统,需要做好数据库的异地容灾,避免因地震等自然灾害导致数据无法恢复。数据安全数据是企业宝贵的资源。每个业务领域产生和需要的数据是不同的。如何保证数据的安全访问非常重要。一般大公司都有自己的数据管理平台,比如阿里的iDB,现在是一个服务DMS(DataManagementService),可以管理各种类型的数据库。数据访问标准化所有数据更改都应经过审批流程。发起人和审批人不能相同。重要敏感数据操作需要提交工单进行多级审批。确认没有问题后,才能执行。执行前,必须做备份,回滚时使用。推荐使用数据库管理平台来管理数据库。一般用户需要注册账号、申请权限(数据导出、结构变更、数据变更)、服务负责人审批、提交工单进入审批流程等,所有操作都会记录操作日志。数据脱敏需要对核心业务表的敏感字段进行脱敏处理,如姓名、邮箱、电话、身份证号等,可通过中间平台进行处理。比如阿里云的DMS可以配置数据脱敏,支持数据库,表,字段三级,平台查询默认带*显示。如需查看明文,需要申请敏感数据权限并提交工单。审核通过后即可查看。权限时间默认为1天,最长不超过7天。在做营销活动之前,都会做数据库性能压力测试。需要将PROD数据库全量导入UAT环境,会涉及到一些敏感数据。一般需要通过中间层进行脱敏。比如手机号的前3位和后3位可以进行印码处理,15222210123脱敏成152****123。数据加密从MySQL5.7开始。InnoDB支持对独立表空间中的静态数据进行加密。它是引擎内部数据页级别的一种加密方法。当数据页被写入文件系统时,它们在从数据文件读取到内存时被加密和解密。基于Worksbyrotatingkeyfiles,对数据保护很有用。主密钥文件存放在磁盘上,同时要做好备份。对于加密表,表空间密钥由主密钥存储在表空间文件的头部。使用的加密算法为AES,加密方式为块加密。我们来看看**加密的ENCRYPTION='Y'和未加密的ENCRYPTION='N'**的区别。从这里可以看出,通过Keyring的加密方式,将主密钥保存在表空间文件的头信息中,增强了数据文件的安全性。对于一些社交软件产生的聊天消息,可以使用这种方法来加密数据文件,防止数据文件被盗后恢复。延迟从库Oracle数据库有两个特点:回收站(recyclebin)和闪回(flashback)功能,如果droptable不加purge选项,Oracle会重命名表并在回收站中存入一个新的表名,这需要待恢复此时执行闪回表。那么删除是否可以恢复呢?也可以使用闪回查询获取UndoLog中删除时间之前的数据,然后再插入回原表中。这两个功能很棒,可惜MySQL中没有。通常MySQL的主从复制是实时一致复制,Master执行的变更会立即通过binlog复制同步到Slave执行。如果不想让Slave这么快的执行Master的修改,可以配置一个延时slave库,可以用来快速恢复不小心删除的数据,比如延时一小时。综上所述,安全存在于系统的方方面面,凡是与安全相关的都是大事。今天主要讲MySQL安全,包括MySQL服务器安全、数据库安全、数据安全。可以让我们对MySQL的安全性有更深入的了解,同时规避一些安全风险,让系统安全稳定的运行。作为开发人员,您可能更关注代码的安全性和质量。其实MySQL的安全性也很重要,需要多加注意和了解。
