介绍
Redis 是一个内存、NoSQL、关键值缓存和存储,也可以继续存储到磁盘上。
本教程展示了如何为 Redis 服务器实施基本的安全性。
但是,请记住,Redis是专为可信客户在可信环境中使用而设计的,没有强大的安全功能。
Redis 是专为可信客户端在可信环境中访问而设计的,这意味着通常不建议将 Redis 实例直接暴露在互联网上,或者一般来说,在一个不受信任客户端可以直接访问 Redis TCP 端口或 UNIX 接口的环境中。
`......。
总的来说,Redis不是为了最大程度的安全而优化的,而是为了最大程度的性能和简单性。
没有安全性的性能和简单性是灾难的食谱,即使是Redis所拥有的少数安全功能,也不是什么好吃的,其中包括:一个基本的未加密密码,命令重命名和禁用,它缺乏真正的访问控制系统。
但是,配置现有安全功能仍然是将数据库保留不安全的一大步。
在本教程中,您将阅读如何配置 Redis 所拥有的少数安全功能,以及一些其他系统安全功能,这些功能将增强 Ubuntu 14.04 上独立的 Redis 安装的安全姿势。
请注意,本指南不涉及 Redis 服务器和客户端应用程序位于不同的主机或不同数据中心的情况。 安装 Redis 流量必须通过不安全或不受信任的网络需要完全不同的配置,例如在 Redis 机器之间设置 SSL 代理或 VPN,除了这里提供的配置。
前提条件
对于这个教程,你将需要:
- 一个 Ubuntu 14.04 服务器添加了 sudo 用户,从 初始服务器设置
- iptables 配置使用 这个 iptables 指南,通过 (可选)更新名称服务器步骤(如果你不做名称服务器配置部分,APT 不会工作)。
步骤 1 – 检查 Redis 是否正在运行
首先,使用 SSH 登录您的服务器:
1ssh username@server-ip-address
要检查 Redis 是否在工作,请使用 Redis 命令行. redis-cli
命令用于访问 Redis 命令行。
1redis-cli
<$>[注]
如果您已经为 Redis 设置了密码,则必须在连接后删除
。
1auth your_redis_password
1[label Output]
2OK
美元
测试数据库服务器:
1ping
答案:
1[label Output]
2PONG
出口:
1quit
步骤 2 – 使用 iptables 保护服务器
如果您遵循了iptables的先决条件,请放心跳过此步骤。
Redis只是在您的服务器上运行的应用程序,因为它没有真正的安全功能,所以真正保护它的第一步是首先保护它正在运行的服务器。
在您的 Ubuntu 14.04 服务器等面向公众的服务器的情况下,根据 这个 iptables 指南提供的防火墙配置是第一个步骤。
如果您使用该指南实施了防火墙规则,那么您不需要为 Redis 添加额外的规则,因为默认情况下,除非明确允许,否则所有流量都将被丢弃。
如果您需要专门允许 Redis 的 IP 地址,您可以检查 Redis 正在收听的 IP 地址,以及通过抓住
命令netstat
的输出连接到哪个端口。
1sudo netstat -plunt | grep -i redis
1[label Output]
2tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 8562/redis-server 1
请确保您的防火墙政策允许此 IP 地址. 有关如何添加规则的更多信息,请参阅此 iptables 基本文章。
步骤 3 – 绑定到 localhost
默认情况下,Redis服务器只能从 localhost访问,但是,如果您遵循了设置Redis主服务器的教程,则您更新了配置文件,以允许从任何地方连接。
打开 Redis 配置文件以编辑:
1sudo nano /etc/redis/redis.conf
查找此行,并确保它没有评论(如果有的话,删除#
字符):
1[label /etc/redis/redis.conf]
2bind 127.0.0.1
我们将继续使用此文件,所以暂时保持开放。
步骤 4 – 配置 Redis 密码
如果您使用 如何在 Ubuntu 14.04 上配置 Redis 集群文章安装了 Redis,您应该为其配置密码。
配置 Redis 密码允许其内置的两个安全功能之一 - 命令auth
,该命令需要客户端进行身份验证才能访问数据库。
滚动到安全
部分,并寻找评论的指令,该指令写道:
1[label /etc/redis/redis.conf]
2# requirepass foobared
删除#
并将foobared
更改为非常强大且非常长的值。
相反,你可以使用一个工具,如apg
或pwgen
来生成一个密码,如果你不想安装一个应用程序来生成一个密码,你可以使用下面的一个线条。
1echo "digital-ocean" | sha256sum
你的输出应该看起来像:
1[label Output]
2960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
虽然生成的密码不会发音,但它会给你一个非常强大和非常长的密码,这正是Redis所需的密码类型。
1[label /etc/redis/redis.conf]
2requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
如果您喜欢更短的密码,请使用下面命令的输出代替。
1echo "digital-ocean" | sha1sum
这一次你会得到一些更短的输出:
1[label Output]
210d9a99851a411cdae8c3fa09d7290df192441a9
设置密码后,保存文件,并重新启动 Redis:
1sudo service redis-server restart
要测试密码是否有效,请访问 Redis 命令行:
1redis-cli
下面的输出显示了用于测试 Redis 密码是否有效的命令序列。
1set key1 10
这不会起作用,所以Redis返回错误。
1[label Output]
2(error) NOAUTH Authentication required.
第二个命令使用 Redis 配置文件中指定的密码进行身份验证。
1auth your_redis_password
雷锋承认了。
1[label Output]
2OK
此后,重启前一命令成功。
1set key1 10
1[label Output]
2OK
'get key1' 查询 Redis 对新密钥的值。
1get key1
1[label Output]
2"10"
最后一个命令输出redis-cli
。你也可以使用exit
:
1quit
接下来,我们将看看Redis命令的重命名。
步骤5 – 重命名危险命令
Redis 内置的其他安全功能允许您更名或完全禁用被认为是危险的某些命令。
当未经授权的用户运行时,这些命令可以用于重新配置,破坏或以其他方式删除您的数据. 与身份验证密码一样,重命名或禁用命令在 /etc/redis/redis.conf
文件的同一安全性
部分配置。
一些已知为危险的命令包括: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME和 DEBUG。
您是否禁用或更名命令是特定于网站的。如果您知道您永远不会使用可以滥用的命令,则可以禁用命令。
若要启用或禁用 Redis 命令,请再打开配置文件进行编辑一次:
1sudo nano /etc/redis/redis.conf
您应该选择禁用或重命名对您有意义的命令。**您可以自己检查命令并确定它们如何被滥用在 redis.io/commands。
若要禁用或杀死命令,只需将命名为空串,如下所示:
1[label /etc/redis/redis.conf]
2# It is also possible to completely kill a command by renaming it into
3# an empty string:
4#
5rename-command FLUSHDB ""
6rename-command FLUSHALL ""
7rename-command DEBUG ""
要重新命名命令,请给命令另一个名字,如下示例所示。 命令重命名应该是别人难以猜测的,但你容易记住的。
1[label /etc/redis/redis.conf]
2rename-command CONFIG ""
3rename-command SHUTDOWN SHUTDOWN_MENOT
4rename-command CONFIG ASC12_CONFIG
保存你的变化
重命名命令后,通过重新启动 Redis 来应用更改:
1sudo service redis-server restart
要测试新命令,请输入 Redis 命令行:
1redis-cli
然后,假设您将命令 CONFIG重命名为 ASC12_CONFIG,以下输出将显示如何测试新命令是否已应用。
经过验证后:
1auth your_redis_password
1[label Output]
2OK
第一次尝试使用config
命令应该失败,因为它已经更名。
1config get requirepass
1[label Output]
2(error) ERR unknown command 'config'
调用重命名命令应该是成功的(它是案例不敏感):
1asc12_config get requirepass
1[label Output]
21) "requirepass"
32) "your_redis_password"
最后,你可以离开redis-cli
:
1exit
注意: 如果您已经使用 Redis 命令行,然后重新启动 Redis,则需要重新验证。
1[label Output]
2NOAUTH Authentication required.
<$>[警告]
至于重命名命令,在 /etc/redis/redis.conf 的
安全`部分末尾有一个警告声明,该声明说:
请注意,更改登录到 AOF 文件或发送给奴隶的命令的名称可能会导致问题。
这意味着,如果命令不是在AOF文件中,或者如果它是,但AOF文件没有被传送给奴隶,那么应该没有问题。
因此,当你试图更名命令时,请记住这一点:更名命令的最佳时间是当你不使用AOF坚持时,或者安装后不久,即在你的使用Redis的应用程序部署之前。
当您使用 AOF 并处理主奴隶安装时,请从该项目的 GitHub 问题页面中考虑这个答案。
命令登录到 AOF,并以相同的方式复制到奴隶,所以如果您尝试在没有相同更名的实例上重播 AOF,您可能会面临不一致,因为命令不能执行(对奴隶来说也是如此)。
因此,在这种情况下,处理重命名的最佳方法是确保重命名命令应用于主奴隶安装中的所有实例。
步骤 6 — 设置数据目录所有权和文件权限
在此步骤中,我们将考虑一些所有权和权限的更改,您可以改进您的 Redis 安装的安全配置文件. 这包括确保只有需要访问 Redis 的用户才有读取数据的权限。
您可以通过在其母目录的长列表中对 Redis 数据目录进行抓取
来验证这一点。
1ls -l /var/lib | grep redis
1[label Output]
2drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
您可以看到,Redis数据目录是由 redis用户所有,并授予对 redis组的次要访问权限。
不存在的部分是文件夹的权限,即755. 若要确保只有 Redis 用户可以访问文件夹及其内容,请将权限更改为700:
1sudo chmod 700 /var/lib/redis
您应该更改的另一个权限是 Redis 配置文件的权限. 默认情况下,它具有 644 文件权限,由 root拥有,由 root 组拥有次要权限:
1ls -l /etc/redis/redis.conf
1[label Output]
2-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis/redis.conf
该权限(644)是世界可读的,这不是一个好主意,因为它包含在步骤 4 中配置的未加密密码。
我们需要更改所有权和权限,理想情况下,它应该由 redis 用户拥有,由 root 用户拥有次要所有权。
1sudo chown redis:root /etc/redis/redis.conf
然后更改所有权,以便只有文件的所有者才能阅读和 / 或写入它:
1sudo chmod 600 /etc/redis/redis.conf
您可以通过以下方式验证新的所有权和权限:
1ls -l /etc/redis/redis.conf
1[label Output]
2total 40
3-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf
最后,重新启动 Redis:
1sudo service redis-server restart
结论
请记住,一旦有人登录到您的服务器,它是非常容易绕过我们已经设置的Redis特定的安全功能。
这应该是你的防火墙。
要将您的服务器安全提升到下一个水平,您可以配置入侵检测系统,如 OSSEC. 要在 Ubuntu 14.04 上配置 OSSEC,请参阅 这个 OSSEC 指南。
如果您试图通过不受信任的网络保护 Redis 通信,则需要使用 SSL 代理,正如 Redis 开发人员在 官方 Redis 安全指南中建议的那样。
但是,你可以自己检查这个,并确定它们如何被滥用在 redis.io/commands。