如何在Ubuntu 18.04上安装Redis和进行安全配置

介绍

Redis是一个内存键值存储系统,以其灵活性,高性能和多语言支持而闻名。本篇内容演示如何在Ubuntu 18.04服务器上安装和配置Redis,以及如何进行安全配置。

如何在Ubuntu 18.04上安装Redis和进行安全配置
Ubuntu 18.04上安装Redis和进行安全配置

基础环境

本教程基于Ubuntu 18.04服务器环境,并配置了基本防火墙设置,由有sudo权限的非root用户操作完成。

首先,以sudo用户身份登录到Ubuntu 18.04服务器,然后继续。

第1步—安装和配置Redis

为了获得最新版本的Redis,我们将使用apt从官方Ubuntu存储库来安装Redis。

apt通过输入以下命令更新本地程序包缓存并安装Redis:

sudo apt update
sudo apt install redis-server

执行后,将下载并安装Redis及其依赖项。

使用您喜欢的文本编辑器编辑文件:

sudo nano /etc/redis/redis.conf

打开文件后,找到supervised项。该指令声明初始化系统,来将Redis作为服务进行管理,获得对其操作的更多控制权限。该supervised指令默认设置为no,请将其更改为systemd

/etc/redis/redis.conf

. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .

这是目前唯一需要对Redis配置文件进行的更改,完成后保存并关闭。然后,重新启动Redis服务使配置生效:

sudo systemctl restart redis.service

这样,就已经完成了安装和配置Redis。

第2步-测试Redis

首先检查Redis服务的运行状态:

sudo systemctl status redis

如果Redis在正常运行,则会输出类似于以下内容:

Output● redis-server.service - Advanced key-value store
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-06-27 18:48:52 UTC; 12s ago
     Docs: http://redis.io/documentation,
           man:redis-server(1)
  Process: 2421 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 2424 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
 Main PID: 2445 (redis-server)
    Tasks: 4 (limit: 4704)
   CGroup: /system.slice/redis-server.service
           └─2445 /usr/bin/redis-server 127.0.0.1:6379
. . .

在这里,可以看到Redis正在运行并且已经启用,这意味着它被设置为在服务器启动时自动启动。

注意:对于Redis的许多常见用例,此设置是理想的。但是,如果希望每次服务器启动时都手动启动Redis,则可以使用以下命令进行配置:

sudo systemctl disable redis

要测试Redis是否正常运行,请使用如下命令行客户端连接到服务器:

redis-cli

在随后的提示中,使用以下ping命令测试连接性:

127.0.0.1 : 6379 > ping
Output
PONG

此输出确认服务器连接仍然有效。接下来,运行以下命令检查您是否可以设置密钥:

127.0.0.1 : 6379 >set test "It's working!"
Output
OK

通过键入以下内容来检索值:

127.0.0.1:6379 > get test

如果一切正常,将能够检索存储的值:

Output
"It's working!"

在确认可以获取该值之后,退出Redis提示符以返回到Shell:

127.0.0.1:6379 > exit

重启Redis,检查一下是否正常:

sudo systemctl restart redis

然后,再次与命令行客户端连接,确认测试值仍然可用:

redis-cli
127.0.0.1:6379 > get test

密钥值仍应可访问:

Output
"It's working!"

完成后退出:

127.0.0.1:6379 > exit

这样,您的Redis安装就可以完全运行并且可以使用了。但是,其某些默认配置设置是不安全的,并为恶意行为者提供了攻击和获得对服务器及其数据的访问的机会。本教程的其余步骤介绍了Redis官方网站所规定的缓解这些漏洞的方法。尽管这些步骤是可选的,并且如果您选择不遵循这些步骤,则Redis仍将起作用,但强烈建议您完成这些步骤,以增强系统的安全性。

第3步-绑定到本地主机

默认情况下,只能从localhost访问Redis 。但是很多人可能将其设置为可以远程访问,但是这样不如绑定到localhost更安全。

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

sudo nano /etc/redis/redis.conf

找到此行,并确保其未注释(删除#,如果存在):

/etc/redis/redis.conf

bind 127.0.0.1 ::1

保存并关闭(按CTRL + XY,然后ENTER)。

然后,保存重启后生效:

sudo systemctl restart redis

检查更改是否已生效,运行以下netstat命令:

sudo netstat -lnp | grep redis
Outputtcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      14222/redis-server  
tcp6       0      0 ::1:6379                :::*                    LISTEN      14222/redis-server  

此输出显示,该redis-server程序已绑定到localhost127.0.0.1),说明更改已经生效。如果您在该列中看到另一个IP地址(例如,0.0.0.0),则应再次检查是否取消注释正确的行,然后再次重新启动Redis服务。

现在,Redis仅在localhost进行侦听。但是,Redis当前并未设置身份验证,接下来我们进行相关的设置。

步骤4 —配置Redis密码

配置Redis密码可启用其两个内置安全功能之一-该auth命令,该命令要求客户端进行身份验证才能访问数据库。密码直接在Redis的配置文件/etc/redis/redis.conf中进行配置,再次编辑该文件:

sudo nano /etc/redis/redis.conf

定位到SECURITY部分,然后查找带有以下注释的指令:

/etc/redis/redis.conf

# requirepass foobared

取消注释#,然后把foobared改为想要的密码。

注意:redis.conf文件中requirepass指令的上方,有一条注释警告:

# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#

要设置一个足够长,足够复杂的密码。可以使用openssl命令生成一个随机的密码,如以下示例所示:

openssl rand 60 | openssl base64 -A

输出应类似于:

Output
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

将命令的输出复制并粘贴为的新值后requirepass,它应显示为:

/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

sudo systemctl restart redis.service

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

redis-cli

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

set key1 10

由于您未进行身份验证,因此无法正常工作,因此Redis返回错误:

Output(error) NOAUTH Authentication required.

下一条命令使用Redis配置文件中指定的密码进行身份验证:

auth your_redis_password

Redis承认:

OutputOK

之后,再次运行前面的命令将成功:

set key1 1
Output
OK

get key1 向Redis查询新密钥的值。

get key1
Output
"10"

验证之后,退出redis-cli

quit

接下来,我们将研究重命名Redis命令,如果错误或由恶意参与者输入Redis命令,可能会严重损坏您的计算机。

第5步-重命名危险命令

Redis另外需要进行的安全配置,就是重命名或完全禁用某些存在风险的命令。

这些存在风险的命令可用于重新配置,破坏或擦除网站上的数据。重命名命令同样在/etc/redis/redis.conf文件中进行配置。

存在风险的命令包括:FLUSHDBFLUSHALLKEYSPEXPIREDELCONFIGSHUTDOWNBGREWRITEAOFBGSAVESAVESPOPSREMRENAMEDEBUG。存在风险的命令不止于以上这些,但是如果我们重命名或禁用了上述的这些命令,已经能够很好地增强Redis服务器的安全性了。

是否应该禁用或重命名命令取决于您自己以及站点的特定的需求,如果你认为永远也不会用到这些命令,那么就禁用他们,否则就重命名他们。

再次编辑/etc/redis/redis.conf文件:

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 systemctl restart redis.service

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

redis-cli

然后,验证:

127.0.0.1:6379 > auth your_redis_password
Output
OK

假设像前面的示例所示一样将CONFIG命令重命名ASC12_CONFIG。首先,我们尝试使用原始的CONFIG命令。因为我们已经将其重命名,所以它应该是无效的:

127.0.0.1:6379 > config get requirepass
Output
(error) ERR unknown command 'config'

再次,我们尝试使用我们重命名后的命令(不区分大小写):

127.0.0.1:6379 > asc12_config get requirepass
Output
1) "requirepass"
2) "your_redis_password"

最后,退出redis-cli

127.0.0.1:6379 > exit

请注意,如果您已经在使用Redis命令行,在重新启动Redis后,需要重新进行身份验证。否则,如果键入命令,则会出现此错误:

Output
NOAUTH Authentication required.

关于重命名命令的做法,/etc/redis/redis.conf文件SECURITY节末尾有一条警告性声明,内容为:

/etc/redis/redis.conf

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

注意: Redis项目选择使用“主”和“从”这两个术语,而本站通常更喜欢使用“主要”和“次要”替代方案。为了避免混淆,我们选择在此处使用Redis文档中使用的术语。

这意味着,如果重命名的命令不在AOF文件中,或者如果该重命名的命令尚未将AOF文件传输到从属设备,则应该没有问题。

因此,在尝试重命名命令时,请记住这一点。重命名命令的最佳时间是在不使用AOF持久性时,或者在安装后即刚部署使用Redis的应用程序之前。

当您使用AOF并处理主从安装时,请从项目的GitHub问题页面中考虑此答案。以下是对作者问题的答复:

命令将被记录到AOF并以与发送命令相同的方式复制到从属设备,因此,如果您尝试在没有相同重命名的实例上重播AOF,则可能会遇到不一致的情况,因为命令无法执行(奴隶也一样)

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

结论

在本教程中,您已经安装并配置了Redis,验证了Redis安装是否正常运行,并使用其内置的安全功能使其较不容易受到恶意行为者的攻击。

请记住,一旦有人登录到您的服务器,就很容易规避我们已部署的Redis特定的安全功能。因此,Redis服务器上最重要的安全功能是防火墙(如果您遵循必备的《初始服务器设置》教程,则需要配置防火墙),因为这使恶意行为者很难越过这一障碍。

原创文章,作者:牛奇网,如若转载,请注明出处:https://www.niuqi360.com/lamp-config/ubuntu-18-04-redis/

发表评论

登录后才能评论