4.2 常见数据库系统
目前常见的数据库系统有Oracle、DB2、SQL Server、MySQL、PostgreSQL和SQLite等。
4.2.1 Oracle
20世纪70年代一家名为Ampex的软件公司,为中央情报局设计一套名叫Oracle的数据库,埃里森是程序员之一。
1977年埃里森与同事Robert Miner创立“软件开发实验室”(Software Development Labs),当时IBM发表“关系数据库”的论文,埃里森以此开发出新数据库,名为甲骨文。
1978年公司迁往硅谷,更名为“关系式软件公司”(RSI)。RSI在1979年的夏季发布了可用于DEC公司的PDP-11计算机上的商用Oracle产品,这个数据库产品整合了比较完整的SQL实现,其中包括子查询、连接及其他特性。美国中央情报局想买一套这样的软件来满足他们的需求,但在咨询IBM公司之后发现IBM没有可用的商用产品,于是他们联系了RSI,RSI有了第一个客户。1982年再更名为甲骨文(Oracle)。
Oracle安全加固主要涉及以下几个方面。
(1)安全补丁的更新
及时更新数据库的安全补丁,减少数据库系统可能受到的安全攻击。参考Oracle厂商建议,仅对已发现的特定漏洞或缺陷安装相应补丁。
(2)$ORACLE_HOME/bin目录权限保护
确保对$ORACLE_HOME/bin目录的访问权限尽可能少,运行命令:
验证ls-l $ORACLE_HOME/bin,确保该目录下的文件属主为oracle用户,且其他用户没有写权限。
(3)Oracle数据字典的保护
设置保护后,可防止其他用户(具有'ANY'system privileges)使用数据字典时,具有相同的'ANY'权限。使用文本的方式,打开数据库的配置文件init<sid>.ora,更改以下参数O7_DICTIONARY_ACCESSIBILITY=。
● Oracle 9i、10g:默认值是False。
● Oracle 8i:默认值是True,需要改成False。
● 如果用户必须需要该权限,赋予其权限SELECT ANY DICTIONARY。
验证:SQL> show parameter O7_DICTIONARY_ACCESSIBILITY。
(4)加强访问控制
设置正确识别客户端用户,并限制操作系统用户数量(包括管理员权限、root权限和普通用户权限等)。
● 使用文本的方式,打开数据库配置文件init<sid>.ora,设置参数REMOTE_OS_AUTHENT,值为FALSE(SAP系统不可设置为False)。
● 在数据库的账户管理中删除不必要的操作系统账号。
设置(需重启数据库):alter system set remote_os_authent=false scope=spfile;。
验证:SQL>show parameter remote_os_authent。
(5)密码文件管理
配置密码文件的使用方式,使用文本的方式,打开数据库配置文件init<sid>.ora,设置参数REMOTE_LOGIN_PASSWORD_FILE=NONE。
● None:使得Oracle不使用密码文件,只能使用OS认证,不允许通过不安全网络进行远程管理。
● Exclusive:可以使用唯一的密码文件,但只限一个数据库。密码文件中可以包括除了sys用户的其他用户。
● Shared:可以在多个数据库上使用共享的密码文件。但是密码文件中只能包含sys用户。
设置:(需重启数据库)alter system set remote_login_passwordfile=none scope=spfile;。
验证:SQL>show parameter remote_login_passwordfile。
(6)用户账号管理
为了安全考虑,应该锁定Oracle中不需要的用户或改变默认用户的密码。锁定不需要的用户,使用SQL语句ALTER USER user PASSWORD EXPIRE;。
注意要锁定MGMT_VIEW、DBSNMP、SYSMAN账号或修改密码(如果要使用DBConsole、DBSNMP、SYSMAN则不能锁定账户,需请修改密码)。
(7)最小权限使用规则
● 应该只提供最小权限给用户(包括SYSTEM和OBJECT权限)。
● 从PUBLIC组中撤回不必要的权限或角色(如UTL_SMTP、UTL_TCP、UTL_HTTP、UTL_FILE、DBMS_RANDON、DBMS_SQL、DBMS_SYS_SQL和DBMS_BACKUP_RESTORE)。
撤销不需要的权限和角色,使用SQL语句:
(8)sys用户的处理
Oracle数据库系统安装后,自动创建一个数据库管理员用户sys,当该用户以sysdba方式连接数据库时,便具有全部系统权限,因而对它的保护尤为重要。
加固方法:更换sys用户的密码,符合密码复杂度要求;新建一个DBA用户,作为日常管理使用。
(9)密码策略
在Oracle中,可以通过修改用户概要文件来设置密码的安全策略,可以自定义密码的复杂度。以下参数和密码安全有关。
FAILED_LOGIN_ATTEMPTS:最大错误登录次数。
PASSWORD_GRACE_TIME:口令失效后的锁定时间。
PASSWORD_LIFE_TIME:口令有效时间。
PASSWORD_LOCK_TIME:登录超过有效次数的锁定时间。
PASSWORD_REUSE_MAX:口令历史记录的保留次数。
PASSWORD_REUSE_TIME:口令历史记录的保留时间。
PASSWORD_VERIFY_FUNCTION:口令复杂度审计函数。
(10)数据库操作审计
Oracle数据库具有对其内部所有发生的活动的审计能力,审计日志一般放在sys.aud$表中,也可以写入操作系统的审计跟踪文件中。可审计的活动有三种类型:登录尝试、数据库活动和对象存取。默认情况下,数据库不启动审计,要求管理员配置数据库后才能启动审计。
使用文本方式,打开数据库配置文件init<sid>.ora,更改以下参数配置AUDIT_TRAIL=True。
默认为False,当设置为True时,所有sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录。
验证:SQL>show parameter audit。
(11)本地缓存区溢出防护
'oracle'程序存在本地缓冲区溢出。在传递命令行参数给'oracle'程序时,缺少充分的边界缓冲区检查,可导致以'oracle'进程权限在系统上执行任意代码,需要进行有效加固。
以系统管理员权限登录操作系统,进入Oracle安装目录。
运行chmod o-x oracle,加强对Oracle文件的可执行控制,这样非Oracle账号对该文件没有读取、运行的权限。
4.2.2 DB2
IBM DB2是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM的AIX)、Linux,以及Windows服务器版本。
DB2主要用于大型应用系统,可以支持从大型机到单用户环境具有良好的可扩展性。适用于所有常见的服务器操作系统平台。DB2提供了高级别的数据利用性、完整性、安全性和可恢复性,并且具有独立于平台的基本功能和SQL命令。DB2采用了数据分级技术,可以方便地将主机数据下载到LAN数据库服务器,使得客户机/服务器用户和基于LAN的应用程序可以访问大型机数据,并使数据库本地化及远程连接透明化。DB2以拥有一个非常完备的查询优化器而著称,其外部连接提高了查询性能,并支持多任务并行查询。DB2具有良好的网络支持能力,每个子系统可以连接成千上万的分布式用户,可同时激活数千个活动线程,特别适用于大型分布式应用系统。
DB2数据库安全加固主要涉及以下几个方面。
(1)最小化权限设置
在数据库权限配置功能中,根据用户的业务需要配置所需的最低权限。防止滥用数据库权限,降低安全风险。
若要对用户roy撤销staff表上的alter特权,可以使用以下语句:
若要对用户roy撤销staff表上的所有特权,可以使用以下语句:
(2)启用日志记录并设置为存档日志模式
实现在线备份和恢复,日志的默认模式是循环日志。默认情况下,只能实现数据库的离线备份和恢复。
注意:
更改为on后,当查看数据库配置参数logretain的值时,实际显示的是recovery。更改此参数后,再次连接到数据库将显示数据库处于备份挂起状态。此时,需要对数据库进行离线备份(DB2 backup dB),以使数据库状态正常。
注意:
确保将内存中仍然缓冲的所有审计记录写入磁盘db2audit flush。
(3)用户身份验证失败锁定
对于采用静态口令认证技术的数据库,应在用户连续认证失败次数超过6次(不含6次)时锁定。
修改/etc/login.defs,代码如下:
4.2.3 SQL Server
SQL Server是微软公司开发的关系型数据库管理系统。
Microsoft SQL Server是一个综合性的数据库平台,它通过集成的商业智能(BI)工具提供了企业级的数据管理。Microsoft SQL Server数据库引擎为关系型数据和结构化数据提供了更安全、可靠的存储功能,并且可以为业务构建和管理高可用和高性能的数据应用程序。
SQL Server只在Windows上运行,Microsoft这种专有策略的目标是将客户锁定到Windows环境中,从而限制客户选择其他更开放的、基于标准解决方案的数据库系统以获得更多的革新和价格竞争带来的好处。但Windows平台本身的可靠性、安全性和可伸缩性有限。
SQL Server安全加固主要涉及以下几个方面。
(1)安装安全补丁
在补丁安装之前建议先对数据库进行备份,停止SQL Server服务,然后在Microsoft SQL Server Download Web Site下载补丁进行安装。
(2)禁用不必要的服务
在SQL Server安装时,默认安装MSSQLSERVER、QLSERVERAGENT、SSQLServerADHelper和Microsoft Search这4个服务,除了MSSQLSERVER外,其他服务如果不需要,建议禁用。
(3)限制SQL Server使用的协议
在Microsoft SQL Server程序组,运行服务网络实用工具,建议只使用TCP/IP协议,禁用其他协议。
4.2.4 MySQL
MySQL是一个关系型数据库管理系统(Relational Database Management System,RDBMS),由瑞典MySQL AB公司开发。MySQL是流行的关系型数据库管理系统之一,在Web应用方面,MySQL是最好的RDBMS应用软件之一。关系数据库将数据存储在不同的表中,而不是将所有数据放在一个大仓库中,这样提高了速度和灵活性。
MySQL所使用的SQL语言是访问数据库最常用的标准化语言。MySQL软件采用了双授权策略,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开源等特点,一般中小型网站的开发都选择MySQL作为网站数据库。
与其他的大型数据库(如Oracle、DB2、SQL Server等)相比,MySQL也有它的不足之处,但是这丝毫没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开源软件,可以大大降低总体拥有的成本。
选择Linux作为操作系统,Apache或Nginx作为Web服务器,MySQL作为数据库,PHP/Perl/Python作为服务器端脚本解释器,由于这4个软件都是免费或开源软件,使用这种方式就可以建立起一个稳定、免费的网站系统,业界称为“LAMP”或“LNMP”组合。
MySQL数据库安全加固主要涉及以下几个方面。
(1)安装完MySQL后需要做的工作
安装完MySQL后需要安装mysql-client。运行mysql_secure_installation会执行几个设置:
1)为root用户设置密码。
2)删除匿名账号。
3)取消root用户远程登录。
4)删除test库和对test库的访问权限。
5)刷新授权表使修改生效。
通过这几项的设置能够提高MySQL库的安全性。
(2)禁止远程连接数据库
在命令行netstat -ant下看到,默认的3306端口是打开的,此时打开了mysqld的网络监听,允许用户远程通过账号和密码连接本地数据库,默认情况是允许远程连接数据库的。为了禁止该功能,启动skip-networking,不监听SQL的任何TCP/IP连接,切断远程访问的权利,保证安全性。如果需要远程管理数据库,可通过安装PhpMyadmin来实现。如果确实需要远程连接数据库,至少修改默认的监听端口,同时添加防火墙规则,只允许可信任网络的MySQL监听端口的数据通过。
将#skip-networking注释删除。
(3)限制连接用户的数量
数据库的某用户多次远程连接,会导致性能的下降和影响其他用户的操作,有必要对其进行限制。可以通过限制单个账户允许的连接数量来实现,即设置my.cnf文件mysqld中的max_user_connections变量来完成。GRANT语句也可以支持资源控制选项来限制服务器对一个账户允许的使用范围。
(4)用户目录权限限制
默认的MySQL安装在/usr/local/mysql目录下,而对应的数据库文件在/usr/local/mysql/var目录下,因此,必须保证该目录不能让未经授权的用户访问,所以要限制对该目录的访问。确保mysqld运行时,只有对数据库目录具有读或写权限的Linux用户可运行。
4.2.5 PostgreSQL
PostgreSQL是一种特性非常齐全的自由软件的对象关系型数据库管理系统(ORDBMS),以加州大学计算机系开发的POSTGRES为基础。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性和多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,如通过增加新的数据类型、函数、操作符、聚集函数、索引方法和过程语言等进行扩展。另外,因为许可证的灵活性,任何人都可以以任何目的免费使用、修改和分发PostgreSQL。
PostgreSQL最初设想于1986年,当时被叫作Berkley Postgres Project。该项目一直到1994年都处于演进和修改中,直到开发人员Andrew Yu和Jolly Chen在Postgres中添加了一个结构化查询语言(Structured Query Language,SQL)翻译程序,该版本叫作Postgres95,在开放源代码社区发放。
1996年,再次对Postgres95做了较大的改动,并将其作为PostgresSQL6.0版发布。该版本的Postgres提高了后端的速度,包括增强型SQL92标准及重要的后端特性(包括子选择、默认值、约束和触发器)。
PostgreSQL数据库安全加固主要涉及以下几个方面。
1)PostgreSQL支持丰富的认证方法:信任认证、口令认证和PAM认证等多种认证方式。PostgreSQL默认配置只监听本地端口,无法通过远程TCP/IP连接数据库。需要修改postgresql.conf中的listen_address字段修改监听端口,使其支持远程访问。例如,listen_addresses=‘*’表示监听所有端口。
2)线上重要数据库禁止使用trust方式进行认证,必须使用MD5方式。
3)重命名数据库超级管理员账户为pgsqlsuper,此账号由DBA负责人保管,禁止共用。
4)配置数据库客户端支持SSL连接。客户端认证是由一个配置文件控制的,存放在数据库集群的数据目录中。
5)用openssl生成密钥对,创建一个自签名的服务器密匙(server.key)和证书(server.crt)。
6)开启TCP/IP连接:将postgresql.conf参数tcpip_socket设置为true。
7)开启SSL:将postgresql.conf参数ssl设置为true。
8)根据最小权限要求给用户配置角色和权限。
为了保护数据安全,用户对某个数据库对象进行操作之前,必须检查用户在对象上的操作权限。访问控制列表(ACL)是对象权限管理和权限检查的基础,PostgreSQL通过操作ACL实现对象的访问控制管理。
9)审计是指记录用户的登录、退出,以及登录后在数据库中的行为操作,可以根据安全等级不同设置不同级别的审计。默认需设置如下安全配置参数。
● logging_collector:是否开启日志收集开关,默认是off,开启后要重启数据库。
● log_destination:日志记录类型,默认是stderr,只记录错误输出。
● log_directory:日志路径,默认是$PGDATA/pg_log。
● log_filename:日志名称,默认是postgresql-%Y-%m-%d_%H%M%S.log。
● log_connections:用户session登录时是否写入日志,默认是off。
● log_disconnections:用户session退出时是否写入日志,默认是off。
● log_rotation_age:保留单个文件的最大时长,默认是1d。
● log_rotation_size:保留单个文件的最大尺寸,默认是10MB。
10)严格控制数据库安装目录的权限,除了数据文件目录,其他文件和目录属主都改为root。此外,还要及时更新数据库。
4.2.6 SQLite
SQLite是一款轻型的数据库,是关系型数据库管理系统,包含在一个相对较小的C库中。SQLite是D. Richard Hipp建立的公有领域项目,其设计目标是嵌入式的,而且已经在很多嵌入式产品中使用。SQLite占用资源非常低,在嵌入式设备中,可能只需要几百KB的内存。它能够支持Windows/Linux/UNIX等主流的操作系统,同时能够与很多程序语言相结合,如TCL、C#、PHP和Java等,还提供了ODBC接口,比MySQL、PostgreSQL这两款开源的数据库管理系统快。SQLite第一个Alpha版本诞生于2000年5月。2019年SQLite 3版本发布,这距SQLite的诞生已经有19年了。
与常见的客户端/服务器范例不同,SQLite引擎不是程序与通信之间的独立进程,而是连接到程序并成为其主要部分。编程语言直接在API协议中调用。这在消耗总量、延迟时间和整体简单性上有积极的作用。整个数据库(定义、表、索引和数据本身)在宿主主机上存储在一个单一的文件中。SQLite的简单的设计是通过在开始一个事务时锁定整个数据文件而完成的。
SQLite安全加固主要涉及以下几个方面。
(1)SQLite数据库加密(SQLCipher)
检查SQLite是否使用了SQLCipher开源库。SQLCipher是对整个数据库文件进行加密。注意,该检测项不是警告用户有风险,而是提醒用户采用了SQLite对数据库进行了加密。
检测方法:使用了SQLCipher开源库会产生Lnet/sqlcipher/database/SQLiteDatabase的包路径,只需在包路径中查找是否存在该路径的包名即可。
(2)SQLit使用SQLite Encryption Extension(SEE)插件
SEE是一个数据库加密扩展插件,允许App读取和写入加密的数据库文件,是SQLite的加密版本(收费版),可以提供以下的加密方式:RC4、AES-128 in OFB mode、AES-128 in CCM mode和AES-256 in OFB mode。
检测方法:使用了SEE拓展插件会产生Lorg/sqlite/database/sqlite/SQLiteDatabase的包路径,只需在包路径中查找是否存在该路径的包名即可。
(3)SQLite SQL注入漏洞防护
SQLite作为Android平台的数据库,对于数据库查询,如果开发者采用字符串链接方式构造SQL语句,就会产生SQL注入。
防护建议如下。
● Provider不需要导出,将export属性设置为false。
● 若导出仅为内部通信使用,则设置protectionLevel=signature。
● 不直接将传入的查询语句用于projection和selection,使用由query绑定的参数selectionArgs。
● 采用完备的SQL注入语句检测逻辑,防止注入发生。
(4)Databases任意读写漏洞防护
APP在使用openOrCreateDatabase创建数据库时,如果将数据库设置了全局可读权限,攻击者则可以恶意读取数据库内容,获取敏感信息。在设置数据库属性时如果设置全局可写,攻击者可能会篡改、伪造内容,可以能会进行诈骗等行为,造成用户财产损失。