当Cassandra不知道默认用户'cassandra'时,如何重置Cassandra超级用户?

4
如何在不改变源代码的情况下重置默认的Cassandra凭据?
我已经查看了类似问题,例如如何重置丢失的Cassandra管理员用户密码?。 我有一个Datastax Cassandra 2.0.8的三节点集群,并尝试实现身份验证。 我已经在所有节点上设置了cassandra.yaml并重新启动了它们。 问题是我仍然无法登录到cqlsh。
我还尝试在cqlsh中重置cassandra用户的密码(我已禁用了身份验证):
update system_auth.credentials set salted_hash='$2a$10$vbfmLdkQdUz3Rmw.fF7Ygu6GuphqHndpJKTvElqAciUJ4SZ3pwquu' where username='cassandra';

日志中包含有关创建cassandra超级用户的信息。我已经检查了keyspace system_auth,其中包括凭据、权限和用户。而credentials列族确实包含了用户cassandra:

cqlsh> use system_auth;
cqlsh:system_auth> select * from credentials;

 username  | options | salted_hash
-----------+---------+----------------------------------------------------------                                ----
 cassandra |    null | $2a$10$vbfmLdkQdUz3Rmw.fF7Ygu6GuphqHndpJKTvElqAciUJ4SZ3pw                                quu

(1 rows)

但是,当我尝试时:

./cqlsh -u cassandra -p cassandra

我遇到了一个异常,提示用户不存在,但是我没有权限创建一个新用户。
cql.cassandra.ttypes.AuthenticationException: AuthenticationException(why="User cassandra doesn't exist - create it with CREATE USER query first")
1个回答

9
我不确定,但很可能你上面使用的哈希值会随着每个版本的更改而改变,并且可能特定于Cassandra的某个版本。考虑到这一点,你可以(理论上)在虚拟机中安装相同的版本,然后查询该机器的system_auth.credentials以获取cassandra用户的salted_hash。如果不是因为你链接的问题,我从来没有想过尝试这样做。
否则,下一个选项起作用。
1.停止Cassandra集群。 2.在每个节点上,cd到你的data目录,并执行: $ mv system_auth system_auth_20140814 3.重新启动每个节点。
只要身份验证器仍然设置(在cassandra.yaml中)为使用PasswordAuthenticator,Cassandra将重建system_auth键空间,并使用默认的Cassandra超级用户,您可以使用cqlsh重新登录。
$ ./cqlsh -u cassandra -p cassandra
Connected to MyCluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.1.0-rc5-SNAPSHOT | CQL spec 3.2.0 | Native protocol v3]
Use HELP for help.
cqlsh>

注:

  • 您将需要重新添加所有用户,并重新应用他们的权限。
  • 除了重命名(mv)system_auth目录,你也可以直接删除它(rm)。
  • 您将需要重新应用适当的复制设置到您的system_auth keyspace。默认情况下,system_auth只有一个复制因子。

2
尝试了您的答案并设置更高的复制因子后,它成功了。 - LadyWoodi
@LadyWoodi 很棒!很高兴我能帮到你。 - Aaron
@LadyWoodi,在使用新创建的超级用户进行身份验证之前,您如何设置更高的复制因子?还是在重新启动后,只有_LocalStrategy_与_system_auth_复制?我有几台机器组成的集群,正在解决同样的错误。不幸的是,在清理_system_auth_目录后,没有一台机器愿意起床。 - Scooletz
2
@Scooletz 我已经禁用了身份验证,启动了节点并像这样更新了复制因子:CREATE KEYSPACE system_auth WITH REPLICATION = {'class':'SimpleStrategy','replication_factor':3};然后我重新启用了身份验证并使用了上述解决方案。但是,在清理system_auth之后,我没有遇到任何启动节点的问题。您在节点启动期间的日志中看到了有用的信息吗?应该有关于cassandra超级用户创建的信息。您是否在所有节点上清理了system_auth? - LadyWoodi
@LadyWoodi,我终于成功解决了这个问题。问题的原因是没有清理所有数据目录(我的板子上有JBOD)。在清理了所有目录之后,上述解决方案就像魔法一样奏效了。感谢您的澄清! - Scooletz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接