本博客地址:https://security.blog.csdn.net/article/details/130692909
一、为Redis启用密码验证
默认情况下,Redis不执行任何密码身份验证。能够通过IP端口连接Redis的客户端均可以直接访问Redis中的数据。在启动Redis服务时,通过设置requirepass为true来打开身份验证。启用身份验证后,Redis将拒绝未经身份验证的客户端的查询。客户端需要通过发送AUTH命令和密码来对自己进行身份验证。
在云原生平台下,将密码信息保存为Kubernetes的Secrets资源,然后在redis deployment声明文件中引用。
创建Redis Secret的示例yaml描述文件:
apiVersion: v1
kind: Secret
metadata:
name:redisresecret
type: Opaque
data:
requirepass: * * * * * * * * * *
在创建Redis Pod时,指定引用Secrets:
volumes:
- name: config
secret:
secretName:redisresecret
此时再访问Redis,就会提示限制登录
二、限制允许访问Redis服务的Pod和IP
通常情况下,Redis服务仅作为业务应用内部使用的一个缓存服务,只需要对集群内部使用这个Redis服务的业务容器开放,对大部分其他的Pod不需要开放,尤其在大部分情况下都不能通过集群nodeport或弹性IP的方式对外部网络开放。在云原生平台下,需要对Redis配置专门的网络策略,限制只允许指定标签的Pod访问。
Network Policy的配置方法:
apiVersion: networking,k8s.io/v1
kind: NetworkPolicy
medata:
# 定义网络策略名
name: redisdb-networkpolicy
namespace: default
spec:
# 通过标签选择Redis Pod
podSelector:
matchLabels:
role: redisdb
# 策略类型为Ingress和Egress两个方向
policyTypes:
- Ingress
- Egress
ingress:
- from:
# 只有符合cidr段定义、namespace定义、Pod labels过滤的Pod才能访问Redis服务
- ipBlock:
cidr: 172.17.0.0/16
expect:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
# 对Redis的端口6379做ingress方向的访问限制
ports:
- protocol: TCP
port: 6379
egress:
# 配置redis服务在出口方向的策略
- to:
- ipBlock:
cidr: 10.0.0.0/24
以上网络策略配置限制了能够访问Redis的Namespace、Pods以及IP段。这样就确保在一个集群内只有指定的资源能够访问Redis。此外,允许访问的Redis的Pod也要经过服务器的AUTH认证,只有认证通过的服务才允许访问Redis的接口进行数据的插入和查询,最后形成的Redis安全部署架构如图下所示:
针对Redis的安全部署有三部分安全加固。首先是Redis只对集群内部提供服务,而不将其服务IP暴露于外部网络;另外通过集群的网络策略对集群内的Redis提供一层网络访问上的隔离;最后激活Redis内部的认证机制,应用侧需提供Redis Server的访问密码,经过认证后方可接入。
除了使用网络策略外,还可以使用基于服务网格(Service Mesh)的流量管控技术,通过将流量策略配置在Pod的边车上实现类似的功能。
三、使用TLS对访问Redis的流量和数据进行加密
服务网格技术可以通过配置使Pod之间基于TLS通信,使请求从明文模式平滑过渡至双向TLS模式。对于Redis服务,就不需要在Redis Server层启动TLS模式,而直接在网络上进行配置。这种配置方式有很大的便利性和灵活性,同时还能利用服务网络的监控能力,对访问调用进行详细的审计和监控。
四、禁用特殊权限的接口
特殊权限的接口有FLUSHDB、FLUSHALL、KEYS、PEXPIRE、DEL、CONFIG、SHUTDOWN、BGREWRITEAOF、BGSAVE、SAVE、SPOP、SREM、RENAME、DEBUG和EVAL。
其中EVAL接口用于发送Lua脚本,设计之初是为了在服务器端执行输入的Lua脚本来完成复杂的数据操作。虽然Redis内部实现是在一个沙箱中运行Lua脚本,但是从安全角度来看,这个命令接口仍然是系统漏洞的温床,大部分情况下也都不需要这个功能。
DEBUG接口可以执行无效的内存访问,通常在开发阶段用于模拟错误。一旦被滥用,它可以允许攻击者执行拒绝服务攻击,使Redis崩溃。
FLUSHALL命令能够清空或删除所有数据库中存在的所有键。如果FLUSHALL命令被恶意或意外使用,则它可以清除整个服务器中所有的密钥或数据,从而导致数据丢失,尤其是针对未配置备份策略的Redis Server上的数据。
通过在redis.conf中的rename-command指令对这些命令进行更名,更改为一些不容易被猜到的名字可以防止这些命令被滥用,如果通过rename-command指令将命令改为空字符串,就代表完全禁用这个命令。
如下:
vim /etc/redis/redis.conf
--------------------------------------------------
...
rename-command CONFIG "hide_CONFIG"
rename-command flushall ""
rename-commandeval ""
...