Redis数据库安全研究与实践
作者: 王杰
摘要:目前随着互联网的发展,NoSQL数据库得到飞速发展,键值数据库Redis得到了广泛应用,但与此同时,安全性风险急剧增加。文章详细分析了Redis数据库的安全风险点,分析Redis.conf配置文件的重要性,提出了几种相应的解决办法,有助于提高Redis数据库安全性。
关键词:数据库;安全;NoSQL;非关系型数据库;Redis;Redis.conf
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2022)30-0060-03
开放科学(资源服务)标识码(OSID):
随着互联网Web2.0网站的兴起,传统的关系数据库在处理超大规模数据和高并发动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点和优势得到了非常迅速的发展。
NoSQL(Not Only SQL或Non-relational Databases),通常是指非关系型的数据库系统,是为了解决大规模数据集合和多重数据种类带来的挑战。NoSQL数据库具有数据存储结构灵活、可扩展性高、支持数据的最终一致性、大数量、高性能等优点。常用的NoSQL数据库类型有:Key-Value键值存储数据库、文档存储数据库、列存储数据库、图存储数据库及其他类型存储数据库。
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value键值数据库,并提供多种语言的API。
Redis是一个Key-Value存储系统,支持存储的value类型包括:string(字符串类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)、hash(哈希类型)、stream(流类型)、geo(地理位置)等。为了保证效率,Redis数据都是缓存在内存中,因此也可以称Redis为内存数据库。为了保证数据的安全性Redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件中。
Redis提供了Java、C/C++、Python、C#、PHP、JavaScript、Perl、Object-C、Rub等客户端,使用非常方便。截至2022年3月,在www.db-engines.com网站,DB-Engines Ranking数据库排行榜上,Redis位列所有数据库管理系统排名第六位,非关系型数据库管理系统排名第二位(仅次于MongoDB),Key-Value键值数据库管理系统排名第一位。
目前Redis数据库系统得到了广泛应用,但和大型关系数据管理系统相比,Redis安全性需要提高,例如Redis默认管理员密码为空,缺少用户管理机制,没有用户权限管理机制,不支持为每个数据库设置不同的访问密码等。国内外已经发生过许多起大规模针对Redis服务器的入侵事件和Redis安全事件,因此在应用中需要对Redis数据库系统安全性高度重视。
1 Redis版本的选择
Redis数据库服务器主要运行在Linux操作系统中,可以访问Redis官方网站https://www.Redis.io,下载最新版本软件。Redis软件版本有稳定版本(Stable)、不稳定版本(Unstable)、候选版本(Release-Candidate)、容器版本(Docker Hub)、云计算版本(In the Cloud)等,在生产环境中,一定要选择稳定版本(Stable)安装与使用。
Redis官方不支持Windows操作系统,但许多开发爱好者和软件公司在Github上发布了Redis Windows版本,可以下载使用,但仅限用于学习,不能用于生产环境中。
2 Redis配置文件Redis.conf
在Redis数据库系统中,Redis.conf是一个非常重要的配置文件(在Windows操作系统,文件名为Redis.windows.conf和Redis.windows-service.conf),这个文件中存储着数据库管理员密码、网络地址、端口号等一些非常重要的参数,对Redis数据库系统的安全设置也通常是通过配置这个文件来实现。
在Linux操作系统中一定要注意对Redis主目录和Redis.conf文件的权限设置,将Redis主目录权限设置为700,将Redis.conf文件独立于主目录,权限设置为600,保证Redis.conf文件不被非法读写执行访问。
Redis提供了一个轻量级的认证方式,设置后,每一个客户端连接在操作数据之前需要进行认证,密码在Redis.conf配置文件中明文设置。同时,在使用中密码也是明文传输的,由于Redis访问速度非常快,为了安全,数据库管理员密码一般较长且复杂,防止暴力攻击。
3 对Redis.conf安全管理
3.1设置管理员密码
Redis数据库服务器安装完成后,默认情况下数据库管理员密码是空的,意味着用户无须通过密码验证就可以连接到 Redis 服务器,这存在着重大安全隐患,因此必须为Redis服务器设置管理员密码,让Redis服务器运行更安全。
方法一:修改Redis.conf配置文件,增加一行。
Requirepass beijing2022 #beijing2022是新设置的数据库管理员密码
然后需要重新启动Redis服务器,管理员密码才能发挥作用。
方法二:使用命令客户端,为当前Redis服务器设置密码,命令格式如下:
#设置密码为beijing2022
127.0.0.1:6379> CONFIG set requirepass beijing2022
#将密码写入Redis.conf文件中
127.0.0.1:6379> CONFIG rewrite
使用命令行客户端设置密码成功后,需要使用命令CONFIG rewrite将密码写入到Redis.conf文件中,否则密码只对服务器本次开启时段有效,重启后继续使用原来配置文件的密码。
设置密码后,客户端连接 Redis 服务器就需要密码验证,否则无法执行命令,客户端密码验证语法:
127.0.0.1:6379> AUTH beijing2022
和传统关系数据库相比,由于Redis服务器查询速度非常快,外部用户可以每秒试探150K以上个密码,必须使用非常强大的密码,否则很容易被破解。因此在设置密码一方面要提高密码的复杂程度,使用“字母+数字+特殊字符”组成,另一方面提高密码长度,生产环境中的Redis数据库管理员密码设置建议32位以上长度。
设置好管理员密码,客户端连接格式如下:
Redis-cli.exe -p 6379 -a myPassWord
3.2限制对Redis服务器访问
在Redis.conf文件中有Bind参数,可以设置绑定本机网卡IP地址[8]。
通常Redis服务器都有多块网卡,每一块网卡对应一个IP地址,例如IP1和IP2,IP1和IP2都是本机的IP地址。在配置文件中增加一行Bind IP1,表示只能通过IP1来访问连接和管理Redis服务器;如果通过IP2来访问Redis服务器,就会连不上Redis服务器。
如果指定了Bind,则说明只允许来自指定服务器网卡的Redis请求;如果没有指定,就说明可以接受来自任意一块服务器网卡的Redis请求,而不是Redis允许来自其他计算机的IP地址。
方法一:限定本机才可以访问Redis服务器
打开Redis.conf配置文件,增加一行:
Bind 127.01.1
方法二:限定指定计算机访问Redis服务器
限定只有指定的主机可以连接到Redis服务器,可以通过防火墙来控制,而不能通过Redis.conf文件中的Bind参数来限制。
3.3修改Redis服务器端口号
不同的数据库使用不同的端口号来远程管理数据库,例如MySQL默认端口号是3306,SQL Server默认端口号是1433,Oracle默认端口号是1521,Redis数据库默认端口号是6379,为了防止非法用户扫描Redis服务器库,可以将端口号修改。
修改Redis.conf文件中 Port 6379 修改为 Port 6380。
修改Redis端口后,访问方法也需要修改:
Redis-cli.exe -h 192.168.1.99 -p 6380
3.4高级语言访问Redis服务器方法
当修改了Redis管理员密码、端口号后,高级语言访问Redis服务器连接字符串要修改,以Python语言为例。
Import Redis
Client =Redis.Redis(host=’192.168.1.99’,port=6380,password=’myPassword’)
4 危险命令禁用和重命名
在Redis数据库中有一些权限高、非常危险的命令,这些命令破坏性极强,会对Redis库服务器运行及数据库安全造成非常严重的影响,一旦操作失误使用这些命令,会导致灾难性的后果。
因此如何避免非法入侵者和人为操作失误使用这些命令,导致灾难性的后果是Redis数据库安全管理特别需要关注的内容。
例如FLUSHDB清空当前数据库的所有key,相当于关系数据库语言SQL中的Drop Database命令;Flushall清空整个Redis服务器中所有数据库的所有key,在关系数据库语言SQL中还没有破坏性如此之强的命令,相当于Linux操作系统中的 rm -rf /* 命令。常用的Redis危险命令如表2所示。
对Redis危险命令,可以将命令进行分级管理,将危险性强的命令禁用,危险性一般的命令重命名。主要方法是通过修改Redis.conf配置文件,在SECURITY 区域,对危险命令进行禁用和重命名,从而降低Redis数据库系统的风险性。
在Redis.conf配置文件中提供了 rename-command 指令用于将某些危险的命令禁用或重命令,提高系统的安全性。
指令格式:rename-command keys ******
方法一:禁用命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command EVAL ""
rename-command DEBUG ""
方法二:重命名命令
rename-command CONFIG "XXXX"