pengjunlong / pengjunlong.github.io

Github+Markdown+hexo搭建自己的空间
https://pengjunlong.github.io
1 stars 0 forks source link

第4章 MySQL安全管理 39 #23

Closed pengjunlong closed 6 years ago

pengjunlong commented 6 years ago
pengjunlong commented 6 years ago

image 网络:尽可能局域网访问 主机:避免文件级别访问/破坏数据 数据库:本身权限控制

业务代码:应对”SQL注入“;避免用户名、密码等泄露

pengjunlong commented 6 years ago

权限系统

尽量使用GRANT、REVOKE、CREATE USER及DROP USER命令来进行用户和权限的变更操作,所做的权限调整在修改系统表的同时也会更新内存结构中的权限信息 实现比较简单,主要在几个被称为grant tables的表里维护

权限分为5个级别

  1. Global Level,全局权限控制,针对整个mysqld,在mysql.user维护,会覆盖其它级别权限设置;用"*"指定适用范围是global
  2. Database Level,整个数据库所有对象控制,少了一些全局权限如用户创建等;用"database."限定生效数据库或者use选定某个库后用""指定
  3. Table Level,指定数据库的指定表控制,
  4. Column Level,指定某个表的某个(某些)列,只有insert、update、select三种权限,注意:若某用户向某个表插入(INSERT)数据,但他在该表中的某列上没有INSERT权限,则该列的数据将以默认值填充。这一点和很多其他的数据库有区别,是MySQL自己在SQL上面所做的扩展
  5. Routine Level,主要针对procedure和function
  6. GRANT权限,即将自己拥有的任何权限授予其他用户,通常是执行GRANT授权语句时在最后添加WITH GRANT OPTION子句达到授权目的

主要是通过用户管理模块和访问控制模块实现 #21 用户管理控制用户能否进门,访问控制控制能拿什么,不能拿什么 image 用户管理模块主要使用mysql.user中主机名、用户名、密码信息

mysql> select Host,User,authentication_string from user;
+-----------+-----------+-------------------------------------------+
| Host      | User      | authentication_string                     |
+-----------+-----------+-------------------------------------------+
| localhost | root      |                                           |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+-----------+-----------+-------------------------------------------+

如果要通过localhost访问,必须有一条专门针对localhost的授权信息,即使不对任何主机做限制也不行

如果MySQL正在运行之中,我们对系统做了权限调整,那调整什么时候会生效呢?

先了解下MySQL存放于内存结构中的权限信息何时被更新:FLUSH PRIVILEGES会强行让MySQL更新加载到内存中的权限信息;GRANT、REVOKE或CREATE USER和DROP USER操作会直接更新内存中的权限信息;重启MySQL会让MySQL完全从grant tables中读取权限信息。 内存结构中的权限信息更新之后何时对已经连接上的用户生效呢? 对于Global Level的权限信息修改,只有更改之后的新建连接会用到,已经连接上的session并不会受影响。而对于Database Level的权限信息的修改,只有在客户端请求执行了“USE database_name”命令之后,才会在重新校验中使用它。所以有些时候如果做了比较紧急的Global和Database这两个Level的权限变更,可能须要通过“KILL”命令将已经连接在MySQL中的session中止,强迫他们重新连接以使用更新后的权限。对于Table Level和Column Level的权限,则会在下一次须使用该权限的Query被请求时生效,也就是说,对于应用来讲,这两个Level的权限,更新之后立刻就生效了,不须要执行“KILL”命令

访问控制时,从Global Level逐级往下找,所需权限是否有匹配项 如果同一个用户有两条权限信息,一条是针对特定域名的,另外一个是含有通配符的域名,而且前者被后者包含。这时候MySQL如何来确定权限信息呢?实际上MySQL永远优先考虑更精确范围的权限

pengjunlong commented 6 years ago

合理授权

pengjunlong commented 6 years ago

注意事项

网络

使用私有局域网络。我们可以使用私有局域网络,通过网络设备,统一私有局域网的出口,并通过网络防火墙设备控制出口的安全。 使用SSL加密通道。如果数据保密要求非常严格,可以启用MySQL提供的SSL访问接口,将传输数据进行加密。使网络传输的数据即使被截获,也无法轻易使用。 访问授权限定来访主机信息

主机

OS安全方面。关闭MySQL Server主机上面任何不需要的服务,去掉不必要的端口,严格管理OS账号,尤其是root和mysql账号 用非root用户运行MySQL,否则mysqld的进程就会拥有root用户所拥有的权限,任何具有FILE权限的MySQL用户就可以在MySQL中向系统中的任何位置写入文件 文件和进程安全。合理设置文件的权限属性,MySQL相关的数据和日志文件,以及所在的文件夹属主和所属组都设置为mysql,且禁用其他所有用户(除了拥有超级权限的用户,如root)的读写权限

MySQL自身安全设置

用户设置。我们必须确保任何可以访问数据库的用户都有一个比较复杂的密码;在MySQL初始安装完成之后,系统中可能存在一个不需要任何密码的root用户,尽早删除,或设置一个比较安全的密码,确保只能通过localhost访问 安全参数。在MySQL官方参考手册中也有说明,不论是从安全方面考虑还是从性能及功能稳定性方面考虑,不用的功能模块尽量都不要启用

应用程序

让连接MySQL数据库的应用程序足够安全,以防止入侵者通过应用程序中的漏洞入侵应用服务器,最终通过应用程序中的数据库相关配置获取数据库的登录口令