目录

  • redis漏洞

    • 入侵特征
    • 安全隐患
  • redis安全规范
    • 禁止root用户启动
    • 限制redis文件目录访问权限
    • 开启密码认证,设置复杂密码
    • 禁用或重命名危险命令
    • 设置允许监听地址,不要使用0.0.0.0
    • 尽量修改默认端口6379
    • 信任的内网运行,尽量避免有公网访问

Redis漏洞 

 Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。

入侵特征

  1. Redis 可能执行过 FLUSHALL 方法,整个 Redis 数据库被清空
  2. 在 Redis 数据库中新建了一个名为 crackit(网上流传的命令指令) 的键值对,内容为一个 SSH 公钥。
  3. 在 /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访问安全加固的更多相关文章

  1. Redis缓存数据库安全加固指导(一)

    背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一 ...

  2. 使用kendynet构建异步redis访问服务

    使用kendynet构建异步redis访问服务 最近开始在kendynet上开发手游服务端,游戏类型是生存挑战类的,要存储的数据结构和类型都比较简单,于是选择了用redis做存储,数据类型使用stri ...

  3. Redis缓存数据库安全加固指导(二)

    背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一 ...

  4. hystrix完成对redis访问的资源隔离

    相对来说,考虑的比较完善的一套方案,分为事前,事中,事后三个层次去思考怎么来应对缓存雪崩的场景 1.事前解决方案 发生缓存雪崩之前,事情之前,怎么去避免redis彻底挂掉 redis本身的高可用性,复 ...

  5. 关于 Redis 访问安全性的问题

    升级版本 3.0.2 版本升级到 redis-3.2.0 版本远程无法访问,比较配置文件有些变化,比如默认只能本地的机器才能访问 3.0.2 版本 # By default Redis listens ...

  6. nginx lua redis 访问频率限制(转)

    1. 需求分析 Nginx来处理访问控制的方法有多种,实现的效果也有多种,访问IP段,访问内容限制,访问频率限制等. 用Nginx+Lua+Redis来做访问限制主要是考虑到高并发环境下快速访问控制的 ...

  7. 优雅的处理Redis访问超时

    很长一段时间以来,一直在项目中使用Redis作为辅助存储,确切来说是利用Redis的内存存储,而不是将其作为缓存.比如常见的利用Set集合来判断某个数值是否存在,或者将来自不同请求的数据放在Redis ...

  8. SpringBoot入门 (七) Redis访问操作

    本文记录学习在SpringBoot中使用Redis. 一 什么是Redis Redis 是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与 多种 ...

  9. 5.C#编写Redis访问类

    那么通过前面几篇博文,服务端的安装和配置应该没什么问题了,接下来的问题是如何通过代码来访问Redis. 这里我们使用的库为: StackExchange.Redis GitHub:https://gi ...

随机推荐

  1. confluence上传文件附件预览乱码问题(linux服务器安装字体操作)

    在confluence上传excel文件,预览时发现乱码问题主要是因为再上传文件的时候一般是Windows下的文件上传,而预览的时候,是linux下的环境,由于linux下没有微软字体,所以预览的时候 ...

  2. Redis常用操作-------Set(集合)

    1.SADD key member [member ...] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略. 假如 key 不存在,则创建一个 ...

  3. vs2015安装及初步试用

    Vs2015一直都听说好用,便捷.之前用vc++6.0,总感觉界面很灰,让人编程兴趣不高,恰巧借此机会,安装一下vs2015,从编译器上体验下编程的舒心,方便.希望我不会变得太懒... 首先,我下的是 ...

  4. linux第四次读书笔记

    第四章:进程调度 一.多任务 1.非抢占式多任务 进程会一直执行直到自己主动停止运行(这一步骤称为让步) 2.抢占式多任务 Linux/Unix使用的是抢占式的方式:强制的挂起进程的动作就叫做抢占.进 ...

  5. linux内核分析第二四学习报告

    学生  黎静 课程内容 计算机三大法宝 • 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: • 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那 ...

  6. Flask-论坛开发-2-Jinja2模板

    对Flask感兴趣的,可以看下这个视频教程:http://study.163.com/course/courseLearn.htm?courseId=1004091002 1. Jinja2 模板介绍 ...

  7. PAT 1033 旧键盘打字

    https://pintia.cn/problem-sets/994805260223102976/problems/994805288530460672 旧键盘上坏了几个键,于是在敲一段文字的时候, ...

  8. TCP 三次握手理解和过程

    1:TCP为什么要三次握手,不是两次四次? 2:TCP协议三次握手过程分析

  9. Linux shell 菜鸟学习笔记....

    20171123 Linux shell 基础学习笔记1. shell 的开始 一般是 #!/bin/bash 通过 #! 来唯一指定使用的shell路径 其他的 # 都表示注释.2. shell 的 ...

  10. RAID 磁盘阵列说明

    Copy From wiki RAID档次 最少硬盘 最大容错 可用容量 读取性能 写入性能 安全性 目的 应用产业 单一硬盘 (引用) 0 1 1 1 无     JBOD 1 0 n 1 1 无( ...