Redis 服务器强制执行 AUTH,但未配置为 requirepass

Redis server enforcing AUTH, but was not configured to requirepass

我有一个 Rails 应用程序,它使用 Redis 进行后台作业(通过 Resque)。这在开发和生产(在 VM 上)上运行良好已经有一段时间了。最近,在尝试访问生产环境中的 resque-web Sinatra 站点以管理后台任务时,我遇到了 Internal Server Error 消息。查看网络服务器日志,我可以看到错误来自 Redis,因为它似乎需要密码进行身份验证:

Redis::CommandError - NOAUTH Authentication required

这是奇怪的部分,我的 redis conf 文件 (/etc/redis/6379.conf) 没有(据我所知从来没有)启用任何身份验证(注意这两行都被注释掉了):

...
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
# masterauth <master-password>
...
# Require clients to issue AUTH <PASSWORD> before processing any other
# commands.  This might be useful in environments in which you do not trust
# others with access to the host running redis-server.
#    
# This should stay commented out for backward compatibility and because most
# people do not need auth (e.g. they run their own servers).
# 
# 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.
#
# requirepass foobared
...

如果我尝试重启redis服务器,它不会让我没有密码:

sudo /etc/init.d/redis_6379 restart
Stopping ...
(error) NOAUTH Authentication required.
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...

所以我的直接问题是我的 Redis 服务器设置了密码,但我不知道它是什么。我需要让它重新工作。

第二个问题是我不知道这个密码是怎么设置的。该应用程序部署在 DigitalOcean VM 上。查看 redis 日志没有发现任何可疑之处。我使用推荐的 SSH 和自定义端口设置来提供一点访问安全性,但当然它永远不会完全安全。这个应用程序是我的一个副项目,实际上没有任何敏感信息受到威胁。但是,我确实想弄清楚发生了什么,并阻止它再次发生。

这里的答案似乎最能解释发生的事情:

注意到该问题的最近日期也很有趣。似乎我们都是同一个安全漏洞的受害者。我现在正在给Redis服务器添加密码,同时也会阻塞VM上的Redis端口。

问题:

这个问题...

service redis_6379 restart
Stopping ...
(error) NOAUTH Authentication required.
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
[...]

...出现是因为在stop/restart处配置了密码认证而没有配置密码。

解决方案:

打开文件...

/etc/init.d/redis_6379

...并替换行...

#!/bin/sh

...与...

#!/bin/bash

...并替换行...

"$CLIEXEC -p $REDISPORT 关闭"

...与...

# NOTE: We use that workaround because the password authentication is configured, and the pass    word is not configured at restart! By Questor
REQUIREPASS=$(sed -n 's/.*requirepass *  *\([^ ]*.*\)//p' < "$CONF")
IFS=' ' read -r -a MATCH_ARRAY <<< $REQUIREPASS
$CLIEXEC -a "${MATCH_ARRAY[1]}" -p $REDISPORT shutdown

# $CLIEXEC -p $REDISPORT shutdown

完成!

注意: 请注意,${MATCH_ARRAY[i]} 中的 i 索引取决于您如何配置 requirepass 参数!也就是说,"requirepass " 字符串在 6379.conf 文件中出现了多少次,您对哪一个感兴趣!

[参考:http://www.cnblogs.com/abclife/p/6179454.html]