Arquivos cqlshrc e credentials no Cassandra
- Postado por Adriano Bonacin
- Categorias cassandra
- Data 27/06/2023
- Comentários 0 comentário
Introdução
No nosso artigo sobre a criação de um cluster de Cassandra falamos que a conexão com o cqlsh retorna um erro de Connection Refused na opção default quando não estamos ouvindo conexões na interface loopback. Porém é possível configurar o cqlsh para que use outra interface além de opções de autenticação, através dos arquivos cqlshrc e credentials e é sobre isso que vamos conversar neste artigo.
Arquivo de configuração
Se você vem de outros bancos, como o Oracle, talvez já tenha ouvido falar do glogin do SQLPLUS. Se vem do mysql, o arquivo é ~/.my.cnf.
No Cassandra temos algo semelhante para o cqlsh. Um arquivo onde podemos definir as configurações default, como usuário, senha, hostname ou IP. Seu caminho é ~/.cassandra/cqlshrc e nem sempre esse diretório existe. Ele será criado a primeira vez que alguém tentar acessar o cqlsh. Uma vez criado o diretório, podemos criar esse arquivo.
Você também pode criar este arquivo em outro lugar e informar o path do diretório ao cqlsh usando o parametro –cqlshrc
Usando cqlshrc
Um dos principais usos do cqlshrc é para facilitar a autenticação dentro do servidor de banco de dados. Principalmente se você vem do mundo Oracle, onde na maioria das instalações se você possui acesso ao SO, você tem acesso ao DB.
Vamos ver como funciona isso no Cassandra. Por default, o cqlsh retorna um erro.
[rocky@ip-10-0-7-113 ~]$ cqlsh Connection error: ('Unable to connect to any servers', {'127.0.0.1:9042': ConnectionRefusedError(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")}) [rocky@ip-10-0-7-113 ~]$ [rocky@ip-10-0-7-113 ~]$ ss -nlt | grep 9042 LISTEN 0 128 10.0.7.113:9042 0.0.0.0:*
Mas já havíamos conversado sobre isso, precisamos informar a interface correta.
Vamos corrigir isso com o cqlshrc. Se o arquivo não existe, vamos criá-lo. Vale lembrar que esse arquivo é a nível de usuário do Linux. Se você criá-lo para o user cassandra, só será invocado se você estiver conectado com o user cassandra. Vou fazer meu teste com o user rocky. Este é o conteúdo do meu arquivo:
[rocky@ip-10-0-7-113 ~]$ cat .cassandra/cqlshrc
[connection]
hostname: 10.0.7.113
E o resultado:
[rocky@ip-10-0-7-113 ~]$ cqlsh
Connected to AnsibleApache at 10.0.7.113:9042
[cqlsh 6.1.0 | Cassandra 4.1-alpha1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cqlsh>
Autenticação
Se seu cluster requer autenticação, você verá um erro assim:
[rocky@ip-10-0-7-113 ~]$ cqlsh Connection error: ('Unable to connect to any servers', {'10.0.7.113:9042': AuthenticationFailed('Remote end requires authentication',)})
Aqui temos duas saídas, uma antiga que era usando o próprio cqlshrc, mas você verá um WARNING dizendo que talvez não seja uma boa ideia o que está fazendo.
Basta adicionar a seção [authentication] e invocar novamente o cqlsh.
[rocky@ip-10-0-7-113 ~]$ cat .cassandra/cqlshrc [connection] hostname: 10.0.7.113 [authentication] username: cassandra password: cassandra [rocky@ip-10-0-7-113 ~]$ cqlsh Warning: Password is found in an insecure cqlshrc file. The file is owned or readable by other users on the system. Notice: Credentials in the cqlshrc file is deprecated and will be ignored in the future. Please use a credentials file to specify the username and password. Connected to AnsibleApache at 10.0.7.113:9042 [cqlsh 6.1.0 | Cassandra 4.1-alpha1 | CQL spec 3.4.5 | Native protocol v5] Use HELP for help. cassandra@cqlsh>
Credentials
Na versão 4.1 do Cassandra foi introduzido uma melhoria de segurança CASSANDRA-16983 forçando para que as informações de autenticação fiquem em outro arquivo e este arquivo seja de sua propriedade que outros users não tenham permissão de leitura.
Assim, retiramos as informações de autenticação do cqlshrc incluímos no .cassandra/credentials. Essa mudança é bem ampla que isso, você pode encontrar detalhes aqui.
[rocky@ip-10-0-7-113 ~]$ cat .cassandra/credentials
[PlainTextAuthProvider]
username = cassandra
password = cassandra
[rocky@ip-10-0-7-113 ~]$ cat .cassandra/cqlshrc
[connection]
hostname: 10.0.7.113
Se os atributos do arquivo não forem corretas, você verá:
[rocky@ip-10-0-7-113 ~]$ cqlsh Warning: Credentials file '/home/rocky/.cassandra/credentials' exists but is not used, because: a. the file owner is not the current user; or b. the file is readable by group or other. Please ensure the file is owned by the current user and is not readable by group or other. On a Linux or UNIX-like system, you often can do this by using the `chown` and `chmod` commands: chown YOUR_USERNAME credentials chmod 600 credentials Connection error: ('Unable to connect to any servers', {'10.0.7.113:9042': AuthenticationFailed('Remote end requires authentication',)})
Mudando a permissão e tentando novamente:
[rocky@ip-10-0-7-113 ~]$ chmod 400 /home/rocky/.cassandra/credentials
[rocky@ip-10-0-7-113 ~]$ cqlsh
Connected to AnsibleApache at 10.0.7.113:9042
[cqlsh 6.1.0 | Cassandra 4.1-alpha1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cassandra@cqlsh>
Conclusão
Espero que tenha gostado de saber como podemos usar esses arquivos de configuração para dar um pouco de praticidade. As opções do cqlshrc não param por aí, você pode configurar keyspaces default e muitas outras coisas. Aqui tem todos os detalhes.
E por fim, não poderia deixar de recomendar o artigo do meu colega Anil, com várias dicas para enriquecer a forma como você trabalha com cqlsh.