前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Centos7上安装保护Redis

如何在Centos7上安装保护Redis

原创
作者头像
大瓜皮
发布2018-08-07 10:06:13
9860
发布2018-08-07 10:06:13
举报

介绍

Redis是一个开源的内存数据结构存储,擅长缓存。Redis是一个非关系型数据库,以其灵活性,性能,可伸缩性和广泛的语言支持而闻名。

由于Redis没有自己的强大安全功能,Redis需要在受信任环境中的受信任客户端使用,但是,Redis有一些安全功能,包括基本的未加密密码和命令重命名和禁用。本教程提供了有关如何配置这些安全功能的说明,还介绍了一些其他可以提高CentOS 7上独立Redis安装安全性的设置。

请注意,本教程不涉及Redis服务器和客户端应用程序位于不同主机或不同数据中心的情况。Redis流量在不安全或不受信任的网络的安装将需要不同的配置,例如在Redis计算机之间设置SSL代理或V**。

准备

要学习本教程,你需要:

  • 一台已经设置好可以使用sudo命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器

满足这些条件,我们就可以安装Redis,然后进行一些简单配置。

第1步、安装Redis

在我们安装Redis之前,我们必须首先将Enterprise Linux(EPEL)额外软件包添加到服务器的软件包列表中。EPEL是一个包存储库,包含许多开源附加软件包,其中大部分都是由Fedora项目维护的。

我们可以使用yum安装EPEL

代码语言:javascript
复制
sudo yum install epel-release

EPEL安装完成后,你可以再次使用yum命令安装Redis :

代码语言:javascript
复制
sudo yum install redis -y

这可能需要几分钟才能完成。安装完成后,启动Redis服务:

代码语言:javascript
复制
sudo systemctl start redis.service

如果你希望Redis开机启动,可以使用enable命令:

代码语言:javascript
复制
sudo systemctl enable redis

你可以通过运行以下命令来检查Redis的状态:

代码语言:javascript
复制
sudo systemctl status redis.service

代码语言:javascript
复制
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
   Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago
 Main PID: 3962 (redis-server)
   CGroup: /system.slice/redis.service
           └─3962 /usr/bin/redis-server 127.0.0.1:6379

一旦确认Redis正在运行,请使用以下命令测试安装程序:

代码语言:javascript
复制
redis-cli ping

作为响应,这应该会输出PONG。如果是这种情况,则意味着你现在已在服务器上运行Redis,我们可以开始对其进行配置以增强其安全性。

第2步、绑定Redis并使用防火墙保护它

保护Redis的有效方法是保护正在运行的服务器。你可以通过确保Redis仅绑定到localhost或私有IP地址并且服务器并运行防火墙来实现。

但是,如果你选择使用本教程设置Redis群集,则你将更新配置文件以允许来自外网的连接,这不如绑定到localhost或私有IP那样安全。

要解决此问题,请打开Redis配置文件进行编辑:

代码语言:javascript
复制
sudo vi /etc/redis.conf

找到以bind开头的行,并确保它已取消注释(删除#,就是取消注释):

代码语言:javascript
复制
bind 127.0.0.1

如果你需要将Redis绑定到另一个IP地址(例如你将从单独的主机访问Redis),我们强烈建议你将其绑定到专用IP地址。绑定到公共IP地址会增加Redis界面对外部方的暴露程度。

代码语言:javascript
复制
bind your_private_ip

如果你已遵循先决条件并在服务器上安装了firewalld,并且你不打算从其他主机连接到Redis,则无需为Redis添加任何额外的防火墙规则。毕竟,除非防火墙规则明确允许,否则默认情况下将丢弃任何传入流量。由于Redis服务器的默认独立安装仅在环回接口(127.0.0.1或localhost)上进行侦听,因此不应关注其默认端口上的传入流量。

但是,如果你计划从其他主机访问Redis,则需要使用该firewall-cmd命令对firewalld进行一些更改。同样,你应该只允许使用其私有IP地址从主机访问Redis服务器,以限制你的服务的主机数量。

首先,在你的firewalld规则中添加专用的Redis区域:

代码语言:javascript
复制
sudo firewall-cmd --permanent --new-zone=redis

然后,指定你要打开的端口。Redis 默认使用6397端口:

代码语言:javascript
复制
sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp

接下来,指定应允许通过防火墙并访问Redis的专用IP地址:

代码语言:javascript
复制
sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP

运行这些命令后,重新加载防火墙:

代码语言:javascript
复制
sudo firewall-cmd --reload

当防火墙从客户端的IP地址查看数据包时,它会将专用Redis的规则应用于该连接。所有其他连接将由默认public区域处理。默认区域中的服务适用于每个连接,而不仅仅是那些未明确匹配的连接,因此你无需将其他服务(例如SSH)添加到Redis区域,因为这些规则将自动应用于该连接。

如果选择使用Iptables设置防火墙,利用需要授予利用的辅助主机访问Redis正在使用的端口的权限:

代码语言:javascript
复制
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6397 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP

确保使用你的发行版提供的机制保存Iptables防火墙规则。请记住,使用任一防火墙工具都可以。重要的是防火墙已启动并运行。在下一步中,我们将配置Redis只能使用强密码进行访问。如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。

第3步、配置Redis密码

在本节中将说明如何设置Redis数据库服务器密码。配置Redis密码可启用其内置安全功能之一 - auth命令 - 要求客户端在允许访问数据库之前进行身份验证。与bind设置一样,密码直接在Redis的配置文件中配置。重新打开/etc/redis.conf文件:

代码语言:javascript
复制
sudo vi /etc/redis.conf

滚动到SECURITY部分并查找注释指令:

代码语言:javascript
复制
# requirepass foobared

删除#,取消注释,把foobared替换成一个安全的密码。你可以使用类似apgpwgen生成密码,而不是自己制作密码。但是,如果想用工具生成密码,则可以使用以下命令。

请注意,重复输入此命令。每次生成的都是相同的密码。要创建与此生成的密码不同的密码,请将引号中的单词换掉:

代码语言:javascript
复制
echo "Tencent-Cloud" | sha256sum

这将生成非常长的一个密码,这正是Redis所需的密码类型。复制并粘贴在requirepass后,如下所示:

代码语言:javascript
复制
requirepass password_copied_from_output

如果你更喜欢较短的密码,请使用以下命令。

代码语言:javascript
复制
echo "Tencent-Cloud" | sha1sum

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

代码语言:javascript
复制
sudo systemctl restart redis.service

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

代码语言:javascript
复制
redis-cli

以下是用于测试Redis密码是否有效的命令序列。我们设置一个key,并且添加一个value

代码语言:javascript
复制
set key1 10

由于我们尚未经过身份验证,所以Redis会返回错误。

代码语言:javascript
复制
(error) NOAUTH Authentication required.

使用以下命令进行身份验证。

代码语言:javascript
复制
auth your_redis_password

验证通过:

代码语言:javascript
复制
OK

之后,再次运行上一个命令应该是成功的:

代码语言:javascript
复制
set key1 10

代码语言:javascript
复制
OK

get key1命令查询key1的值。

代码语言:javascript
复制
get key1

代码语言:javascript
复制
"10"

使用quit,退出redis-cli,也可以使用exit

代码语言:javascript
复制
quit

现在,未经授权的用户很难访问你的Redis安装。但请注意,如果你正在远程连接到Redis,如果没有SSL或V**,外部各方仍可以看到未加密的密码。

接下来,我们将重新命名Redis命令,以进一步保护Redis免受恶意攻击者的攻击。

第4步 - 重命名危险命令

Redis内置的另一个安全功能允许你重命名或完全禁用某些被视为危险的命令。当由未经授权的用户运行时,此类命令可用于重新配置,销毁或以其他方式擦除数据。一些已知危险的命令包括:

  • FLUSHDB
  • FLUSHALL
  • KEYS
  • PEXPIRE
  • DEL
  • CONFIG
  • SHUTDOWN
  • BGREWRITEAOF
  • BGSAVE
  • SAVE
  • SPOP
  • SREM RENAME DEBUG

这不是一个全面的列表,但是我们建议您重命名或禁用该列表中的所有命令。是否禁用或重命名命令是特定于站点的。如果你知道永远不会使用的命令,那么你可以禁用它。

与身份验证密码一样,重命名或禁用命令在/etc/redis.conf文件的SECURITY部分中配置。要启用或禁用Redis命令,请再次打开配置文件进行编辑:

代码语言:javascript
复制
sudo vi  /etc/redis.conf

注意:这些是示例。你应该选择禁用或重命名对你有意义的命令。你可以自己检查命令,并确定如何在redis.io/commands中利用这些命令。要禁用或终止命令,只需将其重命名为空字符串,如下所示:

代码语言:javascript
复制
# 要使一个命令失效,那就把它命名成
# 一个空的字符串:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""

接下来是重命名,如下例所示。重命名后的命令应该让其他人难以猜测,但你自己很容易记住:

代码语言:javascript
复制
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

保存并退出,然后重新Redis:

代码语言:javascript
复制
sudo service redis-server restart

测试一下效果,请进入Redis命令行:

代码语言:javascript
复制
redis-cli

先使用之前设定的密码验证一下:

代码语言:javascript
复制
auth your_redis_password

代码语言:javascript
复制
OK

假设你将CONFIG命令重命名为ASC12_CONFIG,使用config命令应该会失败。

代码语言:javascript
复制
config get requirepass

代码语言:javascript
复制
(error) ERR unknown command 'config'

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

代码语言:javascript
复制
asc12_config get requirepass

代码语言:javascript
复制
Output
1) "requirepass"
2) "your_redis_password"

退出redis-cli

代码语言:javascript
复制
exit

请注意,重新启动Redis,则需要重新进行身份验证。否则,则会出现此错误: NOAUTH Authentication required. 关于重命名命令,/etc/redis.conf文件中SECURITY部分的末尾有一条警告声明,内容如下: 请注意,更改登录到AOF文件或传输到从服务器的命令的名称可能会导致问题。 这意味着如果重命名的命令不在AOF文件中,或者如果它是但AOF文件尚未传输给从属,则应该没有问题。在重命名命令时请记住这一点。重命名命令的最佳时间是在你不使用AOF持久性时或安装后(即在部署Redis-using应用程序之前)。 当你使用AOF并处理主从安装时,请从项目的GitHub问题页面中考虑此答案。以下是对作者问题的回复: 这些命令记录到AOF并以与发送方式相同的方式复制到从站,因此如果你尝试在没有相同重命名的实例上重放AOF,则可能会因为命令无法执行而面临不一致。 在这种情况下处理重命名的最佳方法是确保重命名的命令应用于所有主从安装实例。

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

在此步骤中,我们将告诉你更改哪些东西,来改进Redis安装的安全配置文件。这涉及确保只有需要访问Redis的用户才有权读取其数据。默认情况下,用户是redis用户。

运行以下命令,查到Redis的当前用户。

代码语言:javascript
复制
ls -l /var/lib | grep redis

代码语言:javascript
复制
drwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

你可以看到,Redis数据目录属于Redis用户,并授予Redis组二次访问权。这个所有权设置是安全的,但是文件夹的权限(设置为755)是不安全的。要确保只有Redis用户有权访问文件夹及其内容,请将权限设置更改为770:

代码语言:javascript
复制
sudo chmod 770 /var/lib/redis

你应该更改的另一个权限是Redis配置文件的权限。默认情况下,它拥有644的文件权限,并由root拥有,由根组拥有二级所有权:

代码语言:javascript
复制
ls -l /etc/redis.conf

代码语言:javascript
复制
-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis.conf

该许可(644)是全局可读的。这会带来安全问题,因为配置文件包含你在步骤4中配置的未加密密码,这意味着我们需要更改配置文件的所有权和权限。理想情况下,它应由redis用户拥有,由redis组拥有次要所有权。为此,请运行以下命令:

代码语言:javascript
复制
sudo chown redis:redis /etc/redis.conf

然后更改权限,以便只有文件的所有者有读写权限:

代码语言:javascript
复制
sudo chmod 660 /etc/redis.conf

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

代码语言:javascript
复制
ls -l /etc/redis.conf

代码语言:javascript
复制
total 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf

最后,重启Redis:

代码语言:javascript
复制
sudo service redis-server restart

你的Redis安装现在应该更加安全!

结论

请记住,一旦有人登录到你的服务器,就很容易绕过我们已经做的安全防护。这就是为什么本教程中涉及的最重要的安全功能是防火墙,因为它可以防止未知用户首先登录到你的服务器。如果你尝试通过不受信任的网络保护Redis通信,则必须使用Redis开发人员在Redis官方安全指南中推荐的SSL代理。如何设置此证书取决于你是否拥有可解析该服务器的域名。

更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How to Install and Secure Redis on Centos7》

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第1步、安装Redis
  • 第2步、绑定Redis并使用防火墙保护它
  • 第3步、配置Redis密码
  • 第4步 - 重命名危险命令
  • 第5步 - 设置数据目录所有权和文件权限
  • 结论
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档