精华内容
下载资源
问答
  • 影响数据库性能的常见因素

    千次阅读 2015-03-22 18:39:39
    1、影响数据库性能的常见因素: -> 读写竞争 -> 事务竞争 -> 频繁的事务处理 2、数据库需要保证数据的准确与安全,提出来事务(transactio)的概念 严格的定义:满足原子、一致、持久和隔离的操作成为事务。...

    1、影响数据库性能的常见因素:

    -> 读写竞争

    -> 事务竞争

    -> 频繁的事务处理

    2、数据库需要保证数据的准确与安全,提出来事务(transactio)的概念

    ->严格的定义:满足原子性、一致性、持久性和隔离性的操作成为事务。
    ->隔离性会影响到数据的性能
    如:需要读取id=100的数据的同时要修改id为90-100的数据,就会有隔离性限制
    ->由上面的例子提出隔离级别的概念
    1. 未提交读:读取到刚刚修改的数据,但是数据库还没有同步该数据(脏读),原理看Mysql的架构图,没同步时还在内存中
    2. 已提交读:等待
    3. 可重复读:等待
    4. 序列化读:等待
    ->等待机制就是锁,主要的有共享锁和排他锁

    ->因为多事务交叉,可能出现死锁:

    记录一:
    先读取结果
    根据结果修改值
    记录二:
    修改某一些值
    查询最后的结果

    如果线程A锁住了记录1并等待记录2,而线程B锁住了记录2并等待记录1,这样两个线程就发生了死锁现象。此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞了的资源。

    3、数据库应用的分类:

    联机事务处理(OLTP):增删改
    联机事务分析(OLAP):查
    展开全文
  • 一、数据库安全性概述 定义:保护数据库以防止不合法使用所造成的数据泄露,更改或破坏。 二、不安全因素 非授权用户对数据库的恶意存取和破坏 一些黑客(Hacker)和犯罪分子在用户存取数据库时猎取用户名和用户...

    一、数据库安全性概述

    定义:保护数据库以防止不合法使用所造成的数据泄露,更改或破坏。

    二、不安全因素

    非授权用户对数据库的恶意存取和破坏 一些黑客(Hacker)和犯罪分子在用户存取数据库时猎取用户名和用户口令,然后假冒合法用户偷取、修改甚至破坏用户数据
    数据库中重要或敏感的数据被泄露 黑客和敌对分子千方百计盗窃数据库中的重要数据,一些机密信息被暴露
    安全环境的脆弱性 计算机硬件、操作系统、网络系统等的安全性直接影响数据库的安全
    管理制度不健全,有法不依、执法不严 单位内部用户有意无意地泄露用户信息

    三、数据库安全标准

    1.发展历程

    时间 名称 评估准则
    1985年 美国国防部(DoD)正式颁布《DoD可信计算机系统评估准则》(简称TCSEC或DoD85) 欧洲的信息技术安全评估准则(ITSEC) 加拿大的可信计算机产品评估准则(CTCPEC) 美国的信息技术安全联邦标准(FC)
    1993 CTCPEC、FC、TCSEC和ITSEC联合行动,解决原标准中概念和技术上的差异,称为CC(Common Criteria)项目 -----------
    1999 CC V2.1版被ISO采用为国际标准, 2001年 CC V2.1版被我国采用为国家标准 -----------

    目前CC已基本取代了TCSEC,成为评估信息产品安全性的主要标准
    在这里插入图片描述
    TCSEC/TDI安全级别划分
    在这里插入图片描述

    四、CC安全标准内容

    1. CC ,提出国际公认的表述信息技术安全性的结构,把信息产品的安全要求分为:

    安全功能要求 安全保证要求

    1. CC评估保证级

    在这里插入图片描述

    五、我国信息系统安全保护等级

    《信息安全等级保护管理办法》规定,信息系统的安全保护等级分为以下五级,一至五级等级逐级增高:

    第一级,信息系统受到破坏后,会对公民、法人和其他组织的合法权益造成损害,但不损害国家安全、社会秩序和公共利益。第一级信息系统运营、使用单位应当依据国家有关管理规范和技术标准进行保护。
    第二级,信息系统受到破坏后,会对公民、法人和其他组织的合法权益产生严重损害,或者对社会秩序和公共利益造成损害,但不损害国家安全。国家信息安全监管部门对该级信息系统安全等级保护工作进行指导。
    第三级,信息系统受到破坏后,会对社会秩序和公共利益造成严重损害,或者对国家安全造成损害。国家信息安全监管部门对该级信息系统安全等级保护工作进行监督、检查。
    第四级,信息系统受到破坏后,会对社会秩序和公共利益造成特别严重损害,或者对国家安全造成严重损害。国家信息安全监管部门对该级信息系统安全等级保护工作进行强制监督、检查。
    第五级,信息系统受到破坏后,会对国家安全造成特别严重损害。国家信息安全监管部门对该级信息系统安全等级保护工作进行专门监督、检查。

    我国安全法相关的法律法规

    1.《中华人民共和国网络安全法》,2017年6月1日起施行。
    2. 《中华人民共和国个人信息保护法(草案)》。
    3.《互联网信息服务管理办法》,2000年9月25日施行。
    4.《计算机信息网络国际联网安全保护管理办法》,1997年12月30日实施。
    5.中办、国办《关于进一步加强互联网管理工作的意见》(中办发[2004]32号)。
    6.中央网信办《关于加强党政机关网站安全管理的通知》(中网办发文[2014]1号)。

    六、 数据库安全控制

    1. 非法掌控数据库几种情况
    • 编写合法程序绕过数据库管理系统及其授权机制;
    • 直接或编写应用程序执行非授权操作;
    • 通过多次合法查询数据库从中推导出一些保密数据。
    1. 计算机系统进行防范举措
    • 系统根据用户标识鉴定用户身份,合法用户才准许进入计算机系统。
    • 数据库管理系统还要进行存取控制,只允许用户执行合法操作 。
    • 操作系统有自己的保护措施 。
    • 数据以密码形式存储到数据库中。
    1. 存取控制流程

    第一,数据库管理系统对提出SQL访问请求的数据库用户进行身份鉴别,防止不可信用户使用系统。
    第二,在SQL处理层进行自主存取控制和强制存取控制,进一步可以进行推理控制。
    第三 对用户访问行为和系统关键操作进行审计,对异常用户行为进行简单入侵检测。

    1. 用户身份鉴别
    静态口令鉴别 静态口令一般由用户自己设定,这些口令是静态不变的。
    动态口令鉴别 口令是动态变化的,每次鉴别时均需使用动态产生的新口令登录数据库管理系统,即采用一次一密的方法。
    生物特征鉴别 通过生物特征进行认证的技术,生物特征如指纹、虹膜和掌纹等。
    智能卡鉴别 智能卡是一种不可复制的硬件,内置集成电路的芯片,具有硬件加密功能。
    1. 存取控制
      存取控制机制主要包括定义用户权限和合法权限检测两部分:
      • 定义用户权限(将用户权限登记到数据字典中去):用户对某一个数据对象的操作权力称为权限
      • 合法权限检查: DBMS提供适当的语言来定义用户权限,存放在数据字典中,称做安全规则或授权规则合法权限检查; 用户发出存取数据库操作请求,DBMS查找数据字典,进行合法权限检查; 用户权限定义和合法权检查机制一起组成了数据库管理系统的存取控制子系统。
    2. 常见的存取控制方法
    方法 级别 描述
    自主存取控制(DAC) C2级 用户对不同的数据对象有不同的存取权限;不同的用户对同一对象也有不同的权限;用户还可将其拥有的存取权限转授给其他用户。
    强制存取控制(MAC) B1级 每一个数据对象被标以一定的密级;每一个用户也被授予某一个级别的许可证;对于任意一个对象,只有具有合法许可证的用户才可以存取。

    关系数据库系统中的存取权限
    在这里插入图片描述

    七、授权(GRANT)

    1、语法

    GRANT <权限>[,<权限>]... 
    ON <对象类型> <对象名>[,<对象类型> <对象名>]TO <用户>[,<用户>]...
    [WITH  GRANT OPTION] ;   
    说明:WITH  GRANT OPTION  表示用户可以转授此权限。 
    

    2、功能

    将对指定操作对象的指定操作权限授予指定的用户 。

    3、能执行GRANT命令的数据库用户:

    数据库管理员 数据库对象创建者(即属主Owner) 拥有该权限的用户

    4、按受权限的用户

    一个或多个具体用户
    PUBLIC(即全体用户)

    5、权限不能循环转授
    、、、
    6、实例

    把查询XXX表的权限授予用户User GRANT SELECT ON TABLE Student TO U1;
    把对S1表和S2表的全部权限授予用户U1和U2。 GRANT ALL PRIVILIGES ON TABLE S1 ,S2 TO U1,U2
    把对表SC的查询权限授予所有用户 GRANT SELECT ON TABLE SC TO PUBLIC
    把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户 GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION

    说明:U5不仅拥有了对表SC的INSERT权限, 还可以转授此权限

    八、回收授权(REVOKE)

    1、语法
    REVOKE <权限>[,<权限>]…
    ON <对象类型> <对象名>[,<对象类型><对象名>]…
    FROM <用户>[,<用户>]…[CASCADE | RESTRICT];
    说明:

    2、功能
    收回授予用户的权限,授予的权限可以由数据库管理员或其他授权者用户。

    把用户U修改学生学号的权限收回 REVOKE UPDATE(Sno) ON TABLE STUDENT FROM U
    收回所有用户对表SC的查询权限 REVOKE SELECT ON TABLE SC FROM PUBLIC
    把用户U5对SC表的INSERT权限收 REVOKE INSERT ON TABLE SC FROM U5 CASCADE

    注意:CASCADE:级联 RESTRICT: 限制;

    此处:将用户U5的INSERT权限收回的时候应该使用CASCADE,否则拒绝执行该语句 ;
    如果U6或U7还从其他用户处获得对SC表的INSERT权限,则他们仍具有此权限,系统只收回直接或间接从U5处获得的权限 。

    3.小结

    数据库管理员(DBA): 拥有所有对象的所有权限;根据实际情况不同的权限授予不同的用户。
    用户 拥有自己建立的对象的全部的操作权限;可以使用GRANT,把权限授予其他用户。
    被授权的用户 如果具有“继续授权”的许可,可以把获得的权限再授予其他用户;所有授予出去的权力在必要时又都可用REVOKE语句收回。

    九、 CREATE USER语句

    1.语法: 数据库管理员在创建用户时实现
    CREATE USER < username>
    [ WITH] [DBA|RESOURCE|CONNECT];

    注:CREATE USER不是SQL标准,各个系统的实现相差甚远
    2.CREATE USER语句说明:

    • 只有系统的超级用户才有权创建一个新的数据库用户; 新创建的数据库用户有三种权限:CONNECT、RESOURCE和DBA;
    • 如没有指定创建的新用户的权限,默认该用户拥有CONNECT权限。拥有CONNECT权限的用户不能创建新用户,不能创建模式,也不能创建基本表,只能登录数据库;
    • 拥有RESOURCE权限的用户能创建基本表和视图,成为所创建对象的属主。但不能创建模式,不能创建新的用户;
    • 拥有DBA权限的用户是系统中的超级用户,可以创建新的用户、创建模式、创建基本表和视图等;DBA拥有对所有数据库对象的存取权限,还可以把这些权限授予一般用户
      在这里插入图片描述

    十、数据库角色

    1、数据库角色定义

    是一个具有一组确定数据库权限的对象,用户与该角色绑定便获得了该角色具有的权限。

    2、创建角色

    CREATE ROLE <角色名>

    3、给角色授权

    GRANT <权限>[,<权限>]…
    ON <对象类型>对象名
    TO <角色>[,<角色>]…

    4、将一个角色授予其他的角色或用户

    GRANT <角色1>[,<角色2>]…
    TO <角色3>[,<用户1>]…
    [WITH ADMIN OPTION]

    说明:
    该语句把角色授予某用户,或授予另一个角色; 授予者是角色的创建者或拥有在这个角色上的ADMIN OPTION; 指定了WITH ADMIN
    OPTION则获得某种权限的角色或用户还可以把这种权限授予其他角色; 一个角色的权限:直接授予这个角色的全部权限加上其他角色,授予这个角色的全部权限。

    5、角色权限的收回

    REVOKE <权限> [,<权限>]…
    ON <对象类型> <对象名>
    FROM <角色>[,<角色>]…
    说明:
    用户可以回收角色的权限,从而修改角色拥有的权限;
    REVOKE执行者是角色的创建者,拥有在这个(些)角色上的ADMIN OPTION。

    6、实例
    创建一个角色:R1—》

    GRANT ROLE R1
    

    赋予查询,更新,插入权限给角色R1

    GRANT SELECT ,UPDATE,INSERT ON TABLE T1 TO R1 
    

    赋予XXXR1的所有权限

    GRANT R1 TO XXX
    

    删除R1的删除权限

    REVOKE DELETE ON TABLE T1 FROM R1 
    

    十一、强制存取控制(MAC)

    1、在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类:

    1、主体是系统中的活动实体 ,数据库管理系统所管理的实际用户, 代表用户的各进程。
    2、客体是系统中的被动实体,受主体操纵 的数据对象 文件、基本表、索引、视图

    实现强制存取控制时要首先实现自主存取控制
    原因:较高安全性级别提供的安全保护要包含较低级别的所有保护
    2、敏感标记
    对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label), 敏感度标记分成若干级别:

    • 绝密(Top Secret,TS)
    • 机密(Secret,S)
    • 可信(Confidential,C)
    • 公开(Public,P)TS>=S>=C>=P
      主体的敏感度标记称为许可证级别(Clearance Level)
      客体的敏感度标记称为密级(Classification Level)

    3、强制存取控制规则

    1、仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体。
    2、仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体

    4、DAC + MAC安全检查
    在这里插入图片描述
    先进行自主存取控制检查,通过自主存取控制检查的数据对象再由系统进行强制存取控制检查,只有通过强制存取控制检查的数据对象方可存取。

    十二、审计

    审计功能把用户对数据库的所有操作自动记录下来放入审计日志中,审计员可以利用审计日志监控数据库的各种行为。
    1、审计事件

    • 服务器事件
    • 审计数据库服务器发生的事件
    • 系统权限
    • 对系统拥有的结构或模式对象进行操作的审计要求该操作的权限是通过系统权限获得的
    • 语句事件
    • 对SQL语句,如DDL、DML及DCL语句的审计
    • 模式对象事件
    • 对特定模式对象上进行的SELECT或DML操作的审计

    2、审计功能
    基本功能:提供多种审计查阅方式提供多种审计查阅方式
    多套审计规则:一般在初始化设定
    提供审计分析和报表功能
    审计日志管理功能

    防止审计员误删审计记录, 审计日志必须先转储后删除
    对转储的审计记录文件提供完整性和保密性保护
    只允许审计员查阅和转储审计记录不允许任何用户新增和修改审计记录等

    提供查询审计设置及审计记录信息的专门视图

    3、AUDIT语句和NOAUDIT语句

    AUDIT语句:设置审计功能
    NOAUDIT语句:取消审计功能

    4、实例
    对修改SC表结构或修改SC表数据的操作进行审计

    AUDIT  ALTER,UPDATE ON  SC;
    

    取消对SC表的一切审计

    NOAUDIT ALTER UPDATE ON CS;
    

    十三、数据加密

    1、数据加密
    防止数据库中数据在存储和传输中失密的有效手段。

    1.1、加密的基本思想
    根据一定的算法将原始数据—明文(Plain text)变换为不可直接识别的格式­—密文(Cipher text)。

    加密方法
    存储加密
    传输加密

    2、存储加密

    • 透明存储加密 内核级加密保护方式,对用户完全透明 将数据在写到磁盘时对数据进行加密,授权用户读取数据时再对其进行解密
    • 数据库的应用程序不需要做任何修改,只需在创建表语句中说明需加密的字段即可 内核级加密方法: 性能较好,安全完备性较高 非透明存储加密
    • 通过多个加密函数实现

    3、传输加密

    链路加密 在链路层进行加密 传输信息由报头和报文两部分组成
    报文和报头均加密
    端到端加密
    在发送端加密,接收端解密
    只加密报文不加密报头
    所需密码设备数量相对较少,容易被非法监听者发现并从中获取敏感信息

    在这里插入图片描述

    十四、其他安全保护

    • 推理控制

    处理强制存取控制未解决的问题
    避免用户利用能够访问的数据推知更高密级的数据

    • 常用方法

    基于函数依赖的推理控制 基于敏感关联的推理控制

    • 隐蔽信道

    处理强制存取控制未解决的问题

    • 数据隐私保护

    描述个人控制其不愿他人知道或他人不便知道的个人数据的能力
    范围很广:数据收集、数据存储、数据处理和数据发布等各个阶段

    展开全文
  • 结合煤矿安全的主要影响因素,分析了数据库的存储结构,并探讨了行存储数据库模拟列存储数据库的可能,最后,通过自回归模型进行了瓦斯排放分析。
  • [MySQL Reference Manual] 6 安全性 ...6. 安全性 ...在Mysql安装配置时要考虑安全性影响,以下...Ÿ 常规因素影响安全性 Ÿ 程序自身安全性 Ÿ 数据库内部的安全性,即,访问控制 Ÿ 网络安全性和系统...

    6. 安全性

    Mysql安装配置时要考虑安全性的影响,以下几点:

    Ÿ   常规因素影响安全性

    Ÿ   程序自身安全性

    Ÿ   数据库内部的安全性,即,访问控制

    Ÿ   网络安全性和系统安全性

    Ÿ   数据文件的备份,日志文件和配置文件的安全性

    6. 安全性... 1

    6.1 常规安全性问题... 2

    6.1.1安全性最佳实践... 2

    6.1.2 保持密码安全性... 2

    6.1.2.1终端用户密码安全性最佳实践... 2

    6.1.2.2 密码管理方法... 3

    6.1.2.3 密码和日志... 3

    6.1.2.4 Mysql中的密码hash. 3

    6.1.2.5 mysql 4.1的应用程序的密码hash修改实现... 4

    6.1.2.6 密码验证插件... 4

    6.1.3 防止Mysql被攻击... 4

    6.1.4 安全相关的mysqld选项和变量... 5

    6.1.5 使用常规用户启动mysql5

    6.1.6 LOAD DATA LOCAL安全问题... 5

    6.1.7客户端程序安全性... 6

    6.2 mysql访问权限系统... 6

    6.2.1 mysql提供的权限... 7

    6.2.2 权限系统权限表... 8

    6.2.3 指定帐号(Account)... 8

    6.2.4 访问控制,阶段1:连接验证... 9

    6.2.5 访问控制,阶段2:请求验证... 10

    6.2.6 权限修改生效时间... 10

    6.2.7 访问拒绝的例子... 11

    6.3 MySQL用户帐号管理... 11

    6.3.1用户名和密码... 11

    6.3.2 增加用户帐号... 11

    6.3.3 删除用户帐号... 11

    6.3.4 设置帐号的资源限制... 12

    6.3.5 设置密码... 12

    6.3.6 密码过期和沙盘模式... 13

    6.3.6.1 密码过期工作原理... 13

    6.3.7 插件式验证(Pluggable Authentication... 13

    6.3.7.1 验证插件的使用方法... 14

    6.3.8 MySQL中可用的验证插件... 14

    6.3.9 代理用户(proxy user... 14

    6.3.9.1授予PROXY权限... 15

    6.3.9.2 默认proxy用户... 15

    6.3.9.3 代理用户系统变量... 16

    6.3.10 使用SSL加密连接... 16

    6.3.10.1 基本SSL概念... 16

    6.3.10.2 为mysql配置SSL. 16

    6.3.9.10.3 使用SSL连接... 17

    6.3.10.4 SSL相关配置... 18

    6.3.10.5 为mysql生成证书和公钥私钥... 18

    6.3.11  从windows使用ssh链接到mysql18

    6.3.12 Mysql企业版审计日志插件... 18

    6.3.12.1 安装审计插件... 19

    6.3.12.2 审计日志安全性考虑... 19

    6.3.12.3 审计日志... 19

    6.3.12.4 审计日志记录控制... 19

    6.3.12.5 审计日志插件选项和变量... 19

    6.3.13 SQL-Based MySQL账号活动审计... 20

     

    6.1 常规安全性问题

    6.1.1安全性最佳实践

    当运行mysql,有一下一些最佳实践:

    1.静止用户访问mysql数据库上面的表

    2.学习权限是如何工作的。不要授予过多的权限

           checklist:测试mysql –uroot 连接,使用show grant查看被赋予了什么权限

    3.不要在数据库中存明文密码

    4.不要从字典里面选密码

    5.安装防火墙

    6.不能信任任何应用写入的数据,应该通过防御编程技术写入(defensive programming techniques)

    7.学会使用tcpdumpstrings工具截取tcp中的数据

    6.1.2 保持密码安全性

    6.1.2.1终端用户密码安全性最佳实践

    1.使用mysql_config_editor工具,把认证数据写入到加密的.mylogin.cnf文件。

    2.使用-ppassword或者—password=password会暴露密码明文

    3.使用 -p--password不指定密码,交互方式数据密码,避免密码明文暴露

    4.如果密码明文方式在配置文件中,记得修改linux权限不让其他人访问。

    5.把密码存放在环境变量 MYSQL_PWD,不推荐的访问,会验证影响安全。

    linux中,mysql客户端会记录命令在.mysql_history,create usergrantset password的时候会写入到文件,为了安全性最好限制访问模式。

    6.1.2.2 密码管理方法

    1.不能让非管理员用户访问mysql.user表。

    2.使用密码过期强制用户重设密码

    3.使用validate_password插件强化密码策略

    6.1.2.3 密码和日志

    使用语句 create usergrantset password或者调用了password函数,密码都是明文的,如果被记录,那么可能会被其他任何能够访问日志文件的人看到。

    mysql 5.6.3之后就不会以下语句,日志文件上出现明文(mariadb 10.0也不会显示明文):

    CREATE USER ... IDENTIFIED BY ...

    GRANT ... IDENTIFIED BY ...

    SET PASSWORD ...

    SLAVE START ... PASSWORD = ...              (as of 5.6.4)

    CREATE SERVER ... OPTIONS(... PASSWORD ...) (as of 5.6.9)

    ALTER SERVER ... OPTIONS(... PASSWORD ...)  (as of 5.6.9)

     

    语句中的密码不会出现在,general query logslow query logbinary loggeneral query logpassword 重写可以使用—log-raw选项来限制。(使用mariadb 10.0测试无效)

    审计日志的文本是不加密的,所以不能让其他用户访问。

    为了尽量避免日志内容保留,应该不能让系统和数据库管理员之外的用户访问日志文件。

    复制slavemaster info repository中保存了复制master的密码,会存在一个文件或者一个表中。要保证repository只能被数据库管理员读取。

    6.1.2.4 Mysql中的密码hash

    mysql的用户存放在mysql.user下,每个账号都有一个密码,密码是以hash值存放的。

    mysql,在clientserver交互的2个阶段用到密码:

    1.client连接会把密码的hash,然后和user表的密码进行匹配

    2.在登陆之后,可以修改密码。

     

    原先的hash方法(4.1版本之前)会产生16字节的字符串。4.1版本之后的hash方法产生41字节的字符串并且密码以*号开头。

    使用old_password()就是使用老的hash方法。当old_password变量为1是,password函数产生的结果16字节长度。

    6.1.2.5 mysql 4.1的应用程序的密码hash修改实现

    6.1.2.6 密码验证插件

    validate_password5.6.6之后),用来测试密码的安全性。这个插件有2个功能:

    1.检查密码明文的密码策略

    2.通过长度看密码强壮性。

    如果使用密码明文,那么就会对密码进行验证,如果直接用hash值,那么就不验证。

     

    密码验证插件安装方法:

    1.使用配置文件

    [mysqld]

    plugin-load=validate_password.so

    2.使用instal plugin命令,使用后会在mysql.plugins表中加入记录,下次启动会自动加载。

    mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';

    validate-password可以用来控制服务启动的时候加载插件,如果值是FORCE或者FORCE_PLUS_PERMANENT,如果插件初始化失败,那么服务启动就失败。

    6.1.3 防止Mysql被攻击

    mysql在传输的时候密码不是明文传输的,但是其他信息都是明文,可能会被其他人读取,如果是和非信任网络的交互,可以使用ssl加密连接。

    有以下几点可以让mysql系统更加安全:

    1.每个mysql用户都要有密码

    2.只有mysqld的启动用户有访问数据库文件夹的权限

    3.不要用root用户启动mysql服务。这样每个连接都有服务器上的root权限,十分危险。

    4.不要授予非管理员用户FILE权限

    5.不要授予非管理员用户PROCESSSUPER权限

    6.不允许使用symlink到表。

    7.存储过程和函数要在安全指导写编写,Section 20.6, “Access Control for Stored Programs and Views”.

    8.在权限表中,如果对DNS不信任,那么就使用ip地址

    9.如果要限制一个账号的最大连接数,可以使用max_user_connections变量。

    6.1.4 安全相关的mysqld选项和变量

    Name

    Cmd-Line

    Option file

    System Var

    Status Var

    Var Scope

    Dynamic

    allow-suspicious-udfs

    Yes

    Yes

     

     

     

     

    automatic_sp_privileges

     

     

    Yes

     

    Global

    Yes

    chroot

    Yes

    Yes

     

     

     

     

    des-key-file

    Yes

    Yes

     

     

     

     

    local_infile

     

     

    Yes

     

    Global

    Yes

    old_passwords

     

     

    Yes

     

    Both

    Yes

    safe-user-create

    Yes

    Yes

     

     

     

     

    secure-auth

    Yes

    Yes

     

     

    Global

    Yes

    - Variable: secure_auth

     

     

    Yes

     

    Global

    Yes

    secure-file-priv

    Yes

    Yes

     

     

    Global

    No

    - Variable: secure_file_priv

     

     

    Yes

     

    Global

    No

    skip-grant-tables

    Yes

    Yes

     

     

     

     

    skip-name-resolve

    Yes

    Yes

     

     

    Global

    No

    - Variable: skip_name_resolve

     

     

    Yes

     

    Global

    No

    skip-networking

    Yes

    Yes

     

     

    Global

    No

    - Variable: skip_networking

     

     

    Yes

     

    Global

    No

    skip-show-database

    Yes

    Yes

     

     

    Global

    No

    - Variable: skip_show_database

     

     

    Yes

     

    Global

    No

    6.1.5 使用常规用户启动mysql

    修改mysqld启动用户步骤:

    1.关闭mysql服务

    2.修改数据库文件夹和文件总的读写权限,可以让启动用户读写数据库文件和文件夹

    shell> chown -R user_name /path/to/mysql/datadir

    3.使用—user=user_name或者在配置文件的user=user_name来指定启动账号,并启动服务。

    6.1.6 LOAD DATA LOCAL安全问题

    load data可以加载服务器上的文件,load data local可以加载client host的文件。

    load data local2个潜在安全性问题:

    1.client host文件传输到server host。那么server host要有权限,这样会造成server host可以访问任何 client user有权限可以访问的文件。

    2.web环境,用户连接到web服务,一个用户使用load data local就可以读取web服务进程可以读取的任何文件。

    为了解决这些问题,在mysql 3.29做了处理:

    1.binary版本,增加了-DENABLED_LOCAL_INFILE,默认为1,可以使用 local

    2.如果通过源代码编译没有加-DENABLED_LOCAL_INFILE=1那么就不能使用除非显示的使用了,mysql_options(... MYSQL_OPT_LOCAL_INFILE, 0).

    3.可以通过配置—local-infile=0来限制load data local语句的使用。

    4.mysql 客户端也可以设置—local-infile来禁用和启用load data local

    5.如果是perl脚本或者其他程序,可以通过配置[client]的配置文件

    6.如果load data local被禁用,使用的时候会报错:

    ERROR 1148: The used command is not allowed with this MySQL version

    6.1.7客户端程序安全性

    具体看:

    http://dev.mysql.com/doc/refman/5.6/en/secure-client-programming.html

     

    6.2 mysql访问权限系统

    mysql权限系统主要有2个功能:

    1.给验证用户权限

    2.给你匿名用户权限

    权限系统中不能做的事:

    ·         You cannot explicitly specify that a given user should be denied access. That is, you cannot explicitly match a user and then refuse the connection.

    ·         You cannot specify that a user has privileges to create or drop tables in a database but not to create or drop the database itself.

    ·         A password applies globally to an account. You cannot associate a password with a specific object such as a database, table, or routine.

    mysql的权限信息都是存放在mysql数据库中,当服务启动的时候,把数据加载到内存,然后之后处理都是在内存层面。

     

    mysql的权限系统保证了,所有用户只能操作被允许的行为。mysql是通过用户的identity来确定用户权限的identity=username@host

     

    mysql的访问控制分为2个阶段:

    1.验证用户,连接

    2.如果连接,然后通过检查用户权限来判断能否执行。

     

    如果一个用户在连接状态,并且修改了这个用户的权限,那么这个用户的修改不会再下一个语句马上体现。

    6.2.1 mysql提供的权限

    mysql提供了应用在不同上下文和级别的权限:

    1.实例级别,可以管理mysql server的管理。

    2.数据库级别权限,应用于数据库和数据库里面的对象。

    3.对象级别的权限,表,索引,视图,存储过程,函数。

    账号的权限记录在mysql中的userdbtables_priv,columns_priv,procs_priv

     

    以下表显示了,可以grantrevoke语句权限:

    Privilege

    Column

    Context

    CREATE

    Create_priv

    databases, tables, or indexes

    DROP

    Drop_priv

    databases, tables, or views

    GRANT OPTION

    Grant_priv

    databases, tables, or stored routines

    LOCK TABLES

    Lock_tables_priv

    databases

    REFERENCES

    References_priv

    databases or tables

    EVENT

    Event_priv

    databases

    ALTER

    Alter_priv

    tables

    DELETE

    Delete_priv

    tables

    INDEX

    Index_priv

    tables

    INSERT

    Insert_priv

    tables or columns

    SELECT

    Select_priv

    tables or columns

    UPDATE

    Update_priv

    tables or columns

    CREATE TEMPORARY TABLES

    Create_tmp_table_priv

    tables

    TRIGGER

    Trigger_priv

    tables

    CREATE VIEW

    Create_view_priv

    views

    SHOW VIEW

    Show_view_priv

    views

    ALTER ROUTINE

    Alter_routine_priv

    stored routines

    CREATE ROUTINE

    Create_routine_priv

    stored routines

    EXECUTE

    Execute_priv

    stored routines

    FILE

    File_priv

    file access on server host

    CREATE TABLESPACE

    Create_tablespace_priv

    server administration

    CREATE USER

    Create_user_priv

    server administration

    PROCESS

    Process_priv

    server administration

    PROXY

    see proxies_priv table

    server administration

    RELOAD

    Reload_priv

    server administration

    REPLICATION CLIENT

    Repl_client_priv

    server administration

    REPLICATION SLAVE

    Repl_slave_priv

    server administration

    SHOW DATABASES

    Show_db_priv

    server administration

    SHUTDOWN

    Shutdown_priv

    server administration

    SUPER

    Super_priv

    server administration

    ALL [PRIVILEGES]

     

    server administration

    USAGE

     

    server administration

    6.2.2 权限系统权限表

    通常操作权限表是通过,grantrevoke来间接操作的。

    mysql的表中一下表包含权限信息:

    user:包含了用户账号,全局权限和其他权限列

    db:数据库级别权限

    host:mysql5.6.7之后就不存在,mariadb10.0也不存在

    tables_priv:表级权限

    columns_priv:列级权限

    procs_priv:存储过程和函数权限

    proxies_priv:代理用户权限

     

    每个权限表包含适用范围列和权限列:

    1.适用范围列决定了权限适用范围。

    2.权限列表明了被授予的权限。

    服务会在以下方式使用权限表:

    1.user表的范围列决定了是拒绝或者允许连接。对于可连接的用户,在users表的权限都是全局权限,可以应用到所有数据库。

    2.db表范围列确定了用户可以确定了从哪来的连接可以访问哪些数据库

    3.tables_privcolumns_priv表和db表类似,但是粒度更加小,应用在表级和列级。

    4.procs_priv应用在存储过程和函数的权限

    5.proxies_priv表说明用户可以代理其他用户

    具体权限表的表接口可以看:

    http://dev.mysql.com/doc/refman/5.6/en/grant-table-structure.html

    6.2.3 指定帐号(Account)

    帐号名规则:

    1.帐号名规则是user_name@host_name

    2.若指定一个用户名,就相当于’user_name’@’%’

    3.如果不用引号合法,可以不用引号

    4.用户名可以使用单引号,双引号,或者(`

    5.引号的添加方法不是’user_name@%’,是’user_name’@’%’

    6.使用current_user或者current_user()获取当前用户名和host

     

    host是帐号的一部分可以有很多方式和通配符:

    1.host可以指定hostname或者ip地址(ipv4,ipv6)。

    2.你可以使用’%’或者’’替换host或者ip地址。

    3.也可以使用host_ip/netmask格式代替host_name

    6.2.4 访问控制,阶段1:连接验证

    当用户连接到mysql,通过了identity认证,则进入阶段2

    identity2部分组成:

    1.客户端host

    2.mysql用户名

    identity的验证需要用到user表的3个字段,hostuserpassword

    如果user列不是空的,只能准确的匹配,如果user列是空的,可以匹配任意用户。若user表中的一行匹配了一个空用户名的用户,那么这个用户就被认为是匿名用户,不是指定用户名的用户。

    password列如果为空的,并不意味着通配,而是空密码。如果plugin认证可以使用密码也可以不使用密码。如果password不是为空的,那么说明登陆的时候需要密码验证。

     

    当连接的时候有多个可以匹配,就用以下方法:

    1.不管什么时候服务读取user表到内存,会对行排序

    2.当一个客户端视图连接,服务会通过排序的顺序匹配

    3.服务会使用第一个匹配的usernamehostname

    排序,越准确的排在越前面。

    如:

    +-----------+----------+-             

    | Host       | User     | ...

    +-----------+----------+-

    | %           | root     | ...

    | %           | jeffrey  | ...

    | localhost | root     | ...

    | localhost |          | ...

    +-----------+----------+-

    排序后:

    +-----------+----------+-

    | Host      | User     | ...

    +-----------+----------+-

    | localhost | root     | ...

    | localhost |          | ...

    | %         | jeffrey  | ...

    | %         | root     | ...

    +-----------+----------+-

    如果连接了,但是不是自己要的帐号,可以使用current_user()查看匹配的用户。

    6.2.5 访问控制,阶段2:请求验证

    连接之后,服务进入第二阶段,当客户端请求,服务就会去检查是否有权限来执行这个请求。权限可以通过表,userdbtables_privcolumns_privprocs_priv检查。

     

    user表的权限是全局的适用于所有数据库。

    db表中:

    1.空的用户名表示匿名用户,非空的表示指定用户

    2.通配符和’’可以用在hostdb

    3.’%’或者空的host表示任意host

    4.’%’或者空的db表示任意数据库

    db表通过hostdbuser排序。

     

    对于tables_privcolumns_privprocs_priv

    1.host列可以有通配符

    2.%‘或者空host表示任意host

    3.dbtable_name,column_name,routine_name列不能包含通配符或者空。

    这几个表也是根据hostdbuser排序。

     

    对于数据库相关的请求,先看用户全局user表,若没有就查db表的权限。server查看db表,同难过hostdbuser列进行匹配。

     

    在确定指定数据库的权限,服务把权限添加到全局权限中,如果满足了就执行,如果不满足服务检查用户表和列的权限(tables_priv,columns_priv)把这些添加到用户权限,根据结果来确定是否执行。

     

    权限的计算类似于这样:

    global privileges

    OR (database privileges AND host privileges)

    OR table privileges

    OR column privileges

    OR routine privileges

    但是如果出现一个请求需要多个权限的情况下,就不是这样。

    6.2.6 权限修改生效时间

    mysql启动会读取grant表到内存,这个时候才生效。

    如果使用grantrevokesetpasswordrename user间接的修改权限,服务会注意到时修改权限并会马上加载到内存。

     

    若使用dml修改权限表,需要手动加载后才能生效。重新加载的方法:

    1.flush privileges语句

    2.mysqladmin flush-privilege

    3.mysqladmin reload

    权限生效之后会对每个存在的客户端影响:

    1.表或者列权限修改,会影响客户端下一个请求

    2.数据库权限修改会影响下一个use db_name语句

    3.全局权限修改会影响下一个连接

    如果在启动服务的时候使用—skip-grant-tables选线,不会读取权限表,不会对权限进行认证,可以随意访问数据。

    6.2.7 访问拒绝的例子

    具体可以看:http://dev.mysql.com/doc/refman/5.6/en/access-denied.html

    6.3 MySQL用户帐号管理

    6.3.1用户名和密码

    mysql的帐号保存在user表中,帐号由用户名和host组成。

    Ÿ   用户名,只用来做mysql验证。

    Ÿ   mysql用户名最常不能超过16个字节

    Ÿ   服务使用存储在mysql.user的密码来验证客户端使用,mysql原生认证,如果指明了验证插件,那么由插件决定是否使用密码

    Ÿ   mysql的原生验证有自己的加密算法

    Ÿ   若使用的用户密码有非ascii的字符,那么就要设置字符集,mysql客户端可以使用—default-character-set来修改字符集。

    6.3.2 增加用户帐号

    增加新的帐号由2种方式:

    1.使用create usergrant,间接操作权限表

    2.直接使用dml语句,直接操作权限表,当然需要flush privileges

    mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank';

     

    6.3.3 删除用户帐号

    使用drop user语句来删除帐号

    mysql> DROP USER 'francis'@'localhost'

    6.3.4 设置帐号的资源限制

    说是资源限制,无非就是限制每个账号的连接数。使用max_user_connections来限制。

    mysql5.6之后还可以对每个用户做某些限制,mariadb 10.0也有这个功能:

    1.限制每小时的查询量

    2.限制每小时的update

    3.限制每小时的连接次数

    4.限制一个帐号并发的连接个数

    以上4个限制,是通过grant语句限制的,使用help grant查看。

    mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank';
    mysql> GRANT ALL ON customer.* TO 'francis'@'localhost'
        ->     WITH MAX_QUERIES_PER_HOUR 20
        ->          MAX_UPDATES_PER_HOUR 10
        ->          MAX_CONNECTIONS_PER_HOUR 5
        ->          MAX_USER_CONNECTIONS 2;

     

     

    对于grant中的MAX_USER_CONNECTIONS是限制并发连接数,若为0,则由max_user_connections系统变量确定并发连接个数,如果系统变量也为0则不限制。

    如果要修改使用 grant usage来修改。如:

    mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'

        ->     WITH MAX_QUERIES_PER_HOUR 100;

    如果要删除限制就设置为0

    mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'

        ->     WITH MAX_CONNECTIONS_PER_HOUR 0;

    如果grant设置的MAX_USER_CONNECTIONS会覆盖系统变量如:

    max_user_connections=10

    GRANT ... TO 'user1'@'localhost' WITH MAX_USER_CONNECTIONS 0;
    GRANT ... TO 'user2'@'localhost' WITH MAX_USER_CONNECTIONS 5;
    GRANT ... TO 'user3'@'localhost' WITH MAX_USER_CONNECTIONS 20;

    那么user1的最大并发连接数为10user25user320

     

    user表中的,max_query,max_update,max_connections,存放了每小时的限制。max_user_connections存放了并发连接数的限制。

     

    以下2个语句会重置所有帐号的限制:

    1.使用flush user_resources语句

    2.使用grant usage设置修改限制

    6.3.5 设置密码

    密码设置可以在create user中也可以set password

    mysql> CREATE USER 'jeffrey'@'localhost'
        -> IDENTIFIED BY 'mypass';
    mysql> SET PASSWORD FOR
        -> 'jeffrey'@'localhost' = PASSWORD('mypass');

    read_only变量可以阻止没有有SPUER权限的用户使用 set password

     

    还可以使用grant usage on *.*来设置密码:

    mysql> GRANT USAGE ON *.* TO 'jeffrey'@'localhost'
        -> IDENTIFIED BY 'mypass';

    或者使用mysqladmin

    shell> mysqladmin -u user_name -h host_name password "newpwd"

     

    设置密码的时候注意点:

    1.当使用create user或者grang identified by语句的时候可以直接使用明文,服务会帮助加密

    2.当使用identified by password那么需要自己先使用password()加密

    3.当使用set password 的时候,要自己调用password()加密

     

    当然可以直接修改user表,但是需要执行flush privileges

    6.3.6 密码过期和沙盘模式

    6.3.6.1 密码过期工作原理

    密码过期是mysql 5.6新加的功能。(在mariadb中也有password_expired但是完成不了,下面说的功能)。

    alter user 来手动过期一个用户:

    ALTER USER 'myuser'@'localhost' PASSWORD EXPIRE;

    执行了之后,mysql.user.password_expired变为Y。下次连接的时候用户要不进入沙盘模式,要不就无法连接。

    如果进入了沙盘模式,用户只允许做:

    1.set password修改密码

    2.set语句

    其他的操作都会被拒绝。

     

    disconnect_on_expired_password用来判断如何处理过期帐号的连接。如果为yes,就无法连接到客户端,为no连接到客户端,并进入沙盘模式。

     

    6.3.7 插件式验证(Pluggable Authentication

    当客户端连接到mysql服务,根据指定的验证插件来验证:

    1.如果指定了验证插件,那么就用验证插件验证

    2.如果没有指定验证插件,根据passwordhash值,确定使用mysql_native_password还是使用mysql_old_password

    插件式的验证方式,带来了2个功能:

    1.可扩展验证,就是可以通过其他验证插件来验证用户登录

    2.代理用户,可以让登录用户伪装成其他用户执行请求

    6.3.7.1 验证插件的使用方法

    1.安装插件的libraryserverclient

    2.安装插件,可以以配置文件,也可以用install plugin

    [mysqld]
    plugin-load=test_plugin_server=auth_test_plugin.so
    mysql> INSTALL PLUGIN test_plugin_server SONAME 'auth_test_plugin.so';

    install plugin只要运行一次就可以,下次启动会自动加载插件。

    3.验证插件是否安装

    mysql> SHOW PLUGINS\G
    ...
    *************************** 21. row ***************************
       Name: test_plugin_server
     Status: ACTIVE
       Type: AUTHENTICATION
    Library: auth_test_plugin.so
    License: GPL

    4.设置帐号的验证插件

    CREATE USER 'testuser'@'localhost' IDENTIFIED WITH test_plugin_server;

    5.使用客户端连接

     

    当用户连接验证的时候,服务发现是使用auth_test_plugin插件验证,那么服务端和客户端交流使用 auth_test_plugin,来验证。

     

    6.3.8 MySQL中可用的验证插件

    具体看文档:http://dev.mysql.com/doc/refman/5.6/en/authentication-plugins-available.html

    6.3.9 代理用户(proxy user

    代理用户是a用户登录但是使用b用户的权限执行请求。a用户就是代理用户(proxy user)b用户就是被代理用户(proxied user)

    要使用代理用户必须满足:

    1.当连接客户端被当做是代理用户,插件必须返回一个不同的用户名(proxied user)。

    2.代理用户帐号必须有插件验证

    3.代理用户必须有代理 proxied用户的权限。

    如:

    CREATE USER 'empl_external'@'localhost'
      IDENTIFIED WITH auth_plugin AS 'auth_string';
    CREATE USER 'employee'@'localhost'
      IDENTIFIED BY 'employee_pass';
    GRANT PROXY
      ON 'employee'@'localhost'
      TO 'empl_external'@'localhost';

    当登录empl_external@localhost,使用current_user()返回:

    mysql> SELECT USER(), CURRENT_USER();
    +-------------------------+--------------------+
    | USER()                  | CURRENT_USER()     |
    +-------------------------+--------------------+
    | empl_external@localhost | employee@localhost |
    +-------------------------+--------------------+

    是否 要用identified with as由插件决定。

    6.3.9.1授予PROXY权限

    PROXY权限通过 grant proxy语句被授予

    GRANT PROXY ON 'proxied_user' TO 'proxy_user';

    revoke proxy对于

    REVOKE PROXY ON 'proxied_user' FROM 'proxy_user';

     

    6.3.9.2 默认proxy用户

    如:

    CREATE USER ''@'' IDENTIFIED WITH ldap_auth AS 'O=Oracle, OU=MySQL';
    CREATE USER 'developer'@'localhost' IDENTIFIED BY 'developer_pass';
    CREATE USER 'manager'@'localhost' IDENTIFIED BY 'manager_pass';
    GRANT PROXY ON 'manager'@'localhost' TO ''@'';
    GRANT PROXY ON 'developer'@'localhost' TO ''@'';

    用户登录:

    mysql --user=myuser --password='myuser_pass' ...

    服务找不到myuser这个用户,但是能匹配上’’@’’然后服务调用ldap_auth,使用myusermyuser_pass作为用户名密码验证。

    如果ldap_auth发现myuser_pass不是myuser的正确密码,连接失败。

    如果连接成功,发现myuser是一个developer,那么就返回developer用户名给mysql服务,然后myuser使用developer的权限:

    mysql> SELECT USER(), CURRENT_USER();
    +------------------+---------------------+
    | USER()           | CURRENT_USER()      |
    +------------------+---------------------+
    | myuser@localhost | developer@localhost |
    +------------------+---------------------+

     

    如果ldap_auth返回的是manager,则:

    mysql> SELECT USER(), CURRENT_USER();
    +------------------+-------------------+
    | USER()           | CURRENT_USER()    |
    +------------------+-------------------+
    | myuser@localhost | manager@localhost |
    +------------------+-------------------+

     

    6.3.9.3 代理用户系统变量

    主要有2个系统变量:

    1.proxy_user:如果为null,表示没有启动代理,如果是以默认代理用户验证的

    mysql> SELECT @@proxy_user;
    +--------------+
    | @@proxy_user |
    +--------------+
    | ''@''        |
    +--------------+

    2.external_user:在验证过程中被使用到,会作为插件的设置被用户验证客户端。

    6.3.10 使用SSL加密连接

    mysql的标准配置是尽量加快传输,所以连接是不加密的。

    6.3.10.1 基本SSL概念

    手册:http://dev.mysql.com/doc/refman/5.6/en/ssl-basics.html

     

    6.3.10.2 mysql配置SSL

    1.如果不是支持SSLbianry 版本,就下载安装OpenSSL

    2. 如果不是支持SSLbianry 版本,配置编译选项

    shell> cmake . -DWITH_SSL=bundled

    如果使用yassl,配置如下:

    shell> cmake . -DWITH_SSL=system

    然后编译安装

    3.检查是否支持SSL

    mysql> SHOW VARIABLES LIKE 'have_ssl';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | have_ssl      | YES   |
    +---------------+-------+

    6.3.9.10.3 使用SSL连接

    使用ssl连接需要配置一下几个选项:

    Ÿ   --ssl-ca identifies the Certificate Authority (CA) certificate.

    Ÿ   --ssl-cert identifies the server public key certificate. This can be sent to the client and authenticated against the CA certificate that it has.

    Ÿ   --ssl-key identifies the server private key.

    如:

    shell> mysqld --ssl-ca=ca-cert.pem \
             --ssl-cert=server-cert.pem \
             --ssl-key=server-key.pem

    和服务端类似,可以端的—ssl-cert—ssl-key指示了客户端的公钥和私钥

    使用ssl连接是否要指定配置,主要依赖于帐号的设置。

    如果没有给帐号设置SSL请求或者没有使用grant require SSL 语句,那么服务端必须指定—ssl-cert--ssl-key,客户端要使用—ssl-ca

    shell> mysql --ssl-ca=ca-cert.pem

     

    如果指定了require x509那么客户端必须还要指定正确的客户端的key和证书文件

    shell> mysql --ssl-ca=ca-cert.pem \
           --ssl-cert=client-cert.pem \
           --ssl-key=client-key.pem

     

    不使用ssl可以使用—ssl=0或者 –skip-ssl,--disable-ssl

    可以通过变量查看ssl_cipher

    mysql> SHOW STATUS LIKE 'Ssl_cipher';
    +---------------+--------------------+
    | Variable_name | Value              |
    +---------------+--------------------+
    | Ssl_cipher    | DHE-RSA-AES256-SHA |
    +---------------+--------------------+

    6.3.10.4 SSL相关配置

    具体看:http://dev.mysql.com/doc/refman/5.6/en/ssl-options.html

     

    Name

    Cmd-Line

    Option file

    System Var

    Status Var

    Var Scope

    Dynamic

    have_openssl

     

     

    Yes

     

    Global

    No

    have_ssl

     

     

    Yes

     

    Global

    No

    skip-ssl

    Yes

    Yes

     

     

     

     

    ssl

    Yes

    Yes

     

     

     

     

    ssl-ca

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_ca

     

     

    Yes

     

    Global

    No

    ssl-capath

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_capath

     

     

    Yes

     

    Global

    No

    ssl-cert

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_cert

     

     

    Yes

     

    Global

    No

    ssl-cipher

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_cipher

     

     

    Yes

     

    Global

    No

    ssl-crl

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_crl

     

     

    Yes

     

    Global

    No

    ssl-crlpath

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_crlpath

     

     

    Yes

     

    Global

    No

    ssl-key

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_key

     

     

    Yes

     

    Global

    No

    ssl-verify-server-cert

    Yes

    Yes

     

     

     

     

    6.3.10.5 mysql生成证书和公钥私钥

    具体看:http://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html

    6.3.11  windows使用ssh链接到mysql

    具体看:http://dev.mysql.com/doc/refman/5.6/en/windows-and-ssh.html

    6.3.12 Mysql企业版审计日志插件

    审计日志插件名叫audit_log,当安装了插件后,MySQL服务会产生日志文件包括服务的活动审计记录。

    安装了插件之后会写入到审计日志,日志路径由变量audit_log_file控制,默认为audit.log

    审计日志的格式为XML格式,在服务启动的时候,可以通过audit_log_format控制系统变量,设置日志格式。

    audit_log_policy控制审计的事件,默认为all,可以设置为LOGINSQUERIESNONE

     

    把日志记录格式从老的改成新的需要以下步骤:

    1.停止服务

    2.重命名审计日志文件

    3.使用新的audit_log_format重启服务

     

    注:

    mariadb使用的审计插件和mysql 5.6不同,mariadb使用server audit

    具体看:

    https://mariadb.com/kb/en/mariadb/documentation/mariadb-plugins/server_audit-mariadb-audit-plugin/about-the-mariadb-audit-plugin/

     

    6.3.12.1 安装审计插件

    使用配置文件,或者命令行参数plugin-load设置:

    [mysqld]
    plugin-load=audit_log.so

    或者使用install plugin加载

    mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';

    使用了install plugin之后,下次启动会自动加载

    使用audit-log配置文件,来强制插件初始化,否则服务启动报错。

    6.3.12.2 审计日志安全性考虑

    审计日志不加密,为了考虑到敏感信息安全性问题,考虑放在只能管理员和mysql启动用户访问。

    6.3.12.3 审计日志

    主要介绍老的格式和新的格式的字段意义

    具体看:http://dev.mysql.com/doc/refman/5.6/en/audit-log-file.html

    6.3.12.4 审计日志记录控制

    当审计日志插件打开日志文件的时候,查看是否包含<AUDIT>根标签,若有则写入内容,当写入完成,写入</AUDIT>结束。

    如果启动时已经存在日志文件,检查是否存在</AUDIT>,如果有则先截断,然后写入审计记录。如果没有</AUDIT>或者不能截断,就认为插件初始化失败。常发生于服务crash或者被kill但是审计插件任然在运行的情况。

    [ERROR] Plugin 'audit_log' init function returned error.

    解决办法,直接删除审计日志然后重启。

     

    服务当审计事件发生就写入审计日志。

    审计日志插件提供了一些系统变量:

    1.audit_log_file:审计日志文件路径

    2.audit_log_policy:用来决定审计事件,可选值:NONE,LOGINS,QUERIES.

    3.audit_log_strategy:用来控制写入审计日志的方式,可取值如下:

    Value

    Meaning

    ASYNCHRONOUS

    Log asynchronously, wait for space in output buffer

    PERFORMANCE

    Log asynchronously, drop request if insufficient space in output buffer

    SEMISYNCHRONOUS

    Log synchronously, permit caching by operating system

    SYNCHRONOUS

    Log synchronously, call sync() after each request

    4.audit_log_buffer_size:用来给异步审计日志写入做缓存

    5.audit_log_rotate_on_sizeaudit_log_flush:这2个主要控制审计日志的回绕和刷新,审计日志会随着时间推移变得越来越大,为了加强磁盘空间管理,可以自动回绕,会在手动刷新并打开一个新的日志文件。

     

    默认audit_log_rotate_on_size=0是不会回绕的,只有修改audit_log_flush才会执行刷新审计日志并重新打开。假设需要维护3个最近的审计日志如下:

    1.重命名文件

    shell> mv audit.log.2 audit.log.3

    shell> mv audit.log.1 audit.log.2

    shell> mv audit.log audit.log.1

    这个时候,插件任然往当前的审计日志写,已经被重命名为了audit.log.1

    2.连接到服务刷新日志文件,插件会关闭当前日志,并打开一个新的日志

    mysql> SET GLOBAL audit_log_flush = ON;

     

     

    audit_log_rotate_on_size大于0audit_log_flush=1是没有意义的,写入后文件的大小大于audit_log_rotate_on_size,服务会重命名审计日志,打开一个新的审计日志。

    6.3.12.5 审计日志插件选项和变量

    具体看:

    http://dev.mysql.com/doc/refman/5.6/en/audit-log-plugin-options-variables.html

    6.3.13 SQL-Based MySQL账号活动审计

    具体看:http://dev.mysql.com/doc/refman/5.6/en/account-activity-auditing.html

     

    posted on 2014-08-06 20:37 Fanr_Zh 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/Amaranthus/p/3895721.html

    展开全文
  • Ÿ常规因素影响安全性 Ÿ程序自身安全性 Ÿ数据库内部的安全性,即,访问控制 Ÿ网络安全性和系统安全性 Ÿ数据文件的备份,日志文件和配置文件的安全性 6.安全性 6.1常规安全性问题 6.1.1安全性最佳实践 6.1.2保持...

    6. 安全性

    Mysql安装配置时要考虑安全性的影响,以下几点:

    Ÿ   常规因素影响安全性

    Ÿ   程序自身安全性

    Ÿ   数据库内部的安全性,即,访问控制

    Ÿ   网络安全性和系统安全性

    Ÿ   数据文件的备份,日志文件和配置文件的安全性

    6. 安全性

    6.1 常规安全性问题

    6.1.1安全性最佳实践

    6.1.2 保持密码安全性

    6.1.2.1终端用户密码安全性最佳实践

    6.1.2.2 密码管理方法

    6.1.2.3 密码和日志

    6.1.2.4 Mysql中的密码hash

    6.1.2.5 mysql 4.1的应用程序的密码hash修改实现

    6.1.2.6 密码验证插件

    6.1.3 防止Mysql被攻击

    6.1.4 安全相关的mysqld选项和变量

    6.1.5 使用常规用户启动mysql

    6.1.6 LOAD DATA LOCAL安全问题

    6.1.7客户端程序安全性

    6.2 mysql访问权限系统

    6.2.1 mysql提供的权限

    6.2.2 权限系统权限表

    6.2.3 指定帐号(Account)

    6.2.4 访问控制,阶段1:连接验证

    6.2.5 访问控制,阶段2:请求验证

    6.2.6 权限修改生效时间

    6.2.7 访问拒绝的例子

    6.3 MySQL用户帐号管理

    6.3.1用户名和密码

    6.3.2 增加用户帐号

    6.3.3 删除用户帐号

    6.3.4 设置帐号的资源限制

    6.3.5 设置密码

    6.3.6 密码过期和沙盘模式

    6.3.6.1 密码过期工作原理

    6.3.7 插件式验证(Pluggable Authentication

    6.3.7.1 验证插件的使用方法

    6.3.8 MySQL中可用的验证插件

    6.3.9 代理用户(proxy user

    6.3.9.1授予PROXY权限

    6.3.9.2 默认proxy用户

    6.3.9.3 代理用户系统变量

    6.3.10 使用SSL加密连接

    6.3.10.1 基本SSL概念

    6.3.10.2 为mysql配置SSL

    6.3.9.10.3 使用SSL连接

    6.3.10.4 SSL相关配置

    6.3.10.5 为mysql生成证书和公钥私钥

    6.3.11  从windows使用ssh链接到mysql

    6.3.12 Mysql企业版审计日志插件

    6.3.12.1 安装审计插件

    6.3.12.2 审计日志安全性考虑

    6.3.12.3 审计日志

    6.3.12.4 审计日志记录控制

    6.3.12.5 审计日志插件选项和变量

    6.3.13 SQL-Based MySQL账号活动审计

     

    6.1 常规安全性问题

    6.1.1安全性最佳实践

    当运行mysql,有一下一些最佳实践:

    1.静止用户访问mysql数据库上面的表

    2.学习权限是如何工作的。不要授予过多的权限

           checklist:测试mysql –uroot 连接,使用show grant查看被赋予了什么权限

    3.不要在数据库中存明文密码

    4.不要从字典里面选密码

    5.安装防火墙

    6.不能信任任何应用写入的数据,应该通过防御编程技术写入(defensive programming techniques)

    7.学会使用tcpdumpstrings工具截取tcp中的数据

    6.1.2 保持密码安全性

    6.1.2.1终端用户密码安全性最佳实践

    1.使用mysql_config_editor工具,把认证数据写入到加密的.mylogin.cnf文件。

    2.使用-ppassword或者—password=password会暴露密码明文

    3.使用 -p--password不指定密码,交互方式数据密码,避免密码明文暴露

    4.如果密码明文方式在配置文件中,记得修改linux权限不让其他人访问。

    5.把密码存放在环境变量 MYSQL_PWD,不推荐的访问,会验证影响安全。

    linux中,mysql客户端会记录命令在.mysql_history,create usergrantset password的时候会写入到文件,为了安全性最好限制访问模式。

    6.1.2.2 密码管理方法

    1.不能让非管理员用户访问mysql.user表。

    2.使用密码过期强制用户重设密码

    3.使用validate_password插件强化密码策略

    6.1.2.3 密码和日志

    使用语句 create usergrantset password或者调用了password函数,密码都是明文的,如果被记录,那么可能会被其他任何能够访问日志文件的人看到。

    mysql 5.6.3之后就不会以下语句,日志文件上出现明文(mariadb 10.0也不会显示明文):

    CREATE USER ... IDENTIFIED BY ...

    GRANT ... IDENTIFIED BY ...

    SET PASSWORD ...

    SLAVE START ... PASSWORD = ...              (as of 5.6.4)

    CREATE SERVER ... OPTIONS(... PASSWORD ...) (as of 5.6.9)

    ALTER SERVER ... OPTIONS(... PASSWORD ...)  (as of 5.6.9)

     

    语句中的密码不会出现在,general query logslow query logbinary loggeneral query logpassword 重写可以使用—log-raw选项来限制。(使用mariadb 10.0测试无效)

    审计日志的文本是不加密的,所以不能让其他用户访问。

    为了尽量避免日志内容保留,应该不能让系统和数据库管理员之外的用户访问日志文件。

    复制slavemaster info repository中保存了复制master的密码,会存在一个文件或者一个表中。要保证repository只能被数据库管理员读取。

    6.1.2.4 Mysql中的密码hash

    mysql的用户存放在mysql.user下,每个账号都有一个密码,密码是以hash值存放的。

    mysql,在clientserver交互的2个阶段用到密码:

    1.client连接会把密码的hash,然后和user表的密码进行匹配

    2.在登陆之后,可以修改密码。

     

    原先的hash方法(4.1版本之前)会产生16字节的字符串。4.1版本之后的hash方法产生41字节的字符串并且密码以*号开头。

    使用old_password()就是使用老的hash方法。当old_password变量为1是,password函数产生的结果16字节长度。

    6.1.2.5 mysql 4.1的应用程序的密码hash修改实现

    6.1.2.6 密码验证插件

    validate_password5.6.6之后),用来测试密码的安全性。这个插件有2个功能:

    1.检查密码明文的密码策略

    2.通过长度看密码强壮性。

    如果使用密码明文,那么就会对密码进行验证,如果直接用hash值,那么就不验证。

     

    密码验证插件安装方法:

    1.使用配置文件

    [mysqld]

    plugin-load=validate_password.so

    2.使用instal plugin命令,使用后会在mysql.plugins表中加入记录,下次启动会自动加载。

    mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';

    validate-password可以用来控制服务启动的时候加载插件,如果值是FORCE或者FORCE_PLUS_PERMANENT,如果插件初始化失败,那么服务启动就失败。

    6.1.3 防止Mysql被攻击

    mysql在传输的时候密码不是明文传输的,但是其他信息都是明文,可能会被其他人读取,如果是和非信任网络的交互,可以使用ssl加密连接。

    有以下几点可以让mysql系统更加安全:

    1.每个mysql用户都要有密码

    2.只有mysqld的启动用户有访问数据库文件夹的权限

    3.不要用root用户启动mysql服务。这样每个连接都有服务器上的root权限,十分危险。

    4.不要授予非管理员用户FILE权限

    5.不要授予非管理员用户PROCESSSUPER权限

    6.不允许使用symlink到表。

    7.存储过程和函数要在安全指导写编写,Section 20.6, “Access Control for Stored Programs and Views”.

    8.在权限表中,如果对DNS不信任,那么就使用ip地址

    9.如果要限制一个账号的最大连接数,可以使用max_user_connections变量。

    6.1.4 安全相关的mysqld选项和变量

    Name

    Cmd-Line

    Option file

    System Var

    Status Var

    Var Scope

    Dynamic

    allow-suspicious-udfs

    Yes

    Yes

     

     

     

     

    automatic_sp_privileges

     

     

    Yes

     

    Global

    Yes

    chroot

    Yes

    Yes

     

     

     

     

    des-key-file

    Yes

    Yes

     

     

     

     

    local_infile

     

     

    Yes

     

    Global

    Yes

    old_passwords

     

     

    Yes

     

    Both

    Yes

    safe-user-create

    Yes

    Yes

     

     

     

     

    secure-auth

    Yes

    Yes

     

     

    Global

    Yes

    - Variable: secure_auth

     

     

    Yes

     

    Global

    Yes

    secure-file-priv

    Yes

    Yes

     

     

    Global

    No

    - Variable: secure_file_priv

     

     

    Yes

     

    Global

    No

    skip-grant-tables

    Yes

    Yes

     

     

     

     

    skip-name-resolve

    Yes

    Yes

     

     

    Global

    No

    - Variable: skip_name_resolve

     

     

    Yes

     

    Global

    No

    skip-networking

    Yes

    Yes

     

     

    Global

    No

    - Variable: skip_networking

     

     

    Yes

     

    Global

    No

    skip-show-database

    Yes

    Yes

     

     

    Global

    No

    - Variable: skip_show_database

     

     

    Yes

     

    Global

    No

    6.1.5 使用常规用户启动mysql

    修改mysqld启动用户步骤:

    1.关闭mysql服务

    2.修改数据库文件夹和文件总的读写权限,可以让启动用户读写数据库文件和文件夹

    shell> chown -R user_name /path/to/mysql/datadir

    3.使用—user=user_name或者在配置文件的user=user_name来指定启动账号,并启动服务。

    6.1.6 LOAD DATA LOCAL安全问题

    load data可以加载服务器上的文件,load data local可以加载client host的文件。

    load data local2个潜在安全性问题:

    1.client host文件传输到server host。那么server host要有权限,这样会造成server host可以访问任何 client user有权限可以访问的文件。

    2.web环境,用户连接到web服务,一个用户使用load data local就可以读取web服务进程可以读取的任何文件。

    为了解决这些问题,在mysql 3.29做了处理:

    1.binary版本,增加了-DENABLED_LOCAL_INFILE,默认为1,可以使用 local

    2.如果通过源代码编译没有加-DENABLED_LOCAL_INFILE=1那么就不能使用除非显示的使用了,mysql_options(... MYSQL_OPT_LOCAL_INFILE, 0).

    3.可以通过配置—local-infile=0来限制load data local语句的使用。

    4.mysql 客户端也可以设置—local-infile来禁用和启用load data local

    5.如果是perl脚本或者其他程序,可以通过配置[client]的配置文件

    6.如果load data local被禁用,使用的时候会报错:

    ERROR 1148: The used command is not allowed with this MySQL version

    6.1.7客户端程序安全性

    具体看:

    http://dev.mysql.com/doc/refman/5.6/en/secure-client-programming.html

     

    6.2 mysql访问权限系统

    mysql权限系统主要有2个功能:

    1.给验证用户权限

    2.给你匿名用户权限

    权限系统中不能做的事:

    ·         You cannot explicitly specify that a given user should be denied access. That is, you cannot explicitly match a user and then refuse the connection.

    ·         You cannot specify that a user has privileges to create or drop tables in a database but not to create or drop the database itself.

    ·         A password applies globally to an account. You cannot associate a password with a specific object such as a database, table, or routine.

    mysql的权限信息都是存放在mysql数据库中,当服务启动的时候,把数据加载到内存,然后之后处理都是在内存层面。

     

    mysql的权限系统保证了,所有用户只能操作被允许的行为。mysql是通过用户的identity来确定用户权限的identity=username@host

     

    mysql的访问控制分为2个阶段:

    1.验证用户,连接

    2.如果连接,然后通过检查用户权限来判断能否执行。

     

    如果一个用户在连接状态,并且修改了这个用户的权限,那么这个用户的修改不会再下一个语句马上体现。

    6.2.1 mysql提供的权限

    mysql提供了应用在不同上下文和级别的权限:

    1.实例级别,可以管理mysql server的管理。

    2.数据库级别权限,应用于数据库和数据库里面的对象。

    3.对象级别的权限,表,索引,视图,存储过程,函数。

    账号的权限记录在mysql中的userdbtables_priv,columns_priv,procs_priv

     

    以下表显示了,可以grantrevoke语句权限:

    Privilege

    Column

    Context

    CREATE

    Create_priv

    databases, tables, or indexes

    DROP

    Drop_priv

    databases, tables, or views

    GRANT OPTION

    Grant_priv

    databases, tables, or stored routines

    LOCK TABLES

    Lock_tables_priv

    databases

    REFERENCES

    References_priv

    databases or tables

    EVENT

    Event_priv

    databases

    ALTER

    Alter_priv

    tables

    DELETE

    Delete_priv

    tables

    INDEX

    Index_priv

    tables

    INSERT

    Insert_priv

    tables or columns

    SELECT

    Select_priv

    tables or columns

    UPDATE

    Update_priv

    tables or columns

    CREATE TEMPORARY TABLES

    Create_tmp_table_priv

    tables

    TRIGGER

    Trigger_priv

    tables

    CREATE VIEW

    Create_view_priv

    views

    SHOW VIEW

    Show_view_priv

    views

    ALTER ROUTINE

    Alter_routine_priv

    stored routines

    CREATE ROUTINE

    Create_routine_priv

    stored routines

    EXECUTE

    Execute_priv

    stored routines

    FILE

    File_priv

    file access on server host

    CREATE TABLESPACE

    Create_tablespace_priv

    server administration

    CREATE USER

    Create_user_priv

    server administration

    PROCESS

    Process_priv

    server administration

    PROXY

    see proxies_priv table

    server administration

    RELOAD

    Reload_priv

    server administration

    REPLICATION CLIENT

    Repl_client_priv

    server administration

    REPLICATION SLAVE

    Repl_slave_priv

    server administration

    SHOW DATABASES

    Show_db_priv

    server administration

    SHUTDOWN

    Shutdown_priv

    server administration

    SUPER

    Super_priv

    server administration

    ALL [PRIVILEGES]

     

    server administration

    USAGE

     

    server administration

    6.2.2 权限系统权限表

    通常操作权限表是通过,grantrevoke来间接操作的。

    mysql的表中一下表包含权限信息:

    user:包含了用户账号,全局权限和其他权限列

    db:数据库级别权限

    host:mysql5.6.7之后就不存在,mariadb10.0也不存在

    tables_priv:表级权限

    columns_priv:列级权限

    procs_priv:存储过程和函数权限

    proxies_priv:代理用户权限

     

    每个权限表包含适用范围列和权限列:

    1.适用范围列决定了权限适用范围。

    2.权限列表明了被授予的权限。

    服务会在以下方式使用权限表:

    1.user表的范围列决定了是拒绝或者允许连接。对于可连接的用户,在users表的权限都是全局权限,可以应用到所有数据库。

    2.db表范围列确定了用户可以确定了从哪来的连接可以访问哪些数据库

    3.tables_privcolumns_priv表和db表类似,但是粒度更加小,应用在表级和列级。

    4.procs_priv应用在存储过程和函数的权限

    5.proxies_priv表说明用户可以代理其他用户

    具体权限表的表接口可以看:

    http://dev.mysql.com/doc/refman/5.6/en/grant-table-structure.html

    6.2.3 指定帐号(Account)

    帐号名规则:

    1.帐号名规则是user_name@host_name

    2.若指定一个用户名,就相当于’user_name’@’%’

    3.如果不用引号合法,可以不用引号

    4.用户名可以使用单引号,双引号,或者(`

    5.引号的添加方法不是’user_name@%’,是’user_name’@’%’

    6.使用current_user或者current_user()获取当前用户名和host

     

    host是帐号的一部分可以有很多方式和通配符:

    1.host可以指定hostname或者ip地址(ipv4,ipv6)。

    2.你可以使用’%’或者’’替换host或者ip地址。

    3.也可以使用host_ip/netmask格式代替host_name

    6.2.4 访问控制,阶段1:连接验证

    当用户连接到mysql,通过了identity认证,则进入阶段2

    identity2部分组成:

    1.客户端host

    2.mysql用户名

    identity的验证需要用到user表的3个字段,hostuserpassword

    如果user列不是空的,只能准确的匹配,如果user列是空的,可以匹配任意用户。若user表中的一行匹配了一个空用户名的用户,那么这个用户就被认为是匿名用户,不是指定用户名的用户。

    password列如果为空的,并不意味着通配,而是空密码。如果plugin认证可以使用密码也可以不使用密码。如果password不是为空的,那么说明登陆的时候需要密码验证。

     

    当连接的时候有多个可以匹配,就用以下方法:

    1.不管什么时候服务读取user表到内存,会对行排序

    2.当一个客户端视图连接,服务会通过排序的顺序匹配

    3.服务会使用第一个匹配的usernamehostname

    排序,越准确的排在越前面。

    如:

    +-----------+----------+-             

    | Host       | User     | ...

    +-----------+----------+-

    | %           | root     | ...

    | %           | jeffrey  | ...

    | localhost | root     | ...

    | localhost |          | ...

    +-----------+----------+-

    排序后:

    +-----------+----------+-

    | Host      | User     | ...

    +-----------+----------+-

    | localhost | root     | ...

    | localhost |          | ...

    | %         | jeffrey  | ...

    | %         | root     | ...

    +-----------+----------+-

    如果连接了,但是不是自己要的帐号,可以使用current_user()查看匹配的用户。

    6.2.5 访问控制,阶段2:请求验证

    连接之后,服务进入第二阶段,当客户端请求,服务就会去检查是否有权限来执行这个请求。权限可以通过表,userdbtables_privcolumns_privprocs_priv检查。

     

    user表的权限是全局的适用于所有数据库。

    db表中:

    1.空的用户名表示匿名用户,非空的表示指定用户

    2.通配符和’’可以用在hostdb

    3.’%’或者空的host表示任意host

    4.’%’或者空的db表示任意数据库

    db表通过hostdbuser排序。

     

    对于tables_privcolumns_privprocs_priv

    1.host列可以有通配符

    2.%‘或者空host表示任意host

    3.dbtable_name,column_name,routine_name列不能包含通配符或者空。

    这几个表也是根据hostdbuser排序。

     

    对于数据库相关的请求,先看用户全局user表,若没有就查db表的权限。server查看db表,同难过hostdbuser列进行匹配。

     

    在确定指定数据库的权限,服务把权限添加到全局权限中,如果满足了就执行,如果不满足服务检查用户表和列的权限(tables_priv,columns_priv)把这些添加到用户权限,根据结果来确定是否执行。

     

    权限的计算类似于这样:

    global privileges

    OR (database privileges AND host privileges)

    OR table privileges

    OR column privileges

    OR routine privileges

    但是如果出现一个请求需要多个权限的情况下,就不是这样。

    6.2.6 权限修改生效时间

    mysql启动会读取grant表到内存,这个时候才生效。

    如果使用grantrevokesetpasswordrename user间接的修改权限,服务会注意到时修改权限并会马上加载到内存。

     

    若使用dml修改权限表,需要手动加载后才能生效。重新加载的方法:

    1.flush privileges语句

    2.mysqladmin flush-privilege

    3.mysqladmin reload

    权限生效之后会对每个存在的客户端影响:

    1.表或者列权限修改,会影响客户端下一个请求

    2.数据库权限修改会影响下一个use db_name语句

    3.全局权限修改会影响下一个连接

    如果在启动服务的时候使用—skip-grant-tables选线,不会读取权限表,不会对权限进行认证,可以随意访问数据。

    6.2.7 访问拒绝的例子

    具体可以看:http://dev.mysql.com/doc/refman/5.6/en/access-denied.html

    6.3 MySQL用户帐号管理

    6.3.1用户名和密码

    mysql的帐号保存在user表中,帐号由用户名和host组成。

    Ÿ   用户名,只用来做mysql验证。

    Ÿ   mysql用户名最常不能超过16个字节

    Ÿ   服务使用存储在mysql.user的密码来验证客户端使用,mysql原生认证,如果指明了验证插件,那么由插件决定是否使用密码

    Ÿ   mysql的原生验证有自己的加密算法

    Ÿ   若使用的用户密码有非ascii的字符,那么就要设置字符集,mysql客户端可以使用—default-character-set来修改字符集。

    6.3.2 增加用户帐号

    增加新的帐号由2种方式:

    1.使用create usergrant,间接操作权限表

    2.直接使用dml语句,直接操作权限表,当然需要flush privileges

    mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank';

     

    6.3.3 删除用户帐号

    使用drop user语句来删除帐号

    mysql> DROP USER 'francis'@'localhost'

    6.3.4 设置帐号的资源限制

    说是资源限制,无非就是限制每个账号的连接数。使用max_user_connections来限制。

    mysql5.6之后还可以对每个用户做某些限制,mariadb 10.0也有这个功能:

    1.限制每小时的查询量

    2.限制每小时的update

    3.限制每小时的连接次数

    4.限制一个帐号并发的连接个数

    以上4个限制,是通过grant语句限制的,使用help grant查看。

    mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank';
    mysql> GRANT ALL ON customer.* TO 'francis'@'localhost'
        ->     WITH MAX_QUERIES_PER_HOUR 20
        ->          MAX_UPDATES_PER_HOUR 10
        ->          MAX_CONNECTIONS_PER_HOUR 5
        ->          MAX_USER_CONNECTIONS 2;

     

     

    对于grant中的MAX_USER_CONNECTIONS是限制并发连接数,若为0,则由max_user_connections系统变量确定并发连接个数,如果系统变量也为0则不限制。

    如果要修改使用 grant usage来修改。如:

    mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'

        ->     WITH MAX_QUERIES_PER_HOUR 100;

    如果要删除限制就设置为0

    mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'

        ->     WITH MAX_CONNECTIONS_PER_HOUR 0;

    如果grant设置的MAX_USER_CONNECTIONS会覆盖系统变量如:

    max_user_connections=10

    GRANT ... TO 'user1'@'localhost' WITH MAX_USER_CONNECTIONS 0;
    GRANT ... TO 'user2'@'localhost' WITH MAX_USER_CONNECTIONS 5;
    GRANT ... TO 'user3'@'localhost' WITH MAX_USER_CONNECTIONS 20;

    那么user1的最大并发连接数为10user25user320

     

    user表中的,max_query,max_update,max_connections,存放了每小时的限制。max_user_connections存放了并发连接数的限制。

     

    以下2个语句会重置所有帐号的限制:

    1.使用flush user_resources语句

    2.使用grant usage设置修改限制

    6.3.5 设置密码

    密码设置可以在create user中也可以set password

    mysql> CREATE USER 'jeffrey'@'localhost'
        -> IDENTIFIED BY 'mypass';
    mysql> SET PASSWORD FOR
        -> 'jeffrey'@'localhost' = PASSWORD('mypass');

    read_only变量可以阻止没有有SPUER权限的用户使用 set password

     

    还可以使用grant usage on *.*来设置密码:

    mysql> GRANT USAGE ON *.* TO 'jeffrey'@'localhost'
        -> IDENTIFIED BY 'mypass';

    或者使用mysqladmin

    shell> mysqladmin -u user_name -h host_name password "newpwd"

     

    设置密码的时候注意点:

    1.当使用create user或者grang identified by语句的时候可以直接使用明文,服务会帮助加密

    2.当使用identified by password那么需要自己先使用password()加密

    3.当使用set password 的时候,要自己调用password()加密

     

    当然可以直接修改user表,但是需要执行flush privileges

    6.3.6 密码过期和沙盘模式

    6.3.6.1 密码过期工作原理

    密码过期是mysql 5.6新加的功能。(在mariadb中也有password_expired但是完成不了,下面说的功能)。

    alter user 来手动过期一个用户:

    ALTER USER 'myuser'@'localhost' PASSWORD EXPIRE;

    执行了之后,mysql.user.password_expired变为Y。下次连接的时候用户要不进入沙盘模式,要不就无法连接。

    如果进入了沙盘模式,用户只允许做:

    1.set password修改密码

    2.set语句

    其他的操作都会被拒绝。

     

    disconnect_on_expired_password用来判断如何处理过期帐号的连接。如果为yes,就无法连接到客户端,为no连接到客户端,并进入沙盘模式。

     

    6.3.7 插件式验证(Pluggable Authentication

    当客户端连接到mysql服务,根据指定的验证插件来验证:

    1.如果指定了验证插件,那么就用验证插件验证

    2.如果没有指定验证插件,根据passwordhash值,确定使用mysql_native_password还是使用mysql_old_password

    插件式的验证方式,带来了2个功能:

    1.可扩展验证,就是可以通过其他验证插件来验证用户登录

    2.代理用户,可以让登录用户伪装成其他用户执行请求

    6.3.7.1 验证插件的使用方法

    1.安装插件的libraryserverclient

    2.安装插件,可以以配置文件,也可以用install plugin

    [mysqld]
    plugin-load=test_plugin_server=auth_test_plugin.so
    mysql> INSTALL PLUGIN test_plugin_server SONAME 'auth_test_plugin.so';

    install plugin只要运行一次就可以,下次启动会自动加载插件。

    3.验证插件是否安装

    mysql> SHOW PLUGINS\G
    ...
    *************************** 21. row ***************************
       Name: test_plugin_server
     Status: ACTIVE
       Type: AUTHENTICATION
    Library: auth_test_plugin.so
    License: GPL

    4.设置帐号的验证插件

    CREATE USER 'testuser'@'localhost' IDENTIFIED WITH test_plugin_server;

    5.使用客户端连接

     

    当用户连接验证的时候,服务发现是使用auth_test_plugin插件验证,那么服务端和客户端交流使用 auth_test_plugin,来验证。

     

    6.3.8 MySQL中可用的验证插件

    具体看文档:http://dev.mysql.com/doc/refman/5.6/en/authentication-plugins-available.html

    6.3.9 代理用户(proxy user

    代理用户是a用户登录但是使用b用户的权限执行请求。a用户就是代理用户(proxy user)b用户就是被代理用户(proxied user)

    要使用代理用户必须满足:

    1.当连接客户端被当做是代理用户,插件必须返回一个不同的用户名(proxied user)。

    2.代理用户帐号必须有插件验证

    3.代理用户必须有代理 proxied用户的权限。

    如:

    CREATE USER 'empl_external'@'localhost'
      IDENTIFIED WITH auth_plugin AS 'auth_string';
    CREATE USER 'employee'@'localhost'
      IDENTIFIED BY 'employee_pass';
    GRANT PROXY
      ON 'employee'@'localhost'
      TO 'empl_external'@'localhost';

    当登录empl_external@localhost,使用current_user()返回:

    mysql> SELECT USER(), CURRENT_USER();
    +-------------------------+--------------------+
    | USER()                  | CURRENT_USER()     |
    +-------------------------+--------------------+
    | empl_external@localhost | employee@localhost |
    +-------------------------+--------------------+

    是否 要用identified with as由插件决定。

    6.3.9.1授予PROXY权限

    PROXY权限通过 grant proxy语句被授予

    GRANT PROXY ON 'proxied_user' TO 'proxy_user';

    revoke proxy对于

    REVOKE PROXY ON 'proxied_user' FROM 'proxy_user';

     

    6.3.9.2 默认proxy用户

    如:

    CREATE USER ''@'' IDENTIFIED WITH ldap_auth AS 'O=Oracle, OU=MySQL';
    CREATE USER 'developer'@'localhost' IDENTIFIED BY 'developer_pass';
    CREATE USER 'manager'@'localhost' IDENTIFIED BY 'manager_pass';
    GRANT PROXY ON 'manager'@'localhost' TO ''@'';
    GRANT PROXY ON 'developer'@'localhost' TO ''@'';

    用户登录:

    mysql --user=myuser --password='myuser_pass' ...

    服务找不到myuser这个用户,但是能匹配上’’@’’然后服务调用ldap_auth,使用myusermyuser_pass作为用户名密码验证。

    如果ldap_auth发现myuser_pass不是myuser的正确密码,连接失败。

    如果连接成功,发现myuser是一个developer,那么就返回developer用户名给mysql服务,然后myuser使用developer的权限:

    mysql> SELECT USER(), CURRENT_USER();
    +------------------+---------------------+
    | USER()           | CURRENT_USER()      |
    +------------------+---------------------+
    | myuser@localhost | developer@localhost |
    +------------------+---------------------+

     

    如果ldap_auth返回的是manager,则:

    mysql> SELECT USER(), CURRENT_USER();
    +------------------+-------------------+
    | USER()           | CURRENT_USER()    |
    +------------------+-------------------+
    | myuser@localhost | manager@localhost |
    +------------------+-------------------+

     

    6.3.9.3 代理用户系统变量

    主要有2个系统变量:

    1.proxy_user:如果为null,表示没有启动代理,如果是以默认代理用户验证的

    mysql> SELECT @@proxy_user;
    +--------------+
    | @@proxy_user |
    +--------------+
    | ''@''        |
    +--------------+

    2.external_user:在验证过程中被使用到,会作为插件的设置被用户验证客户端。

    6.3.10 使用SSL加密连接

    mysql的标准配置是尽量加快传输,所以连接是不加密的。

    6.3.10.1 基本SSL概念

    手册:http://dev.mysql.com/doc/refman/5.6/en/ssl-basics.html

     

    6.3.10.2 mysql配置SSL

    1.如果不是支持SSLbianry 版本,就下载安装OpenSSL

    2. 如果不是支持SSLbianry 版本,配置编译选项

    shell> cmake . -DWITH_SSL=bundled

    如果使用yassl,配置如下:

    shell> cmake . -DWITH_SSL=system

    然后编译安装

    3.检查是否支持SSL

    mysql> SHOW VARIABLES LIKE 'have_ssl';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | have_ssl      | YES   |
    +---------------+-------+

    6.3.9.10.3 使用SSL连接

    使用ssl连接需要配置一下几个选项:

    Ÿ   --ssl-ca identifies the Certificate Authority (CA) certificate.

    Ÿ   --ssl-cert identifies the server public key certificate. This can be sent to the client and authenticated against the CA certificate that it has.

    Ÿ   --ssl-key identifies the server private key.

    如:

    shell> mysqld --ssl-ca=ca-cert.pem \
             --ssl-cert=server-cert.pem \
             --ssl-key=server-key.pem

    和服务端类似,可以端的—ssl-cert—ssl-key指示了客户端的公钥和私钥

    使用ssl连接是否要指定配置,主要依赖于帐号的设置。

    如果没有给帐号设置SSL请求或者没有使用grant require SSL 语句,那么服务端必须指定—ssl-cert--ssl-key,客户端要使用—ssl-ca

    shell> mysql --ssl-ca=ca-cert.pem

     

    如果指定了require x509那么客户端必须还要指定正确的客户端的key和证书文件

    shell> mysql --ssl-ca=ca-cert.pem \
           --ssl-cert=client-cert.pem \
           --ssl-key=client-key.pem

     

    不使用ssl可以使用—ssl=0或者 –skip-ssl,--disable-ssl

    可以通过变量查看ssl_cipher

    mysql> SHOW STATUS LIKE 'Ssl_cipher';
    +---------------+--------------------+
    | Variable_name | Value              |
    +---------------+--------------------+
    | Ssl_cipher    | DHE-RSA-AES256-SHA |
    +---------------+--------------------+

    6.3.10.4 SSL相关配置

    具体看:http://dev.mysql.com/doc/refman/5.6/en/ssl-options.html

     

    Name

    Cmd-Line

    Option file

    System Var

    Status Var

    Var Scope

    Dynamic

    have_openssl

     

     

    Yes

     

    Global

    No

    have_ssl

     

     

    Yes

     

    Global

    No

    skip-ssl

    Yes

    Yes

     

     

     

     

    ssl

    Yes

    Yes

     

     

     

     

    ssl-ca

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_ca

     

     

    Yes

     

    Global

    No

    ssl-capath

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_capath

     

     

    Yes

     

    Global

    No

    ssl-cert

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_cert

     

     

    Yes

     

    Global

    No

    ssl-cipher

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_cipher

     

     

    Yes

     

    Global

    No

    ssl-crl

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_crl

     

     

    Yes

     

    Global

    No

    ssl-crlpath

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_crlpath

     

     

    Yes

     

    Global

    No

    ssl-key

    Yes

    Yes

     

     

    Global

    No

    - Variable: ssl_key

     

     

    Yes

     

    Global

    No

    ssl-verify-server-cert

    Yes

    Yes

     

     

     

     

    6.3.10.5 mysql生成证书和公钥私钥

    具体看:http://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html

    6.3.11  windows使用ssh链接到mysql

    具体看:http://dev.mysql.com/doc/refman/5.6/en/windows-and-ssh.html

    6.3.12 Mysql企业版审计日志插件

    审计日志插件名叫audit_log,当安装了插件后,MySQL服务会产生日志文件包括服务的活动审计记录。

    安装了插件之后会写入到审计日志,日志路径由变量audit_log_file控制,默认为audit.log

    审计日志的格式为XML格式,在服务启动的时候,可以通过audit_log_format控制系统变量,设置日志格式。

    audit_log_policy控制审计的事件,默认为all,可以设置为LOGINSQUERIESNONE

     

    把日志记录格式从老的改成新的需要以下步骤:

    1.停止服务

    2.重命名审计日志文件

    3.使用新的audit_log_format重启服务

     

    注:

    mariadb使用的审计插件和mysql 5.6不同,mariadb使用server audit

    具体看:

    https://mariadb.com/kb/en/mariadb/documentation/mariadb-plugins/server_audit-mariadb-audit-plugin/about-the-mariadb-audit-plugin/

     

    6.3.12.1 安装审计插件

    使用配置文件,或者命令行参数plugin-load设置:

    [mysqld]
    plugin-load=audit_log.so

    或者使用install plugin加载

    mysql> INSTALL PLUGIN audit_log SONAME 'audit_log.so';

    使用了install plugin之后,下次启动会自动加载

    使用audit-log配置文件,来强制插件初始化,否则服务启动报错。

    6.3.12.2 审计日志安全性考虑

    审计日志不加密,为了考虑到敏感信息安全性问题,考虑放在只能管理员和mysql启动用户访问。

    6.3.12.3 审计日志

    主要介绍老的格式和新的格式的字段意义

    具体看:http://dev.mysql.com/doc/refman/5.6/en/audit-log-file.html

    6.3.12.4 审计日志记录控制

    当审计日志插件打开日志文件的时候,查看是否包含<AUDIT>根标签,若有则写入内容,当写入完成,写入</AUDIT>结束。

    如果启动时已经存在日志文件,检查是否存在</AUDIT>,如果有则先截断,然后写入审计记录。如果没有</AUDIT>或者不能截断,就认为插件初始化失败。常发生于服务crash或者被kill但是审计插件任然在运行的情况。

    [ERROR] Plugin 'audit_log' init function returned error.

    解决办法,直接删除审计日志然后重启。

     

    服务当审计事件发生就写入审计日志。

    审计日志插件提供了一些系统变量:

    1.audit_log_file:审计日志文件路径

    2.audit_log_policy:用来决定审计事件,可选值:NONE,LOGINS,QUERIES.

    3.audit_log_strategy:用来控制写入审计日志的方式,可取值如下:

    Value

    Meaning

    ASYNCHRONOUS

    Log asynchronously, wait for space in output buffer

    PERFORMANCE

    Log asynchronously, drop request if insufficient space in output buffer

    SEMISYNCHRONOUS

    Log synchronously, permit caching by operating system

    SYNCHRONOUS

    Log synchronously, call sync() after each request

    4.audit_log_buffer_size:用来给异步审计日志写入做缓存

    5.audit_log_rotate_on_sizeaudit_log_flush:这2个主要控制审计日志的回绕和刷新,审计日志会随着时间推移变得越来越大,为了加强磁盘空间管理,可以自动回绕,会在手动刷新并打开一个新的日志文件。

     

    默认audit_log_rotate_on_size=0是不会回绕的,只有修改audit_log_flush才会执行刷新审计日志并重新打开。假设需要维护3个最近的审计日志如下:

    1.重命名文件

    shell> mv audit.log.2 audit.log.3

    shell> mv audit.log.1 audit.log.2

    shell> mv audit.log audit.log.1

    这个时候,插件任然往当前的审计日志写,已经被重命名为了audit.log.1

    2.连接到服务刷新日志文件,插件会关闭当前日志,并打开一个新的日志

    mysql> SET GLOBAL audit_log_flush = ON;

     

     

    audit_log_rotate_on_size大于0audit_log_flush=1是没有意义的,写入后文件的大小大于audit_log_rotate_on_size,服务会重命名审计日志,打开一个新的审计日志。

    6.3.12.5 审计日志插件选项和变量

    具体看:

    http://dev.mysql.com/doc/refman/5.6/en/audit-log-plugin-options-variables.html

    6.3.13 SQL-Based MySQL账号活动审计

    具体看:http://dev.mysql.com/doc/refman/5.6/en/account-activity-auditing.html

     




        本文转自 Fanr_Zh 博客园博客,原文链接:http://www.cnblogs.com/Amaranthus/p/3895721.html,如需转载请自行联系原作者




    展开全文
  • 安全性:防止未授权的用户随意更改数据库中的数据 完整性:实体完整性、域完整性和参照完整性,保证数据有效 并发性:允许多个用户并行的存取数据库 监测性:对数据库性能进行监测,发现影响性能的因素,针对性...
  • 有的时候不是技术上的原因导致不能实现四个等级,而是出于标准中的某些功能可能影响系统的安全性等其他因素的考虑。 SQL语言的划分 DDL:提供定义关系模式、删除关系以及修改关系的命令 DML:提供从数据库中查询...
  • 进而采用OLS模型对全要素生产率及其影响因素进行回归分析。实证结果表明,企业规模扩大不利于促进煤炭产业全要素生产率的提升,研发投入对企业效率产生显著抑制作用,政府扶持对企业效率产生正面影响
  • 影响数据库性能的因素有很多方面,SQL调优、参数调优、内核调优、硬件、网络等等。 第一,需要确保网络是通过内网连接的,外网的网速慢、不稳定、安全性也不好。 如何通过内网访问 第二,底层硬件的保障,确保采用...
  • 1.7.2 关系数据库提供应用灵活 16 1.7.3 面向对象的应用和对更复杂数据库的需求 16 1.7.4 在Web上交换数据实现电子商务 17 1.7.5 为新应用扩展数据库功能 17 1.7.6 数据库与信息检索 17 1.8...
  • 8.2 数据库安全概述 330 8.2.1 模拟 331 8.2.2 权限 333 8.2.3 控制对象访问 334 8.2.4 角色 338 8.2.5 模式 344 8.3 通过T-SQL编程对象控制对象访问 345 8.3.1 存储过程和标量函数 346 8.3.2 对象内模拟 ...
  • MtrRvw发现的问题可以作为影响对材料的处理决定的诸多因素之一。 1.4.6 安全机制限制对数据库对象的访问。 如果保存数据库文件的计算机的硬盘信息与用户注册的硬盘信息不一致,则“Security”窗体和“MTR Review”...
  • 一个关于数据库的系统,首先要保证数据的稳定性和安全性,在保证数据的不会被丢失的基础上保证数据不会被第三方窃取。威胁数据库因素大致分二种:1:物理威胁:对数据库服务器的物理损坏,例如:电磁干扰,硬盘...
  • 服务器的空间大小、稳定性、安全性以及其他因素影响网站的优化。许多企业在网站运行过程中,这些因素影响使得企业不得不更换一个新的服务器。如何正确更换服务器?有以下几点是需要做个了解的: 1、更换服务器,...
  • 影响业务系统运行稳定性的主要因素电信行业的计算机应用比大多数行业复杂一些,对系统性能指标、安全性、稳定性等都有特殊要求。一旦由于发生软硬件故障,将造成广大电信用户的业务使用受到影响。常见故障类型有以下...
  • 除此之外,涉及到核心业务,企业着重要求数据的安全性以及业务的连续性,所以存储的高可用性也是企业选择的重要因素。Infortrend统一存储GS依靠底层自主研发的精简RAID结构,以及全新的Intel Skylake CPU平台,IOPS...
  • 1.3.4 数据库独立 28 1.3.5 怎么能让应用运行得更快 42 1.3.6 DBA与开发人员的关系 44 1.4 小结 45 第2章 体系结构概述 46 2.1 定义数据库和实例 47 2.2 SGA和后台进程 52 2.3 连接Oracle 54 2.3.1 专用...
  • 煤炭工业作为我国支柱型能源产业,在我国工业生产以及...ORACLE数据库作为目前一种大型数据库开发工具,具有较为良好的稳定,利用ORACLE数据库技术对煤炭安全风险评价与预警进行分析研究,建立较为有效的评价与预警系统。
  • 1.3.4 数据库独立? 25 1.3.5 “怎么能让应用运行得更快?” 41 1.3.6 DBA与开发人员的关系 45 1.4 小结 46 第2章 体系结构概述 47 2.1 定义数据库和实例 48 2.2 SGA和后台进程 53 2.3 连接Oracle 56 2.3.1...
  • 根据某煤矿实际情况选用工作危害分析(JHA)、故障类型与影响分析(FMEA)、危险与可操作研究(HAZOP)、能量源分析(ESA)4种危险源辨识方法,形成某煤矿安全风险数据库。利用数据库的信息,构建安全风险信息系统以及各项...
  • 电子商务网站安全威胁了解

    千次阅读 2010-06-12 13:33:00
    从网站内部看,网站计算机硬件、通信设备的可靠、操作系统、网络协议、数据库系统等自身的安全漏洞,都会影响到网站的安全运行。从网站外部看,网络黑客、入侵者、计算机病毒也是危害电子商务网站安全的重要因素。...
  • 数据库安全性概述:数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或者破坏。 数据库的不安全因素:1、非授权用户对数据库的恶意存取和破坏2、数据库中重要或者敏感的数据被泄露;3、安全...
  • 简介:在过去的几十年中,... 这些含义涉及护士没有足够的时间给每个患者,护理质量的局限以及安全用药的挑战。 结论:该研究记录了护士人员不足与医院不良事件之间的关系,表明护士人员不足是住院患者的危险因素
  • 图书管理系统可行分析报告

    热门讨论 2010-04-05 21:20:42
     新系统在原有系统的基础上加入了新的数据库的支持,使用了先进的数据库技术与数据管理技术,使数据的准确性与安全性得到了很大的提高,且在用户的并行操作与用户管理方面也有了极大地改善。  (二)处理流程和...
  • 影响因素 Tiered Distribution 中讨论的影响因素也适用于此模式。...数据库负载所具有的重要要求数据库应当使用专用的服务器(或整个群集)。 安全策略禁止将公司数据库驻留在直接连接到 Internet 的服务...
  • 在生产中为了保证Oracle数据库数据的安全性,也为了防止不可抗拒的外在因素数据库安全产生的影响,都会采取一些容灾的技术。特别地,对于一些重要数据会做多种容灾的方案保证数据的安全,本文就介绍一种容灾方案...

空空如也

空空如也

1 2 3 4 5
收藏数 82
精华内容 32
关键字:

影响数据库安全性因素