如何保护您的Redis安装在Ubuntu 14.04

本教程介绍了如何实现基本保障了Redis的服务器。 在本教程中,你会读到如何配置一些安全功能Redis的都有,而且将推动一个独立安装的Redis的安全状况在Ubuntu 14.04其他一些系统安全保护功能。这包括配置Redis的密码和重命名破坏性命令。

介绍

Redis是一个内存中,NoSQL,键值缓存和存储,也可以持久保存到磁盘。

本教程介绍如何实现Redis服务器的基本安全性。

但是,请记住,Redis的是专为使用由可信的客户端受信任的环境中 ,它没有自己的强大的安全功能。 为了强调这一点,这里是从报价官方网站的Redis

Redis被设计为由可信环境中的可信客户端访问。 这意味着通常将Redis实例直接暴露给互联网或者一般情况下暴露给不受信任的客户端可以直接访问Redis TCP端口或UNIX套接字的环境并不是一个好主意。

一般来说,Redis不是为了最大的安全性而优化,但是为了最大的性能和简单性。

没有安全性的性能和简单性是灾难的秘诀。 即使是几个安全功能Redis有真正没什么可笑的。 这些包括:基本的未加密密码,以及命令重命名和禁用。 它缺乏真正的访问控制系统。

但是,配置现有的安全功能仍然是从数据库不安全的一个大步骤。

在本教程中,您将了解如何配置Redis具有的几个安全功能以及一些其他系统安全功能,这些功能将提高Ubuntu 14.04上独立Redis安装的安全性。

请注意,本指南不涉及Redis服务器和客户端应用程序位于不同主机或不同数据中心中的情况。 安装在那里的Redis量已经穿越不安全或不信任的网络需要一个完全不同的配置,比如设置一个SSL代理服务器或一个的VPN Redis的机器之间,除了这里给出的那些。

先决条件

对于本教程,您需要:

  • 一个Ubuntu 14.04服务器使用sudo的用户增加,从最初的服务器设置

  • 配置使用iptables 这个iptables的指导 ,通过(可选)更新域名服务器的一步(如果你不这样做的域名服务器配置的一部分,APT将无法正常工作)。 配置Nameservers后,就完成了

  • Redis的安装,并从主唯一的安装工作,从使用说明书本Redis的指南通过第2步 ,最多-配置Redis的主

第1步 - 验证Redis是否正在运行

首先使用SSH登录到您的服务器:

ssh username@server-ip-address

要检查Redis是否正在工作,请使用Redis命令行。 redis-cli命令用于访问Redis的命令行。

redis-cli

如果你已经设置Redis的密码,你必须auth连接后。

auth your_redis_password
输出
OK

测试数据库服务器:

ping

响应:

输出
PONG

出口:

quit

第2步 - 使用iptables保护服务器

如果您遵循iptables的先决条件,请随时跳过此步骤。 或者,你现在可以做到。

Redis只是一个在您的服务器上运行的应用程序,并且因为它没有自己的真正的安全功能,真正保护它的第一步是首先保护它正在运行的服务器。

在这样你的Ubuntu 14.04服务器面向公众的服务器的情况下,配置防火墙在给出这个iptables的指南是第一步。 按照该链接,立即设置防火墙。

如果您已经使用该指南实施了防火墙规则,那么您不需要为Redis添加额外的规则,因为默认情况下,除非明确允许,否则删除所有传入的流量。 由于Redis服务器的默认独立安装仅在环回接口(127.0.0.1或localhost)上侦听,因此不应担心其默认端口上的传入流量。

如果您需要特别允许Redis的IP地址,你可以查阅一下IP地址Redis是监听,什么端口它是由必然grep -ing的输出netstat命令。 第四列- 127.0.0.1:6379在这里-指示Redis的关联的IP地址和端口组合:

sudo netstat -plunt | grep -i redis
输出
tcp   0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      8562/redis-server 1

确保您的防火墙策略中允许使用此IP地址。 有关如何添加规则的详细信息,请参阅本iptables的基础知识的文章

第3步 - 绑定到本地主机

默认情况下,Redis服务器只能从localhost访问。 但是,如果按照教程设置Redis主服务器,则您更新了配置文件以允许从任何位置进行连接。 这不像绑定到localhost那么安全。

打开Redis配置文件进行编辑:

sudo nano /etc/redis/redis.conf

找到这一行,并确保它是注释掉(删除#如果存在的话):

/etc/redis/redis.conf
bind 127.0.0.1

我们将继续使用此文件,因此现在保持打开。

第4步 - 配置Redis密码

如果使用安装Redis的如何配置在Ubuntu 14.04 Redis的一个集群的文章,您应该已经为它配置了一个密码。 根据您的判断,您可以按照此部分的规定,立即制作更安全的密码。 如果不是,本节中的说明显示如何设置数据库服务器密码。

配置Redis的密码,它带来了两项内置的安全功能之一- auth命令,它要求客户端进行身份验证来访问数据库。 密码在Redis的配置文件,直接配置/etc/redis/redis.conf ,你应该还是有从以前的步骤打开。

滚动到SECURITY部分,并寻找一个评论的指令,上面写着:

/etc/redis/redis.conf
# requirepass foobared

通过删除取消注释# ,改变foobared一个非常强大和很长的价值。

而不是弥补自己的密码,您可以使用一个工具,如apgpwgen生成之一。 如果你不想安装一个应用程序只是为了生成密码,你可以使用下面的一行。 要生成与此将生成的密码不同的密码,请更改引号中的单词。

echo "digital-ocean" | sha256sum

你的输出应该看起来像:

输出
960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

虽然生成的密码不会被发音,但它给你一个非常强大和很长的密码,这正是Redis所需的密码类型。 复制和粘贴该命令为新值的输出后requirepass ,应改为:

/etc/redis/redis.conf
requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

如果您喜欢更短的密码,请使用以下命令的输出。 再次,改变引号中的单词,因此它不会生成与这一个相同的密码:

echo "digital-ocean" | sha1sum

这次你会得到稍微短些的输出:

输出
10d9a99851a411cdae8c3fa09d7290df192441a9

设置密码后,保存文件,然后重新启动Redis:

sudo service redis-server restart

要测试密码是否有效,请访问Redis命令行:

redis-cli

以下输出显示用于测试Redis密码是否有效的命令序列。 第一个命令尝试在验证之前将密钥设置为值。

set key1 10

这将不工作,所以Redis返回一个错误。

输出
(error) NOAUTH Authentication required.

第二个命令使用Redis配置文件中指定的密码进行认证。

auth your_redis_password

Redis承认。

输出
OK

之后,重新运行上一个命令成功。

set key1 10
输出
OK

get key1查询Redis的新键的值。

get key1
输出
"10"

最后一个命令退出redis-cli 您也可以使用exit

quit

接下来,我们将看看重命名Redis命令。

第5步 - 重命名危险命令

Redis中内置的其他安全功能允许您重命名或完全禁用某些被认为危险的命令。

当由未经授权的用户运行时,此类命令可用于重新配置,销毁或以其他方式擦除数据。 像验证密码,重命名或禁用命令,在相同的配置SECURITY的部分/etc/redis/redis.conf文件。

一些被称为是危险的命令包括:FLUSHDB,FLUSHALL, 钥匙 ,PEXPIRE,DEL,CONFIG, 关机 ,BGREWRITEAOF,BGSAVE, 保存 ,SPOP,SREM, 重命名调试 这不是一个全面的列表,但重命名或禁用该列表中的所有命令是一个很好的起点。

是否禁用或重命名命令是特定于站点的。 如果你知道你永远不会使用可以被滥用的命令,那么你可以禁用它。 否则,重命名它。

要启用或禁用Redis命令,请再次打开配置文件进行编辑:

sudo nano /etc/redis/redis.conf

这些是例子。 你应该选择禁用或重命名你有意义的命令,你可以检查的命令为自己和决定如何,他们可能会被滥用redis.io/commands

要禁用或杀死命令,只需将其重命名为空字符串,如下所示:

/etc/redis/redis.conf
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

并重命名一个命令,给它另一个名称,如下面的例子。 重命名的命令应该很难让别人猜到,但很容易让你记住。 不要让自己的生活困难。

/etc/redis/redis.conf
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

保存更改。

重命名命令后,通过重新启动Redis来应用更改:

sudo service redis-server restart

要测试新命令,请输入Redis命令行:

redis-cli

然后,假设你改名CONFIG命令ASC12_CONFIG,以下输出演示如何测试新的命令得到了应用。

验证后:

auth your_redis_password
输出
OK

第一次尝试使用config命令失败,因为它已被重新命名。

config get requirepass
输出
(error) ERR unknown command 'config'

调用重命名的命令应该是成功的(不区分大小写):

asc12_config get requirepass
输出
1) "requirepass"
2) "your_redis_password"

最后,你可以从退出redis-cli

exit

注意:如果您已经在使用Redis命令行,然后重新启动Redis,您需要重新验证。 否则,如果键入命令,您将收到此错误:

输出
NOAUTH Authentication required.

对于重命名命令,有在末尾的警戒性声明SECURITY/etc/redis/redis.conf其内容如下:

Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.

这意味着如果重命名的命令不在AOF文件中,或者如果它是但是AOF文件没有被传送到从属,那么应该没有问题。

所以,当你试图重命名命令时,记住这一点。 重命名命令的最佳时间是在不使用AOF持久性时,或者在安装后,即在部署Redis-use应用程序之前。

当你使用AOF和处理主从安装时,从项目的GitHub问题页面考虑这个答案。 以下是对作者问题的回复:

这些命令被记录到AOF并以与发送它们相同的方式复制到从属设备,因此如果您尝试在不具有相同重命名的实例上重播AOF,则可能会遇到不一致,因为命令无法执行同样为Minion)。

因此,在这种情况下,处理重命名的最好方法是确保重命名的命令应用于主从安装中的所有实例。

第6步 - 设置数据目录所有权和文件权限

在此步骤中,我们将考虑几个所有权和权限更改,以改进Redis安装的安全配置文件。 这涉及确保只有需要访问Redis的用户才有读取其数据的权限。 该用户,默认情况下,Redis的用户。

您可以验证这一点grep -ing在其父目录的长列表Redis的数据目录。 命令及其输出如下。

ls -l /var/lib | grep redis
输出
drwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

你可以看到,Redis的数据目录由Redis的用户所拥有的,次要的访问授予Redis的组。 那部分是好的。

不是的部分是文件夹的权限,即755.要确保只有Redis用户可以访问文件夹及其内容,请将权限更改为700:

sudo chmod 700 /var/lib/redis

您应该更改的其他权限是Redis配置文件的权限。 默认情况下,它有644文件权限,是由root用户所有,由组二次所有权:

ls -l /etc/redis/redis.conf
输出
-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis/redis.conf

该权限(644)是世界可读的,这不是一个好主意,因为它包含在第4步中配置的未加密的密码。

我们需要更改所有权和权限。 理想情况下,应该由Redis的用户所拥有,由root用户二次所有权。 为此,请运行以下命令:

sudo chown redis:root /etc/redis/redis.conf

然后更改所有权,以便只有文件的所有者可以读取和/或写入:

sudo chmod 600 /etc/redis/redis.conf

您可以使用以下方式验证新的所有权和权限:

ls -l /etc/redis/redis.conf
输出
total 40
-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf

最后,重启Redis:

sudo service redis-server restart

结论

请记住,一旦有人登录到您的服务器,很容易绕过我们已经实施的Redis特定的安全功能。 因此,最重要的安全功能是使它极难跳跃的围栏。

这应该是你的防火墙。

要将您的服务器安全性提升到一个新的水平,您可以配置入侵检测系统,如OSSEC。 在Ubuntu 14.04配置OSSEC,请参阅本OSSEC指南

如果你试图跨越不受信任的网络安全Redis的通信,你必须使用一个SSL代理,如Redis的开发商中特别建议官方Redis的安全指南 设置SSL代理以保护Redis通信是一个单独的主题。

我们没有在重命名部分中包括完整的Redis命令列表。 但是,您可以检查自己这一点,并决定如何,他们可能会被滥用redis.io/commands