1

[Middleware] Java SeedGenerator e a entropia

8 Flares 8 Flares ×

Vamos iniciar o mês de Julho falando de Java e o problema a ser discutido neste post é a relação entropia e o SeadGenerator em ambiente virtual e uma possível correção para o problema utilizando o RNGD.

Sintoma

Com ambiente em carga, as threads no container Java entram em estado de WAIT. O acesso para o usuário final é degradado, novas threads são abertas e consequentemente, num intervalo pequeno (relativo a quantidade de threads e acesso), excedendo o limite máximo de threads em execução no container Java.

Analise

Utilizamos um threadDump para conseguir chegar na thread ofensora, como pode ser observado na figura abaixo:

Seed

Detalhando o funcionamento dessa thread podemos entender o motivo da instabilidade.

SeedGenerator

SeedGenerator é uma classe do package sun.security.provider. Seu objetivo é gerar seads (range de números randômicos) para ser utilizado na criptografia de objetos no Java. Para que a classe SeedGenerator funcione adequadamente, ela faz uso de um gerador de numero randômicos. No caso do Unix/Linux, é utilizado a entropia computacional adquirida através do device /dev/random e aqui esta o ponto de falha em questão.

Entropia

A entropia faz uso do especial device “/dev/random”. O random utiliza as interrupções de hardware para gerar os bits que consequentemente “alimenta” a entropia. A entropia pode variar de 0 a 4096 bits dependendo da quantidade de eventos e interrupções com o hardware.  Você pode validar a entropia disponível observando o “entropy_avail”:

# cat /proc/sys/kernel/random/entropy_avail
4096

Cauza raiz

Em ambiente virtual eventos de hardware no host virtualizado é praticamente incomum. (devido a própria proposta da arquitetura de Virtualização.) E o random, por utilizar os eventos de hardware e drivers para trabalhar os bits de dados, seu numero será esgotado rapidamente devido a baixa estatística de utilização dos componentes físicos, dependendo somente da coleta de informação dos drivers do servidor em questão.

Utilizando o RNGD para mitigar o problema

Devido ao problema com a classe SeedGenerator, utilizamos uma solução simples com o programa rngd. Com ele mantemos uma entropia elevada definindo o intervalo de atualização e quantidade de bits. Assim, contornando a dificuldade da maquina virtual em gerar os números randômicos.

Instalando o RNGD

RedHat/CentOS

# yum install rng-tools

Após instalar o pacote, editar o arquivo de configuração:

vi /etc/sysconfig/rngd

Adicione a linha abaixo, especificando a quantidade de bits e intervalo

EXTRAOPTIONS="-r /dev/urandom -o /dev/random -b -W 4096 -t 5"

Após editar o arquivo de configuração, não esqueça de deixar o serviço ativo em sua runlevel antes de sua execução.

# chkconfig rngd on
# service rngd start

Esse procedimento foi validado e é seguro aplica-lo. Qualquer dúvida, estamos a disposição. Um abraço!

:wq!

RECOMENDADO PARA VOCÊ

Avelino Ferreira

"Meu egoísmo é tão egoísta que o auge do meu egoísmo é querer ajudar..."

One Comment

Dúvidas? Deixe seu comentário ou entre em contato.