redis访问安全加固
目录
- redis漏洞
- 入侵特征
- 安全隐患
- redis安全规范
- 禁止root用户启动
- 限制redis文件目录访问权限
- 开启密码认证,设置复杂密码
- 禁用或重命名危险命令
- 设置允许监听地址,不要使用0.0.0.0
- 尽量修改默认端口6379
- 信任的内网运行,尽量避免有公网访问
Redis漏洞
Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。
入侵特征
- Redis 可能执行过 FLUSHALL 方法,整个 Redis 数据库被清空
- 在 Redis 数据库中新建了一个名为 crackit(网上流传的命令指令) 的键值对,内容为一个 SSH 公钥。
- 在 /root/.ssh 文件夹下新建或者修改了 authorized_keys 文件,内容为 Redis 生成的 db 文件,包含上述公钥,完成root权限获取。
满足以下条件Redis实例存在此安全隐患
- Redis使用root用户启动
- Redis未设置密码或密码过于简单
- Redis允许任意地址连接,即bind 0.0.0.0
- Redis未重命名或禁用config, flushdb/flushall,[bg]save等命令
- 使用默认端口6379(非强制)
加强Redis的安全性,提供以下安全规范。
备注:如果修改redis配置文件redis.conf,并且重启redis服务后生效。
Redis安全规范
禁止root用户启动redis
为 Redis 服务创建单独的用户和home目录,使用普通用户启动,安全性往往高很多;
业务程序永久别用root用户运行。
限制redis文件目录访问权限
设置redis的主目录权限为700;如果redis配置文件独立于redis主目录,权限修改为600,因为Redis密码明文存储在配置文件中。
- $chmod /var/lib/redis #redis目录
- $chmod /etc/redis/redis.conf #redis配置文件
开启redis密码,并设置高复杂度密码
redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑redis.conf配置来启用认证。
redis因查询效率高,auth这种命令每秒能处理10w次以上,简单的redis的密码极容易为攻击者暴破。
requirepass至少长度20位以上,为方便可使用一个特殊串sha256sum命令生成64位的无特殊字符串。
- $echo "dfasdERQEWRQEW31341dfadsfadsf" | sha256sum
- af970b3691a0774b2a5adae1375e14cd9e5db3591564f0eb789c2324cc02362f -
1、初始化Redis密码:
在配置文件中有个参数: requirepass 这个就是配置redis访问密码的参数;
比如 requirepass test123;
(Ps:需重启Redis才能生效)
redis的查询速度是非常快的,外部用户一秒内可以尝试多大150K个密码;所以密码要尽量长(对于DBA 没有必要必须记住密码);
2、不重启Redis设置密码:
在配置文件中配置requirepass的密码(当redis重启时密码依然有效)。
- redis 127.0.0.1:6379> config set requirepass ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815
查询密码:
- redis 127.0.0.1:> config get requirepass
- (error) ERR operation not permitted
密码验证:
- redis 127.0.0.1:> auth ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815
- OK
再次查询:
- redis 127.0.0.1:> config get requirepass
- ) "requirepass"
- ) "ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815"
PS:如果配置文件中没添加密码 那么redis重启后,密码失效;
3、登陆有密码的Redis:
在登录的时候的时候输入密码:
- redis-cli -p -a ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815
先登陆后验证:
- redis-cli -p
- redis 127.0.0.1:> auth ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815
- OK
AUTH命令跟其他redis命令一样,是没有加密的;阻止不了攻击者在网络上窃取你的密码;
认证层的目标是提供多一层的保护。如果防火墙或者用来保护redis的系统防御外部攻击失败的话,外部用户如果没有通过密码认证还是无法访问redis的。
禁用或重命名危险命令
这个漏洞就利用config/save两个命令完成攻击 。 因redis无用户权限限制,建议危险的命令,使用rename配置项进行禁用或重命名,这样外部不了解重命名规则攻击者,就不能执行这类命令。
以下示例:redis.config文件禁用FLUSHDB、FLUSHALL两个命令;重命名CONFIG、SHUTDOWN命令,
添加一个特殊的后缀。 这样redis启动后,只能运行CONFIG_b9fc8327c4dee7命令,不能执行CONFIG命令。
- # It is also possible to completely kill a command by renaming it into
- # an empty string:
- #
- rename-command CONFIG CONFIG_b9fc8327c4dee7
- rename-command SHUTDOWN SHUTDOWN_b9fc8327c4dee7
- rename-command FLUSHDB "" #禁用此命令
- rename-command FLUSHALL "" #禁用此命令
配置redis仅监听在本地地址
redis.conf配置文件:
bind 127.0.0.1 192.168.13.12
通常我都设置为bind 0.0.0.0,允许远程连接,但这是不安全的。修改后重启redis服务。
修改默认6379端口
redis.conf配置文件:
port 6666
默认端口为6379。
信任的内网运行,尽量避免有公网访问
redis自身只有一个密码控制访问,不能设置用户权限和IP限制。理论把redis运行在一个信任的网络环境中
其它
1. 监控redis安全状态,cmdstat_auth cmdstat_flushdb/flushall监控报警。
2. Redis设计旨在提供高性能的KV服务,至少目前在权限访问控制和数据持久化方面比较弱化。所以禁止在Redis中存储或缓存敏感的明文数据。
3. 针对之前Redis版本,默认无bind和密码设置存在很大安全风险;Redis3.2版本提出新特性protected mode(保护模式)。
如果Redis在启动时,未开启bind和密码设置功能,只能通过回环地址本地访问,如果尝试远程访问redis,会提示以下错误:
- DENIED Redis is running protected mode because protected mode is enabled,
- no bind address was specified, no authentication password is requested to clients.
- In this mode connections are only accepted from the loopback interface.
当然也可直接执行CONFIG SET protected-mode no,关闭保护模式。
4. redis cluster不支持密码。
redis相关命令
可执行文件 | 作用 |
redis-server | 启动redis |
redis-cli | redis命令行工具 |
redis-benchmark | 基准测试工具 |
redis-check-aof | AOF持久化文件检测工具和修复工具 |
redis-check-dump | RDB持久化文件检测工具和修复工具 |
redis-sentinel | 启动redis-sentinel |
最常用到的是redis-cli
redis-cli -help 查看参数
远程连接
- redis-cli -h HOST -p PORT -a Password
- 如:
- redis-cli -h 127.0.0.1 -p -a test123
执行命令
- redis-cli -h HOST -p PORT COMMAND
- 如:
- $redis-cli -h 127.0.0.1-p get hello
- "world"
关于命令这篇总结的比较好:https://www.cnblogs.com/kongzhongqijing/p/6867960.html
redis访问安全加固的更多相关文章
- Redis缓存数据库安全加固指导(一)
背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一 ...
- 使用kendynet构建异步redis访问服务
使用kendynet构建异步redis访问服务 最近开始在kendynet上开发手游服务端,游戏类型是生存挑战类的,要存储的数据结构和类型都比较简单,于是选择了用redis做存储,数据类型使用stri ...
- Redis缓存数据库安全加固指导(二)
背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一 ...
- hystrix完成对redis访问的资源隔离
相对来说,考虑的比较完善的一套方案,分为事前,事中,事后三个层次去思考怎么来应对缓存雪崩的场景 1.事前解决方案 发生缓存雪崩之前,事情之前,怎么去避免redis彻底挂掉 redis本身的高可用性,复 ...
- 关于 Redis 访问安全性的问题
升级版本 3.0.2 版本升级到 redis-3.2.0 版本远程无法访问,比较配置文件有些变化,比如默认只能本地的机器才能访问 3.0.2 版本 # By default Redis listens ...
- nginx lua redis 访问频率限制(转)
1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的 ...
- 优雅的处理Redis访问超时
很长一段时间以来,一直在项目中使用Redis作为辅助存储,确切来说是利用Redis的内存存储,而不是将其作为缓存.比如常见的利用Set集合来判断某个数值是否存在,或者将来自不同请求的数据放在Redis ...
- SpringBoot入门 (七) Redis访问操作
本文记录学习在SpringBoot中使用Redis. 一 什么是Redis Redis 是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与 多种 ...
- 5.C#编写Redis访问类
那么通过前面几篇博文,服务端的安装和配置应该没什么问题了,接下来的问题是如何通过代码来访问Redis. 这里我们使用的库为: StackExchange.Redis GitHub:https://gi ...
随机推荐
- 老牌阅读器nook2刷机整理
kindle肯定是现在大多数人了解电纸书这个产品的开端,也给我留下了一段美好的回忆,不折腾,不死机,官方书城让人省心不少,不过作为半个折腾爱好者,kindle显然不符合我的理念,遂慢慢入了安卓电纸书的 ...
- Tomcat通过Redis实现session共享的完整部署记录
对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...
- 变量 var &函数new
声明变量 变量:变量是存储信息的容器,创建变量通常称为"声明"变量 变量必须以字母开头(小驼峰式myName): 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做): 变量名 ...
- 《Linux内核分析》第六周笔记 进程的描述和进程的创建
进程的描述和进程的创建 一.进程的描述 1.进程描述符task_struct数据结构(一) 操作系统的三大功能:进程管理(核心).内存管理.文件系统. 进程控制块PCB——task_struct(进程 ...
- LINUX内核设计第五周——扒开系统调用的三层皮(下)
- Post Tuned Hashing,PTH
[ACM 2018] Post Tuned Hashing_A New Approach to Indexing High-dimensional Data [paper] [code] Zhendo ...
- 百度AI--自然语言处理之Java开发
参数: public class APIConstants { //设置APPID/AK/SK public static final String APP_ID = "108***&quo ...
- ubuntu安装steam
增加第三方自由库的软件支持 sudo add-apt-repository multiverse 增加更新支持包 sudo add-apt-repository multiverse 安装steam ...
- spring cloud实战与思考(四) JWT之Token主动失效
需求: JWT泄露.密码重置等场景下,需要将未过期但是已经不安全的JWT主动失效. 本文不再复述JWT的基础知识,不了解的小伙伴可以自行Google一下.这里主要是针对以上需求聊一聊解决方案.如果服务 ...
- AtCoder Beginner Contest 118 解题报告
A - B +/- A #include <bits/stdc++.h> int main() { int a, b; std::cin >> a >> b; b ...