Como habilitar JMX remotos e com autenticação no Cassandra
- Postado por Adriano Bonacin
- Categorias cassandra
- Data 30/06/2023
- Comentários 0 comentário
Introdução
Alguns serviços de monitoração ou administração necessitam acessar o JMX remotamente. Porém, por default, essa opção não funciona nos nossos cluster. Vamos falar neste artigo o que precisamos mudar para que nosso Cassandra aceite JMX remoto e com autenticação.
JMX remoto
O JMX por default ouve na porta 7199, na interface loopback. Isso implica não podermos receber conexões remotas, aceitando apenas conexões locais. O arquivo que controla essa opção é o cassandra-env.sh, por default em /etc/cassandra/conf.
Vamos fazer uma alteração nesse arquivo para permitir conexões remotas. A variável LOCAL_JMX controla isso dentro deste arquivo. Há um teste para saber se a variavel LOCAL_JMX é igual a yes. E tudo que precisamos é antes desse teste, incluir uma linha marcando-o como “no”. Assim, o JMX permitirá conexões remotas. Após essa alteração o Cassandra precisa ser restartado.
sudo vi /etc/cassandra/conf/cassandra-env.sh # adicione esta linha LOCAL_JMX=no if [ "x$LOCAL_JMX" = "x" ]; then LOCAL_JMX=yes fi
Autenticação
Além de agora o JMX aceitar conexões remotas, há uma outra implicação. O JMX passa a forçar autenticação. No Cassandra 4.1 temos duas opções: uma é usar um arquivo de senha (arquivo texto) e outra é usar a autenticação do próprio cassandra. Vamos as diferenças. Para testar esse cenário, meu cluster está com a autenticação do lado do banco de dados habilitado. Em outro artigo escreverei sobre como isso funciona. Aqui vamos falar apenas de como habilitar a autenticação para o JMX.
Standard JMX Auth
A primeira opção de autenticação, eu diria que também a mais usada, é com o arquivo de senha. Na verdade são dois arquivos, um que define a senha e outro que define o nível de acesso. O username deve estar nos dois arquivos, como vou mostrar abaixo.
No mesmo arquivo cassandra-env.sh, vamos procurar pelas opções abaixo. Em algumas versão elas eram comentadas. Garanta que estejam descomentadas para que o Cassandra use estes arquivos para controlar o acesso:
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/conf/jmxremote.password"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.access.file=/etc/cassandra/conf/jmxremote.access"
Vamos criar nosso arquivos (caso ainda não existam). Eles devem ter permissão 400 e ser propriedade do user cassandra. O que teremos aqui são três users, suas permissões e suas senhas. Tudo meio auto explicativo. Após as alterações, o Cassandra deve ser restartado.
[rocky@ip-10-0-8-143 ~]$ sudo cat /etc/cassandra/conf/jmxremote.access
yadax_ro readonly
yadax_rw readwrite
cassandra readwrite
[rocky@ip-10-0-8-143 ~]$ sudo chown cassandra:cassandra /etc/cassandra/conf/jmxremote.access
[rocky@ip-10-0-8-143 ~]$ sudo chmod 400 /etc/cassandra/conf/jmxremote.access
[rocky@ip-10-0-8-143 ~]$ sudo cat /etc/cassandra/conf/jmxremote.password
yadax_ro myjmxpass
yadax_rw myjmxpass
cassandra myjmxpass
[rocky@ip-10-0-8-143 ~]$ sudo chown cassandra:cassandra /etc/cassandra/conf/jmxremote.password
[rocky@ip-10-0-8-143 ~]$ sudo chmod 400 /etc/cassandra/conf/jmxremote.password
[rocky@ip-10-0-8-143 ~]$ ll /etc/cassandra/conf/jmxremote*
-r--------. 1 cassandra cassandra 58 Jun 28 13:54 /etc/cassandra/conf/jmxremote.access
-r--------. 1 cassandra cassandra 60 Jun 28 13:54 /etc/cassandra/conf/jmxremote.password
Após tudo isso feito, próxima tentativa de usar o nodetool nos mostra um erro:
[rocky@ip-10-0-8-143 ~]$ nodetool status
error: Authentication failed! Credentials required
-- StackTrace --
java.lang.SecurityException: Authentication failed! Credentials required
Vamos tentar agora com nosso user e senha.
[rocky@ip-10-0-8-143 ~]$ nodetool -u cassandra -pw myjmxpass status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 10.0.8.123 198.09 KiB 16 76.0% 78112557-7fcb-4a22-9078-c74f90098a09 rack3
UN 10.0.3.58 202.74 KiB 16 59.3% f1ca9024-a896-428c-96d5-cbc258a9d381 rack2
UN 10.0.8.143 164.38 KiB 16 64.7% aab5b67d-8e31-4264-8aa1-0eb673f7a8cf rack1
Cassandra Integrated Auth
Para que a autenticação do JMX seja integrada com o Cassandra, precisamos fazer algumas alterações no cassandra-env.sh. Precisamos descomentar as linhas abaixo:
JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.remote.login.config=CassandraLogin"
JVM_OPTS="$JVM_OPTS -Djava.security.auth.login.config=$CASSANDRA_HOME/conf/cassandra-jaas.config"
JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.authorizer=org.apache.cassandra.auth.jmx.AuthorizationProxy"
Comentar as linhas:
#JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/conf/jmxremote.password"
#JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.access.file=/etc/cassandra/conf/jmxremote.access"
Novamente o Cassandra precisar ser restartado. Agora perceba que podemos usar a mesma senha que usamos para acessar o DB. Há uma conversa sobre permissões para os users, mas faremos isso em um outro momento. Por enquanto podemos usar nosso super user.
[rocky@ip-10-0-8-143 ~]$ cqlsh -u cassandra -p mydbpass $HOSTNAME Warning: Using a password on the command line interface can be insecure. Recommendation: use the credentials file to securely provide the password. Connected to AnsibleApache at ip-10-0-8-143.sa-east-1.compute.internal:9042 [cqlsh 6.1.0 | Cassandra 4.1-alpha1 | CQL spec 3.4.5 | Native protocol v5] Use HELP for help. cassandra@cqlsh> [rocky@ip-10-0-8-143 ~]$ nodetool -u cassandra -pw mydbpass status Datacenter: datacenter1 ======================= Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 10.0.8.123 303.31 KiB 16 76.0% 78112557-7fcb-4a22-9078-c74f90098a09 rack3 UN 10.0.3.58 308.56 KiB 16 59.3% f1ca9024-a896-428c-96d5-cbc258a9d381 rack2 UN 10.0.8.143 218.11 KiB 16 64.7% aab5b67d-8e31-4264-8aa1-0eb673f7a8cf rack1
[rocky@ip-10-0-8-143 ~]$
Conclusão
Este artigo acabou abordando aspectos bem técnicos, espero que tenham gostado. Resumindo o que abordamos, para habilitar conexões remotas temos como “efeito colateral” a autenticação. Em seguida falamos das duas formas de trabalhar com a autenticação no JMX.