数据库安全性,是指保护数据库以防止不合法操作使用,造成的数据泄露、更改或者破坏。系统保护措施是否有效,是数据库系统的主要技术指标之一。
数据库相关的安全功能,主要包括用户身份鉴别、多层访问控制、审计和数据加密等技术。下面是数据库安全保护的一个访问控制流程图:
1. 用户身份鉴别
用户身份鉴别是数据库管理系统提供的最外层安全保护措施。每个用户在系统中都有一个唯一的用户标识,由用户名和用户标识号(UID)两部分组成,其中UID 在系统的整个生命周期内是唯一的。
数据库内部记录着所有合法用户的标识,系统鉴别则是指由数据库提供一定的方式让用户标识自己的名字或身份。每次用户访问数据库时,都由系统进行核对,通过鉴定后才提供使用数据库管理系统的权限。用户身份鉴别的方法有很多种,而且在一个系统中往往是多种方法相结合,以获得更强的安全性。常用的用户身份鉴别方法有以下几种:
静态口令鉴别:
这种方式是当前常用的鉴别方法。静态口令一般由用户自己设定,鉴别时只要按要求输入正确的口令,系统将允许用户使用数据库管理系统。这些口令是静态不变的,很容易被破解,而一旦被破解,非法用户就可以冒充该用户使用数据库。因此这种方法虽然简单,但容易被攻击,安全性较低。
动态口令鉴别:
它是目前较为安全的鉴别方式。这种方式的口令是动态变化的,每次鉴别时均使用动态产生的新口令登录数据库管理系统,即采用一次一密的方法,常用的方式如短信密码和动态令牌方式。与静态口令鉴别相比,这种认证方式增加了口令被窃取或破解的难度,安全性相对高一些。
生物特征鉴别:
它是一种通过生物特征进行认证的技术,其中,生物特征是指生物体唯一具有的,可测量、识别和验证的稳定生物特征,如指纹、虹膜和掌纹等。这种方式通过采用图像处理和模式识别等技术实现了基于生物特征的认证,与传统的口令鉴别相比,无疑产生了质的飞越,安全性较高。
智能卡鉴别:
智能卡是一种不可复制的硬件,内置集成电路的芯片,具有硬件加密功能。智能卡由用户随身携带,登录数据库管理系统时用户将智能卡插入专用的读卡器进行身份验证。由于每次从智能卡中读取的数据是静态的,通过内存扫描或网络监听等技术还是可能截取到用户的身份验证信息,存在安全隐患。因此实际应用中一般采用个人身份识别码(PIN)和智能卡相结合的方式。
2. 访问控制
数据库安全最重要的一点就是确保只授权给有资格的用户访问数据库的权限,同时令所有未被授权的人员无法接近数据,这主要通过数据库系统的访问控制机制实现。数据库系统一般提供两种访问控制机制,分别是自主访问控制和强制访问控制。
2.1 自主访问控制(Discretionary Access Control——DAC)
自主访问控制也就是常提到的权限控制,用户对于不同的数据库对象有不同的读写权限,不同的用户对同一对象也有不同的权限,且用户可将自身拥有的读写权限转授给其他用户。因此自主访问控制灵活性较高。权限控制通过GRANT语句向用户授权,REVOKE语句撤销权限。
2.2 强制访问控制(Mandatory Access Control——MAC)
自主访问控制 (DAC) 能够通过授权机制有效地控制对敏感数据的读写。但是由于用户对数据的读写限是“自主”的,用户可以自由地决定将数据的读写权限授予何人,以及决定是否也将授权能力授予别人。但在这种授权机制下,可能存在数据的“无意泄露”。
在强制访问控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类。主体是系统中的活动实体,既包括数据库管理系统所管理的实际用户,也包括代表用户的各进程。客体是系统中的被动实体,是受主体操纵的,包括文件、基本表、索引、视图等。对于主体和客体,数据库管理系统为它们每个实例指派一个敏感度标记。
主体的敏感度标记称为许可证级别,客体的敏感度标记称为密级。对于任意一个数据库对象,只有具有合法许可证的用户才可以读写。强制访问控制机制就是通过对比主体的敏感度标记和客体的敏感度标记,来确定主体是否能够操作客体。
访问规则一般基于以下两种读写规则,分别是保密性规则和完整性规则:
保密性规则
· 仅当主体的许可证级别高于或者等于客体的密级时,该主体才能读取相应的客体。(下读)
· 仅当主体的许可证级别低于或者等于客体的密级时,该主体才能写相应的客体。(上写)
完整性规则
· 仅当主体的许可证级别低于或者等于客体的密级时,该主体才能读取相应的客体。(上读)
· 仅当主体的许可证级别高于或者等于客体的密级时,该主体才能写相应的客体。(下写)
自主访问控制与强制访问控制共同构成数据库管理系统的安全机制,系统首先进行自主访问控制检查,对通过自主访问控制检查的允许读写的数据库对象再由系统自动进行强制访问控制检查,只有两者都通过检查的主体,才能访问数据库对象。
3. 审计
数据库审计是对数据库操作行为进行监管的系统,会实时记录数据库活动,把用户对数据库的所有操作自动记录下来放入审计日志中。审计员可以利用审计日志监控数据库中的各种行为,在发生数据库安全事件后,找出非法读写数据的人、时间和内容等,为追溯、恢复、追责、定责提供依据。
对于针对数据库的攻击和风险操作等进行实时告警,以便管理人员及时作出应对措施,从而避免数据被破坏或者窃取。如果发现数据库入侵行为、数据库异常行为、数据库违规访问行为,即可通过短信、邮件、Syslog等多种方式实时告警。
同时,可以对用户访问数据库行为的记录进行分析,根据需求形成不同的审计报表,如综合报表、合规性报表、专项报表、自定义报表等。
4. 入侵检测
SQL注入是比较常见的网络攻击方式之一, web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意语句,从而进一步得到相应的数据信息,非法访问造成数据泄露。
5. 数据加密
数据加密将数据库中的数据,尤其是敏感数据,以加密的方式进行存储,是防止数据库数据在存储和传输中泄露的有效手段。加密的基本思想是根据一定的算法将原始明文数据变换为不可直接识别的密文格式,从而使得不知道解密密钥的人无法获知数据的内容。
对于存储加密,一般提供透明存储加密方式。透明存储加密是数据库内核级加密保护方式,对用户完全透明。而非透明存储加密则是通过提供加密函数实现的。
数据库透明加密技术是针对关系型数据库保密需求应运而生的一种数据库加密技术。所谓透明,是指对用户来说无需更改现有的应用系统和操作习惯。当用户通过应用程序访问数据库时,得到的是明文数据,而未授权的用户通过非法手段访问数据库得到的都是密文数据。数据在应用程序中是明文,在数据库中是密文。一旦离开使用环境,由于应用程序无法得到自动解密的服务而无法打开,从而起到保护数据库中数据的效果。
与透明加密相对应的,是在应用系统中对数据进行加密,然后再存储到数据库中;需要真实数据的时候,再从数据库中读取密文,再解密出明文。用户可以自由选择需要加密的敏感信息,以及加密方式,而不是全部数据都加密。这样只对部分数据加密可以提高数据库访问速度,有利于用户在效率与安全性之间进行自主选择。
6. 推理控制:
推理控制处理的是强制访问控制未解决的问题。例如,用户利用列的函数依赖关系,从低安全等级信息推导出其无权访问的高安全等级信息,进而导致信息泄露。
数据库推理控制用来避免用户利用其能够访问的数据推知更高密级的数据,即用户利用其被允许的多次查询的结果,结合相关的领域背景知识以及数据之间的约束,推导出其不能访问的数据。在推理控制方面,常用的方法有基于函数依赖的推理控制和基于敏感关联的推理控制等。
在《GB/T 20273-2019 信息安全技术 数据库管理系统安全技术要求》中,安全功能不再要求提供推理控制。
1. 登录认证
1.1 证书认证
数字证书是指在传输通信中标志各方身份信息的一个数字认证,是由电子商务认证中心(简称为CA中心)所颁发的一种较为权威与公正的证书,用来识别对方的身份。同时,可以通过证书将传输的信息和数据进行加密解密等处理,保证了信息的完整性和安全性。
开务数据库可以通过znbase cert命令创建CA证书和密钥,再创建由CA证书签名的节点和客户端证书。当节点之间建立联系,或者客户端与节点建立联系时,它们使用CA证书来验证彼此的身份。
1.2 口令认证
为保护用户信息,数据库系统不直接将用户明文口令存储在数据库内部,而是存储口令进行加密后得到的密文,加密方式一般采取不可逆的摘要算法。
摘要算法是一种把任意长度的输入通过哈希而产生长度固定的输出的算法,主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
为增加密码破解难度,一般会在口令加密时,采取加盐措施,即在明文口令中加入额外信息,再进行哈希运算。校验时取出盐值,盐跟明文口令进行相同的哈希运算操作,将得到的结果跟保存在数据库内部中的密文进行对比。
目前,开务数据库支持BCRYPT、SM3、PBKDF2,三种加密算法。
下图为BCRYPT算法加密后得到的密文,其中包含了哈希次数、盐值和哈希值。
1.3 客户端认证
客户端认证用来设置允许访问的IP地址,以及访问的认证方式,通过集群参数server.host_based_authentication.configuration设置,格式与PostgreSQL的pg_hba.conf配置文件一致。
每条记录指定一种连接类型、一个客户端 IP 地址范围(如果和连接类型相关)、一个数据库名、一个用户名以及对匹配这些参数的连接使用的认证方法。第一条匹配连接类型、客户端地址、连接请求的数据库和用户名的记录将被用于执行认证。
当前支持的认证方式有:
cert
仅用于通过SSL连接的基于证书的身份验证cert-password
允许通过SSL连接进行基于证书或基于密码的身份验证password
通过SSL连接进行基于密码的身份验证trust
无条件地允许匹配的连接reject
无条件地拒绝匹配的连接注意,不能在非SSL连接上定义认证规则。非SSL连接仅在非安全模式运行的数据库上才可以使用。而在非安全模式下,所有认证逻辑完全失效。
2. 权限控制
上述表格为开务数据库中已有的数据库对象,及其对应的权限类型。
用户的权限信息由三部分组成:用户、对象和权限类型,在各数据库对象的Descriptor下的PrivilegeDescriptor中,存放着用户权限信息。结构如下图所示。
用户通过GRANT/REVOKE语句进行权限管理操作,可以把自己拥有的权限(需拥有授权能力,即grantable为true)授予给其他用户。注意不能循环授权,如下图所示,循环授权会导致级联撤销权限时,无法跟踪权限来源。用户只能将自己授予的权限撤销,而不能撤销其他用户授予的权限。同时,撤销权限时,会将授予出去的权限级联撤销。如图中u1撤销授予给u2的权限时,u2授予u3和u3授予u4的该权限,都会被撤销。
在进行用户的权限检查时,以检查表的权限为例,会先检查是否能访问到该表,即检查database和schema上的USAGE权限,再检查在该表上是否有对应权限。如果是列权限的话(SELECT, INSERT, UPDATE),还会检查对应列上的权限。
权限检查会检查三部分的权限(即用户的权限来源于三部分):(1)检查该用户是否是该对象的Owner;(2)检查该用户是否有对应权限;(3)检查该用户所属的角色是否有对应权限。
数据库对象Owner,是数据库对象的拥有者,默认为数据库对象的创建者,拥有该对象的所有权限,目前暂不支持更改Owner。在下图所示的可更新视图的INSERT操作中,用户在INSERT可更新视图时,会检查该用户是否有视图的INSERT权限,及该视图的Owner是否有表的INSERT权限。
3. 审计
目前已审计操作行为,包含大部分的DDL和DCL操作,具体操作类型详见《云溪NewSQL分布式数据库用户手册》第7.5章安全审计。
在打开审计开关,数据库就会将对应的操作信息,记录到审计记录表和审计日志中,记录信息包括用户信息、操作时间、事件类型、被访问资源的名称、访问结果等。而表级的DQL、DML操作,则需要使用ALTER TABLE table_name EXPERIMENTAL_AUDIT SET READ WRITE语句,打开该表的审计开关。
由于DQL、DML操作频繁,将所有表的读写操作都自动审计,会生成大量审计记录,因此由用户自主控制需要审计的表。
同时,审计支持邮件告警功能,在触发对应操作的告警规则后,会向预先设置好的邮箱中发送相关邮件。对于该邮件告警系统,有时不需要将每一个事件都加入邮件告警的范围中,此时可以使用禁用事件设置对无需告警的操作加以忽略。例如,SET CLUSTER SETTING audit.event.disable.list="drop_database,drop_table";
此外,为了满足用户对SQL语句长度进行限制的需求,审计模块中添加了有关SQL长度限制的功能,可通过audit.sql.length设置允许的最大SQL语句长度。
4. SQL拦截
开务数据库通过对用户输入进行词法分析生成指纹规则,然后通过二分查找算法,在特征库中进行匹配,匹配到则报SQL注入漏洞。
SQL拦截功能,由audit.sql.inject.bypass.enabled参数控制,用于设置是否绕过SQL注入拦截功能。值为true时,绕过SQL注入拦截功能,不对执行的SQL语句进行SQL注入检测及拦截;值为false时,启用SQL注入拦截功能。默认值为true。
在执行一条有SQL注入可能的语句时,如:SELECT (1 OR ( SELECT * FROM test));则会报出错误:sql with fingerprint of 'E(1&('。