Closed pengjunlong closed 6 years ago
网络:尽可能局域网访问 主机:避免文件级别访问/破坏数据 数据库:本身权限控制
业务代码:应对”SQL注入“;避免用户名、密码等泄露
尽量使用GRANT、REVOKE、CREATE USER及DROP USER命令来进行用户和权限的变更操作,所做的权限调整在修改系统表的同时也会更新内存结构中的权限信息 实现比较简单,主要在几个被称为grant tables的表里维护
Host
,User
), Host
,Db
,User
), Host
,Db
,User
,Table_name
), Host
,Db
,User
,Table_name
,Column_name
)权限分为5个级别
主要是通过用户管理模块和访问控制模块实现 #21 用户管理控制用户能否进门,访问控制控制能拿什么,不能拿什么 用户管理模块主要使用mysql.user中主机名、用户名、密码信息
mysql> select Host,User,authentication_string from user;
+-----------+-----------+-------------------------------------------+
| Host | User | authentication_string |
+-----------+-----------+-------------------------------------------+
| localhost | root | |
| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+-----------+-----------+-------------------------------------------+
如果要通过localhost访问,必须有一条专门针对localhost的授权信息,即使不对任何主机做限制也不行
先了解下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永远优先考虑更精确范围的权限
合理授权
注意事项
使用私有局域网络。我们可以使用私有局域网络,通过网络设备,统一私有局域网的出口,并通过网络防火墙设备控制出口的安全。 使用SSL加密通道。如果数据保密要求非常严格,可以启用MySQL提供的SSL访问接口,将传输数据进行加密。使网络传输的数据即使被截获,也无法轻易使用。 访问授权限定来访主机信息
OS安全方面。关闭MySQL Server主机上面任何不需要的服务,去掉不必要的端口,严格管理OS账号,尤其是root和mysql账号 用非root用户运行MySQL,否则mysqld的进程就会拥有root用户所拥有的权限,任何具有FILE权限的MySQL用户就可以在MySQL中向系统中的任何位置写入文件 文件和进程安全。合理设置文件的权限属性,MySQL相关的数据和日志文件,以及所在的文件夹属主和所属组都设置为mysql,且禁用其他所有用户(除了拥有超级权限的用户,如root)的读写权限
用户设置。我们必须确保任何可以访问数据库的用户都有一个比较复杂的密码;在MySQL初始安装完成之后,系统中可能存在一个不需要任何密码的root用户,尽早删除,或设置一个比较安全的密码,确保只能通过localhost访问 安全参数。在MySQL官方参考手册中也有说明,不论是从安全方面考虑还是从性能及功能稳定性方面考虑,不用的功能模块尽量都不要启用
让连接MySQL数据库的应用程序足够安全,以防止入侵者通过应用程序中的漏洞入侵应用服务器,最终通过应用程序中的数据库相关配置获取数据库的登录口令