数据库安全设置

来源:互联网 发布:mac鼠标滚轮设置 编辑:程序博客网 时间:2024/06/05 14:49
  1. 外围网络 
        尽可能让Mysql处在一个有保护的局域网中,是非常必要的。
  2.主机
        非法用户除了通过登入数据库获取数据以外,还可能通过主机上面的相关的设置权限设置


的漏洞,跳过数据库而直接获取Mysql数据(或者日志)文件达到窃取数据的目的,或直接删除数据(


或者日志)文件达到破坏数据的目的。
  3.数据库
  Mysql的最后一道防线,也是最核心最重要的防线
  Mysql来说,其访问授权相关模块分为2块 一是基本的用户管理模块 另一种是访问授权控制模块


。用户管理模块主要负责用户登录连接相关的基本权限控制,但其在安全控制方面的作用不比任何


环节小。  访问授权控制模块 可以随时随地检查已经进门的访问者,而为未通过校验的访问者,


只能收到 访问越权了 的相关反馈了。


  4.代码


   SQL注入攻击  根据数据库Query语句解析器的原理,利用程序中对客户的提交数据的校验漏洞


,通过程序动态提交数据接口来提交非法数据,达到入侵的目的。
   
   b.程序代码相关安全因素
   如果程序代码权限校验不够仔细且存在安全漏洞,则同样会被入侵
  程序中保存不善的数据库系统连接登陆口令,从而带来更大的损失
---------------------------------------------------------------------
Mysql权限系统介绍


 grant tables 授权表


 Mysql.User  mysql.db mysql.host mysql.Host  mysql.table_priv mysql.column_priv
 权限信息数据量比较小,访问比较频繁,在启动的时候,就会把所有的权限信息都加载到内存中


,并保存在几个特定的结构里。


 1. 权限授权与去除
  授权  grant
  去除  revoke  
  还有一种暴力的方法  那就是直接更新 grant table系统表
  当给某个用户授权的时候,不仅需要指定用户名,还要指定来访主机。如果在授权的时候仅指定


用户名,则Mysql会自动认为是对 username'@' 。如果要去除某个用户的权限同样也需要指定来访


主机
  查看某个用户的权限    show grants for 'username'@'hostname'
   另一种方法是查询grant tables 里面的权限信息
  2.权限级别
  Mysql中权限分为5个级别,分别是:
  Global Level  全局权限控制 ,保存在 mysql.user表中   Global Level的所有权限都是针对


整个mysqld的,对数据库下的所有字段和表都有效
  如果一个权限是Global Level 授予的,则会覆盖其他所有级别的相同权限设置。
  Grant Level 权限列表
--------------------------------
-------------------------------
 root@localhost :mysql 01:01:22> GRANT select,update,delete,insert on *.* TO
'def'@'localhost';
-----------------------------------------------------------------------------
2.Database level
  如果要授予database Level 的权限,可以有2种方式
 1.当执行grant时,通过 database.*来限定权限作用域为database整个数据库
----------------------------------------------------------------------------
 root@localhost :mysql 01:01:22> grant alter on test.* to 'def'@'localhost';


 root@localhost :test 01:01:22> show grants for 'def'@'localhost'
-----------------------------------------------------------------------------
 2.先通过USE命令选定要授权的数据库,然后通过*来限定作用域,这样授权的作用域实际上就是


当前选定的整个数据库。
-----------------------------------------------------------------------
 
 root@localhost :mysql 01:01:22> USE test;
 root@localhost :test 01:01:22> grant drop on * to 'def'@'localhost';
--------------------------------------------------------------------------
 3.Table Level
   其权限作用范围是授权语句中指定数据库的指定表 eg 语句给test数据库的t1表授权
----------------------------------------------------------------------------
 root@localhost :test 01:01:22> grants index on test.t1 to 'def'@'localhost'
 4.Column Level
 权限仅有insert,select,update三种。 column level 的授权语句语法基本和Table Level
差不多,只是需要权限名称后面将要授权的列名列表用括号括起来。
 ---------------------------------------------------------------------
root@localhost :test 01:01:22> grant select(id,name) on test.t2 to 
'abc'@'%.jianzhao.com';
 root@localhost :test 01:01:22> show grants for 'abc'@'%.jianzhao.com';
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  注意:若某个用户向某个表插入数据,但他在该表中的某列上没有insert,则该列的数据将以默


认值填充。这一点跟其他很多数据库不一样 ,是Mysql自己在Sql上做的扩展。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
 5.Routine Level
   权限暂时只有 execute 和alter routine 针对的对象主要是 procedure 和function
当授 Routine Level 权限时,需指定数据库和相关对象
--------------------------------------------------------------------
root@localhost :test 01:01:22 >grant execute on test.p1 to  'abc'@'%.jianzhao.com';
-----------------------------------------------------------------------
6. grant 
  拥有grant权限的用户可以将自身所拥有的任何权限全部授权给其他用户,grant权限是一个非常


特殊也非常重要 的权限。   授欲方式也和其他的不一样,通常是执行 grant授权语句时在最后添


加一 with grant option 字句达到授权目的。
  此外,可以通过 grant all 语句吧某个Level的所有权限授予某个用户
---------------------------------------------------------------------------
 root@localhost :test 01:02:22 >grant all on test.t4 to'abc';
  root@localhost :test 01:02:22 >grant all on pref.* to'abc';
 root@localhost :test 01:02:22 > show grants for 'abc';
-----------------------------------------------------------------------
 
 在以上5个Level的权限中,Table Column Routine 三者在授权中所依赖或者引用 的对象必须是


一家存在的,不想database Level ,可以在当前不存在该数据库的时候就完成授权。


-----------------------------------------


   一个用户要想访问mysql,至少必须提供 host ,user,password这三项数据
root@localhost :mysql 01:02:22 > select host,user,password from user order by user


 这里有一个特殊的的访问控制,如果要通过localhost访问,必须有一个专门针对localhost的授


权信息,即使不对任何主机做限制也不行。  存在add@% 如果不用-h 参数来访问,登陆就会拒绝


,因为mysql默认情况下会连接localhost
  但当指定了-h,明确了指定主机的地址后就没有问题了
 sky@sky -$ mysql -u def -p -h 127.0.0.1
  如果使用一条localhost访问授权,则可以不使用-h来指定登陆host而连接的localhost
 sky@sky :-$ mysql -u abc -p
enter password:


   exit
   bye 
   如果mysql 正在运行中,我们对系统的权限做了调整,调整什么时候会生效?
 先了解mysql存放在内存结构中的权限信息何时被更新; flush privileges 会强行让mysql更新


加载到内存结构的权限信息:grant ,revoke或 create user 和 drop user 操作会直接更细内存


中的权限信息;重启mysql会让mysql完全从grant tables 中读取权限信息。
   内存结构中的权限信息更新后什么时候对已经连接上的用户生效?
  对于 global level 的权限信息修改,只有更改之后的新建连接会用到,已经连接升的session


并不会影响。而对于database Level 的权限信息的更改,只有在客户端请求指定了user 


database_name 命令之后,才会在重新校验中使用它。
   如果在比较紧急的情况下使用 global 和 database 这两个权限变更,可能需要通过kill命令


将已经连接在mysql中的session中止,强迫他们重新连接以使用更新后的权限。 对于table 和


column 的权限,会在下一次需要使用该权限的query被请求时生效,也即在应用来讲,这两个


Level的权限,更新后立即就生效了,不需要执行 kill命令。
    访问控制
  当mysql 接受到客户的的请求之后,访问控制模块要校验该用户是否满足提交的请求所需要的权


限,权限校验过程是从最大范围往最小范围依次校验锁涉及的每个对象的每个权限。
 ---------------------------------------------------------------------------
select id,name from test.t3 where status='delected';
------------------------------------------------------------
 mysql.host 权限表到底在mysql的访问控制中充当了一个什么样的角色?
  1.mysql.host中的权限数据不是通过grant或revoke来授予户去除的,必须手工通过insert,


update,delete命令来修改其中的数据
  2.其中的权限数据无法单独生成,必须和mysql.db权限表的数据一起生效,而且当mysql.db中的


信息不完整时,才会促使访问控制模块,在结合mysql.host中查找是否有相应的补充权限数据实现


以达到权限校验的目的。
 


  实际上mysql永远要优先考虑更精确范围的权限。在mysql内部会按照username和hostname进行排


序,对于相同的username的权限,其host信息越接近访问者的来源host,则排序位置越靠前,越早


被校验使用。而且,mysql在权限校验过程中,只有找到匹配的权限,就不会再继续往后查找是否


有匹配的权限信息,而是直接完成校验过程。






 安全设置的注意事项


 首先,外围第一层防线的网络安全
 我们在mysql启动的时候,通过使用" --skip-networking" 参数选项,让mysql不通过使用tcp/ip


监听网络请求,仅通过命名管道或者共享内存(在window中)或unix套接字文件来和客户的进行连接


交互。
 由于mysql数据库大部分都是网络环境,是通过网络连接提供服务的,所以只有少部分应用能通过


禁用网络监听来断绝网络访问以保持安全,剩下的大部分需要通过其他方案解决


 使用私有局域网络   通过网络设备,统一私有局域网的出口,并通过网络防火墙设备控制出口的


安全。
 使用ssl加密通道   如果数据保密要求非常严格,可以启用mysql提供的ssl访问接口,并将数据


进行加密  使网络传输的数据即使被截获,也无法轻易使用。
 访问授权限定来访主机信息  我们可以在授权的时候,通过主机名,域名或ip,地址信息来限定


来访主机的范围。
  其次,在第二层防线也要做一些注意的地方
  使用网络扫描工具 nmap 扫描主机端口,检查除了mysql监听的3306之外,还可哪些端口是处于


打开监听状态的,去掉不必要的端口。 严格管理os账号,以防止账号信息外泄,尤其是root 


mysql账号。
  对root和Mysql等对Mysql相关文件有特殊操作权限的os账号登录后做出比较显眼的提示,并在


shell提示符中输出当前用户信息,以防止操作的时候经过多次用户切换,出现人为误操作。


  由于Mysql不接受操作系统层面认证,所以任何操作系统层级的账号都不能直接登录Mysql,这一


点和Oracle的权限认证有些区别,所以在这一方面可以减少一些安全方面的考虑


   文件和进程的安全   合理设置文件的权限属性,Mysql相关的数据和日志文件,以及所在的文


件夹属主和所属组都设置为Mysql,且禁用其他所有用户(除了拥有超级全新的用户,如root)的读


写权限,以防止数据或日志文件被窃取或破坏。  因为如果一个用户对Mysql的数据库有读取权限


,可以很容易将数据复制,通过 binary log文件很容易还原整个数据库。如果有些权限的情况下


,数据或日志文件就有被破坏或删除的风险,保护好socket文件的安全,尽量不要使用默认的位置


(/temp/mysql.sock)以防止被有意或无意地删除。


  确保Mysql server 所在主机上必须运行的其他应用程序或服务足够安全,避免因其他应用或服


务存在安全漏洞而被入侵者攻破防线。
  -------参考各种不同os在安全方面的设置做参考


  再次,最后一个防线,Mysql自身的安全设置注意事项 ,在此处,我们就有更多需要注意的地方
  用户设置。 访问数据库的用户都有一个比较复杂的密码,而不是简单或比较规律的字符,以防


止被字典破解程序攻破。
  在Mysql初始化安装完成后,系统中可能存在一个不需要任何密码的root用户,有些版本中还存


在一个可以通过localhost登陆的没有用户名和密码的账号,这些账户会给系统带来很大的安全隐


患,所以我们在正式启用之前要尽早的删除,或设置一个比较安全的密码。对于密码数据的存放,


也不要存放在简单的文本文件中,应该用专用的密码管理软件 keepass。同时,尽可能为每一个账


号限定一定范围的可访问主机。尤其是拥有超级权限的Mysql root账号,尽量保证只能通过


localhost访问。
  安全参数方面,不论从安全方面考虑还是从性能和功能稳定性方面考虑,不用的模块尽量不要启


用,eg 不需要用户自定函数,就不要在启动的时候使用 " -allow-suspicious-udfs"参数选项,


以避免被别有用心的居心的潜在威胁者利用此功能对Mysql的安全威胁;不需要从本地文件中加载


数据到数据库中,就是用"--local-infile=0"禁止从客户的机器上加载文件到数据库中;使用新的


密码规则和校验规则(不要使用"--old-passwords" 启动数据库),这项功能是为了兼容旧版本的密


码校验方式的,如不必要,不要使用该功能,旧版本的密码加密方式要比新的方式脆弱的多。
   除此,还应该让连接Mysql数据库的应用程序足够安全,以防止入侵者通过应用程序中的漏洞入


侵应用服务器,最终通过应用程序中的数据库相关配置获取数据库的登陆口令。
原创粉丝点击