给你的数据库加一道缓存:Redis入门教程

介绍

Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。 本教程将会教你如何在Ubuntu 18.04 上安装、配置Redis,并且给Redis添加防护。

准备

一台已经设置一个可以使用sudo命令的非root账户的Ubuntu 18.04的服务器,并且服务器已经开启了防火墙。

连接上服务器后,就可以开始本教程咯。没有服务器的同学可以在这个页面购买,或免费试用腾讯云开发者实验室体验 Ubuntu 系统 CVM

第一步、安装和配置Redis

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

不论是在装什么软件,最好都需要先更新一下本地的软件包,更新完,我们再安装Redis:

sudo apt update
sudo apt install redis-server

这将下载并安装Redis及其依赖项。在此之后,我们要在Redis配置文件中将进行一项重要的配置更改,配置文件是在安装期间自动生成的。

使用nano或者其他你喜欢的文本编辑器打开配置文件:

sudo nano /etc/redis/redis.conf

在文件中,找到supervised指令。可以通过upstart和systemd管理Redis守护进程,这个参数是和具体的操作系统相关的。 supervised默认设置为no。由于你运行的是使用init系统的Ubuntu,因此将其更改为systemd

. . .
​
# 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 reload redis.service

有了这个,你已经安装并配置了Redis,它正在你的机器上运行。

第二步、测试Redis

不论是之前就安装过的,还是新安装的软件,要对它们进行和修改之前,我们都要检测这个软件是不是在运行状态中。我们通过一些方法来检查Redis是否正常工作。

首先检查Redis服务是否正在运行:

sudo systemctl status redis

如果它正在运行而没有任何错误,则此命令将生成类似于以下内容的输出:

● 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
PONG

此输出确认服务器连接仍处于活动状态。接下来,运行下面这行命令,来检查你是否能设置key

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

输入以下内容:

127.0.0.1:6379> get test

假设一切正常,你就能看到以下输出:

"It's working!"

确认你可以获取值后,输入exit,返回到shell:

127.0.0.1:6379> exit

作为最终测试,我们将检查Redis是否能够在被停止或重新启动后保留数据。要执行此操作,请首先重新启动Redis实例:

sudo systemctl restart redis

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

redis-cli
127.0.0.1:6379> get test

你的key值仍应可访问:

"It's working!"

完成后再次退出,返回shell:

127.0.0.1:6379> exit

这样,你的Redis安装即可完全运行,随时可使用。但是,它的某些默认配置设置不安全,并为恶意攻击者提供攻击和访问服务器及其数据的机会。本教程中的其余步骤涵盖了减轻这些漏洞的方法,正如Redis官方网站所规定的那样。虽然这些步骤是可选的,如果你选择不遵循它们,Redis仍然可以运行,强烈建议你完成它们以加强系统的安全性。

第三步、绑定到localhost

默认情况下,只能从localhost访问Redis 。但是,如果你按照其他教程来安装和配置Redis,则可能已经更新配置文件,允许来自任何位置的连接。我们还是建议绑定到localhost那样比较安全。

请打开Redis配置文件:

sudo nano /etc/redis/redis.conf

/etc/redis/redis.conf找到此行,确保它已取消注释(如果看到#就删掉,这样就是取消注释):

bind 127.0.0.1 ::1

保存并完成后关闭文件(按CTRL + X,再输入Y,再按ENTER)。

然后,重新启动Redis服务:

sudo systemctl restart redis

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

sudo netstat -lnp | grep redis
tcp        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当前未设置为要求用户在更改其配置或其所拥有的数据之前进行身份验证。为了解决这个问题,Redis允许你在通过Redis客户端(redis-cli)进行更改之前要求用户使用密码进行身份验证

第四步、配置Redis密码

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

sudo nano /etc/redis/redis.conf

/etc/redis/redis.conf 中先找到SECURITY部分,再找到下面这行:

# requirepass foobared

删除#,把foobared替换成你想要设置的密码。

注意:redis.conf文件中的requirepass指令上方,有一个注释警告: #一定要使用一个复杂度高的安全密码 #黑客可以以每秒150K个密码来强行破解进入你的Redis,然后进行更改! 因此,设置一个非常强大且非常长的值作为密码是非常重要的。你可以使用openssl命令生成随机密码,而不是自己编写密码,运行下面这个命令就会生成一个非常复杂的密码: openssl rand 60 | openssl base64 -A 然后就会得到类似下面的输出: Output RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE 把生成的密码粘贴在requirepass后面: requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

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

sudo systemctl restart redis.service

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

redis-cli

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

127.0.0.1:6379> set key1 10

这不会起作用,因为你没有进行身份验证,因此Redis返回错误:

(error) NOAUTH Authentication required.

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

127.0.0.1:6379> auth your_redis_password

Redis返回:

OK

之后,再次运行上一个命令:

set key1 10
OK

get key1 查询Redis以获取新密钥的值。

get key1
"10"

确认好没问题后,你可以退出redis-cli

quit

接下来,我们将重命名部分Redis命令,因为如果错误输入或者黑客输入这些命令,可能会对你的计算机造成严重损害。

第五步、重命名危险命令

Redis内置的其他安全功能涉及重命名或完全禁用某些被视为危险的命令。

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

一些被认为是危险的命令包括:FLUSHDBFLUSHALLKEYSPEXPIREDELCONFIGSHUTDOWNBGREWRITEAOFBGSAVESAVESPOPSREMRENAMEDEBUG。这不是一个全面的列表,但重命名或禁用列表中的所有命令是可以增强Redis服务器安全性的。

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

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

sudo nano  /etc/redis/redis.conf

警告:以下显示如何禁用和重命名命令的步骤是示例。你应只选择禁用或重命名对你有意义的命令。你可以自己查看完整的命令列表,并确定在redis.io/commands中如何使用这些命令。

要禁用命令,只需将其重命名为 空字符串(由一对引号标记,它们之间没有字符),如下所示:

. . .
# 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 ""
. . .

要重命名命令,就像下面的示例所示。重命名的命令,是你容易记住,但是其他人猜不出来的那种:

. . .
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

保存更改并关闭文件。

重命名命令后,重新启动Redis:

sudo systemctl restart redis.service

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

redis-cli

然后,密码验证:

auth your_redis_password
OK

假设你将CONFIG命令重命名为ASC12_CONFIG,如前面的示例所示。首先,尝试使用原始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末尾有一条警示性声明:

请注意,更改登录到AOF文件或传输到从服务器的命令的名称可能会出现问题。

注意:如果重命名的命令不在AOF文件中,或者如果它是在AOF文件中,但AOF文件尚未传输给从属,则应没有问题。 因此,在尝试重命名命令时请记住这一点。要做好重命名工作,最好是在安装前,如果您在已经跑了很久的生产环境去执行,可能会造成错误。 当你使用AOF并处理主从安装时,请从项目的GitHub问题页面中考虑此答案。以下是对作者问题的回复: 这些命令记录到AOF并以与发送方式相同的方式复制到从站,因此如果你尝试在没有相同重命名的实例上重置AOF,则命令会无法执行(从文件也一样)。 因此,在这种情况下处理重命名的最佳方法是确保重命名的命令应用于主从安装中的所有实例。

结论

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

请设置好防火墙,因为一旦登录到你服务器,就有可能绕开我们刚刚的设置,务必配置好防火墙。可以参考如何在Ubuntu 18.04上使用UFW设置防火墙。如果您使用的是腾讯云的CVM服务器,我建议您直接参考CVM的安全组设置您的服务器。对于自建Redis经常会出现各种莫名其妙的问题,这里推荐您使用腾讯云云数据库 TencentDB for Redis,依靠腾讯多年的开发经验,支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。


参考文献:《How To Install and Secure Redis on Ubuntu 18.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏happyJared

基于Docker的Redis高可用集群搭建(redis-sentinel)

  之前介绍了用docker来搭建redis主从环境,但这只是对数据添加了从库备份(主从复制),当主库down掉的时候,从库是不会自动升级为主库的,也就是说,该...

5861
来自专栏Laoqi's Linux运维专列

PHP相关配置

PHP相关配置 : 通过如下方式找到咱们的php配置文件,这才是真正的PHP配置文件! [root@localhost test3.com]# /usr/loc...

4266
来自专栏蓝天

Redis-3.2.9集群配置(redis cluster)

本文参考官方文档而成:http://redis.io/topics/cluster-tutorial。经测试,安装过程也适用于redis-3.2.0。

3152
来自专栏SpiritLing

IIS前端页面不显示详细错误解决方法

要想解决这个问题,有三种方法可以考虑: 1.Internet信息服务(IIS)管理器 2.Web.config文件 3. 命令行 在IIS的“错误页”右边的“编...

3035
来自专栏云计算教程系列

如何在Debian 9上将BIND配置为专用网络DNS服务器

管理服务器配置和基础架构的一个重要部分包括通过设置适当的域名系统(DNS),维护一种通过名称查找网络接口和IP地址的简便方法。使用完全限定的域名(FQDN)而不...

4364
来自专栏黑白安全

常规web渗透测试漏洞描述及修复建议

apache一些样例文件没有删除,可能存在cookie、session伪造,进行后台登录操作

3834
来自专栏云计算教程系列

如何在CentOS 7上将BIND配置为专用网络DNS服务器

管理服务器配置和基础架构的一个重要部分包括通过设置适当的域名系统(DNS),维护一种通过名称查找网络接口和IP地址的简便方法。使用完全限定的域名(FQDN)而不...

3660
来自专栏蓝天

thrift使用小记

    Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言(IDL...

1571
来自专栏北京马哥教育

HTTP 协议漫谈

简介 网络上已经有不少介绍 HTTP 的好文章,对HTTP的一些细节介绍的比较好,所以本篇文章不会对 HTTP 的细节进行深究,而是从够高和更结构化的角度将 H...

29711
来自专栏清风

Linux 时区修改以及时间同步 原

3203

扫码关注云+社区

领取腾讯云代金券