设为首页 收藏本站
查看: 1138|回复: 0

[经验分享] MySQL 安全配置

[复制链接]
YunVN网友  发表于 2018-10-7 08:31:17 |阅读模式
  一、前言
  很多文章中会说,数据库的权限按最小权限为原则,这句话本身没有错,但是却是一句空话。因为最小权限,这个东西太抽象,很多时候你并弄不清楚具体他需要哪些权限。 现在很多mysql用着root账户在操作,并不是大家不知道用root权限太大不安全,而是很多人并不知道该给予什么样的权限既安全又能保证正常运行。所以,本文更多的是考虑这种情况下,我们该如何简单的配置一个安全的mysql。注:本文测试环境为mysql-5.6.4
  二、Mysql权限介绍
  mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表。
  mysql权限表的验证过程为:
  1.先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。
  2.通过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
  三、mysql有哪些权限
  权限  权限级别    权限说明
  CREATE  数据库、表或索引    创建数据库、表或索引权限
  DROP    数据库或表   删除数据库或表权限
  GRANT OPTION    数据库、表或保存的程序 赋予权限选项
  REFERENCES  数据库或表
  ALTER   表   更改表,比如添加字段、索引等
  DELETE  表   删除数据权限
  INDEX   表   索引权限
  INSERT  表   插入权限
  SELECT  表   查询权限
  UPDATE  表   更新权限
  CREATE VIEW 视图  创建视图权限
  SHOW VIEW   视图  查看视图权限
  ALTER ROUTINE   存储过程    更改存储过程权限
  CREATE ROUTINE  存储过程    创建存储过程权限
  EXECUTE 存储过程    执行存储过程权限
  FILE    服务器主机上的文件访问 文件访问权限
  CREATE TEMPORARY TABLES 服务器管理   创建临时表权限
  LOCK TABLES 服务器管理   锁表权限
  CREATE USER 服务器管理   创建用户权限
  PROCESS 服务器管理   查看进程权限

  RELOAD  服务器管理   执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh,>  REPLICATION CLIENT  服务器管理   复制权限
  REPLICATION SLAVE   服务器管理   复制权限
  SHOW DATABASES  服务器管理   查看数据库权限
  SHUTDOWN    服务器管理   关闭数据库权限
  SUPER   服务器管理   执行kill线程权限
  四、数据库层面(db表)的权限分析
  权限  说明  网站使用账户是否给予
  Select  可对其下所有表进行查询 建议给予
  Insert  可对其下所有表进行插入 建议给予
  Update  可对其下所有表进行更新 建议给予
  Delete  可对其下所有表进行删除 建议给予
  Create  可在此数据库下创建表或者索引  建议给予
  Drop    可删除此数据库,及此数据库下的表    不建议给予
  Grant   赋予权限选项  不建议给予
  References  未来MySQL特性的占位符   不建议给予
  Index   可对其下的所有表进行索引    建议给予
  Alter   可对其下的所有表进行更改    建议给予
  Create_tmp_table    创建临时表   不建议给予
  Lock_tables 可对其下所有表进行锁定 不建议给予
  Create_view 可在此数据下创建视图  建议给予
  Show_view   可在此数据下查看视图  建议给予
  Create_routine  可在此数据下创建存储过程    不建议给予
  Alter_routine   可在此数据下更改存储过程    不建议给予
  Execute 可在此数据下执行存储过程    不建议给予
  Event   可在此数据下创建事件调度器   不建议给予
  Trigger 可在此数据下创建触发器 不建议给予
  五、mysql安全配置方案
  1 限制访问mysql端口的ip
  windows可以通过windows防火墙或者ipsec来限制,linux下可以通过iptables来限制。
  2 修改mysql的端口
  windows下可以修改配置文件my.ini来实现,linux可以修改配置文件my.cnf来实现。
  3 对所有用户设置强密码并严格指定对应账号的访问ip
  mysql中可在user表中指定用户的访问可访问ip
  4 root特权账号的处理
  建议给root账号设置强密码,并指定只容许本地登录
  5 日志的处理
  如需要可开启查询日志,查询日志会记录登录和查询语句。
  6 mysql进程运行账号
  在windows下禁止使用local system来运行mysql账户,可以考虑使用network service或者自己新建一个账号,但是必须给与mysql程序所在目录的读取权限和data目录的读取和写入权限; 在linux下,新建一个mysql账号,并在安装的时候就指定mysql以mysql账户来运行,给与程序所在目录的读取权限,data所在目录的读取和写入权限。
  7 mysql运行账号的磁盘权限
  1)mysql运行账号需要给予程序所在目录的读取权限,以及data目录的读取和写入权限
  2)不容许给予其他目录的写入和执行权限,特别是有网站的。
  3)取消mysql运行账户对于cmd,sh等一些程序的执行权限。
  8 网站使用的mysql账户的处理
  新建一个账户,给予账户在所使用数据库的所有权限即可。这样既能保证网站对所对应的数据库的全部操作,也能保证账户不会因为权限过高而影响安全。给予单个数据库的所有权限的账户不会拥有super, process, file等管理权限的。 当然,如果能很明确是的知道,我的网站需要哪些权限,还是不要多给权限,因为很多时候发布者并不知道网站需要哪些权限,我才建议上面的配置。而且我指的通用的,具体到只有几台机器,不多的情况下,我个人建议还是给予只需要的权限,具体可参考上面的表格的建议。
  9 删除无用数据库
  test数据库对新建的账户默认有权限
  六、mysql***提权分析及防止措施
  一般来说,mysql的提权有这么几种方式:
  1 udf提权
  此方式的关键导入一个dll文件,个人认为只要合理控制了进程账户对目录的写入权限即可防止被导入dll文件;然后如果万一被攻破,此时只要进程账户的权限够低,也没办执行高危操作,如添加账户等。
  2 写入启动文件
  这种方式同上,还是要合理控制进程账户对目录的写入权限。
  3 当root账户被泄露
  如果没有合理管理root账户导致root账户被***,此时数据库信息肯定是没办法保证了。但是如果对进程账户的权限控制住,以及其对磁盘的权限控制,服务器还是能够保证不被沦陷的。
  4 普通账户泄露(上述所说的,只对某个库有所有权限的账户)
  此处说的普通账户指网站使用的账户,我给的一个比较方便的建议是直接给予特定库的所有权限。账户泄露包括存在注入及web服务器被***后直接拿到数据库账户密码。
  此时,对应的那个数据库数据不保,但是不会威胁到其他数据库。而且这里的普通账户无file权限,所有不能导出文件到磁盘,当然此时还是会对进程的账户的权限严格控制。
  普通账户给予什么样的权限可以见上表,实在不会就直接给予一个库的所有权限。
  七、安全配置需要的常用命令
  1.新建一个用户并给予相应数据库的权限

  grant select,insert,update,delete,create,drop privileges on database.* to user@localhost>
  grant all privileges on database.* to user@localhost>  2.刷新权限
  flush privileges;

  • 显示授权
  show grants;

  • 移除授权
  revoke delete on . from 'jack'@'localhost';

  • 删除用户
  drop user 'jack'@'localhost';

  • 给用户改名
  rename user 'jack'@'%' to 'jim'@'%';

  • 给用户改密码
  SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

  • 删除数据库
  drop database test;

  • 从数据库导出文件
  select * from a into outfile "~/abc.sql"


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-614150-1-1.html 上篇帖子: mysql复制的工作原理及主从复制的实现 下篇帖子: 7、MySQL数据库的视图操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表