当前位置: 首页 > 科技观察

跟你聊聊MySQL安全的那些事

时间:2023-03-22 16:47:43 科技观察

让我和你谈谈MySQL的安全性。转载本文请联系三太子敖丙公众号。MySQL有那么多章节,一共20多章。我看了一下我的本地目录,可以说是很全面了,但是有一点我觉得很重要但是我还没有提到,那就是安全。安全对任何系统都非常重要。只有在保证安全的前提下,才能追求稳定和高性能。对于企业来说,数据就是企业的财富。我们之前也看到过微盟删库、顺丰删库导致服务长时间不可用的悲剧。如何保证数据的安全就显得尤为重要。本期我们就聊聊MySQL安全相关的那些事儿,希望对大家有所帮助。MySQL服务器安全自建机房MySQL服务器安装,会经历网络配置、存储规划、服务器安装、MySQL安装。存储安全自建MySQL服务器对于自建MySQL服务器,为了避免磁盘单点故障,一般采用磁盘RAID冗余阵列的方式。有两种模式:硬件RAID和软件RAID。硬件RAID需要购买RAID卡支持。可以通过软件包mdadm生成软件RAID。生产环境建议选择硬件RAID。一般需要先对多个磁盘做RAID。对于数据库服务器来说,通常选择RAID10(又称RAID1+0,先镜像RAID1,再分条RAID0存储),读写性能较好。在实际生产环境中,一般有8块磁盘,每块800G。服务器启动时,首先对磁盘RAID进行划分,通常分为两个卷组,一个是使用rootvg的操作系统内置目录,一个是与MySQL数据相关的卷组datavg。LVM运行的主要步骤如图:通过上面的存储划分和RAID10的配置,将MySQL产生的数据写入/data目录,同步到逻辑卷lvdata,再同步到物理卷中,最终同步到物理磁盘进行镜像存储,有效避免单盘损坏导致数据不可用。公有云RDS对于RDS,线上环境一般选择高可用版本,即一主一从模式。默认情况下,Slave只进行故障转移(failover),主要是因为Master和Slave服务器的磁盘不做RAID。网络安全设置白名单对于自建机房,一般采用硬件防火墙进行网络隔离和IP白名单限制。只允许指定的应用服务器通过3306端口连接MySQLServer,其他恶意请求应该在防火墙级别进行阻断,比如RDS控制台的数据安全可以添加指定的IP。外网访问数据库服务器只需要内网访问,禁止开放外网地址或公网地址。操作系统安全安装操作系统(如CentOS7.4)后,需要进行安全漏洞扫描并定期检查。具有FILE系统权限的用户可以在root用户下读写文件,这会带来严重的安全隐患。设置软件目录所有者为root用户,数据目录所有者为mysql用户,并使用mysql用户启动MySQL实例。账号弱密码Linux服务器所有的账号密码都不能是弱密码(比如密码是纯数字、纯字母、部分账号等,长度太短)。建议所有账号长度都设置为20个字符,包括数字、大写字母、小写字母和特殊字符。对外开放端口对于MySQL数据库服务器,除了3306端口是专门为指定应用服务器访问而开发的,其他端口都应该关闭,比如ssh、ftp、telent服务端口。服务漏洞当您使用绿盟科技或其他工具进行安全扫描时,您会发现一些系统漏洞,例如ntp漏洞和vsftpd漏洞。这时需要停下来打补丁修复,重新扫描,直到全部通过安装MySQL。密码登录对于生产服务器,严禁在本地直接通过密码登录。推荐使用跳板机的jumpserver方式。每个用户使用自己的jumpserver账号登录,然后选择自己要访问的服务器(需要提前通知管理员添加),默认登录用户(如服务器用户)只有只读权限和不能执行任何修改操作。审计功能用户通过jumpserver登录生产服务器的所有操作都应该被审计和记录,这些操作应该定期回放,以确认每一步都是最优的,没有不必要的操作。操作命令历史记录用户登录Linux服务器的所有操作命令都会记录在历史记录中,设置历史记录越大,保存的操作命令记录越多。资源限制通过配置/etc/security/limits.conf文件来限制用户资源使用,例如打开的进程数、文件数、文件大小和内存。服务器备份定期备份服务器。备份内容主要包括Linux内置目录(/usr/var/lib)和MySQL数据目录(数据文件、binlog、undolog、redolog)。同时定期检查备份恢复演练的有效性,以下为阿里云ECS快照。建议每天拍摄快照并保存7天。建议所有账号长度设置为20个字符,包括数字、大写字母、小写字母和特殊字符,如^N9UxOR&ydQWCBvIwqql账号分离对于分布式系统,会有多个服务,服务有调用它们之间的关系,比如trade-service会调用payment-service。为了安全起见,为每个服务创建一个数据库,同时分配自己的账号,禁止跨数据库访问。账号权限保证账号权限最小化原则。对于企业账号,只需要授予连接、查询、添加、修改权限即可。对于使用SSL连接对数据安全性要求较高的业务,建议开启SSL连接,这样即使使用抓包工具分析也看不到具体的SQL文本。但是,从SSL实现的角度来看,建立连接时需要进行握手、加密、解密等操作。连接建立阶段是耗时的。如果使用连接池或者长连接,影响不大。如果是短连接,性能损失比较大。.系统权限mysql.user权限除了mysqlroot账户,其他任何账户都有修改mysql.user表的权限,会带来安全隐患:修改账户密码,修改认证插件。修改账号密码,修改密码认证方式。MySQL默认使用本地密码认证插件mysql_native_password。如果改为auth_socket,则不需要密码。它只检查用户是否使用UNIX套接字进行连接,然后比较用户名。权限风险一般让普通开发者通过jumpserver登录中转机,然后使用mysql-h-u-p以只读账户访问数据库。有时他们也想在information_schema下看到longtransactions(innodb_trx)等相关信息。授予进程系统管理权限会带来一定的安全隐患。这样只读账户也可以查看到innodb_trx表中所有业务账户正在执行的SQL语句,SQL中可能包含敏感信息。在MySQL以前的版本中,具有进程系统权限的用户也可以锁定系统表,比如locktablemysql.userread,从而导致用户操作的修改正常。FILE权限可以通过SELECT.....INTOOUTFILE.....写入服务器上有写权限的目录,并以文本格式存储。也可以通过LOADDATAINFILE....将文本文件数据导入到数据表中。审计功能安装MySQLServer后,需要配置并启用AuditPlugin,这样所有通过MySQLServer执行的SQL都会被记录下来。一方面可以排除问题,另一方面可以做性能监控和分析(比如一段时间内某条SQL的QPS,TPS)。数据备份需要定期备份数据文件和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的安全性也很重要,需要多加注意和了解。以上就是本期的全部内容。我是敖丙你知道的越多,你不知道的就越多。下期见。