Entropia: A Causa de Alguns Males.

Algumas distros Linux como o Ubuntu podem travar logo após inicializar, não exibindo a tela de login. Porém o problema não está no desktop environment, e sim na Entropia!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.


Errata:

O termo original Entropia se refere á uma das grandezas do estudo de termodinâmica e, apesar de ter ganhado novos sentidos, o termo não deveria ser usado em outras áreas tais como na informática ou na política, uma vez que entropia representa troca de calor na matéria e não representa um estado de desordem.

A associação incorreta da entropia com a “desordem” ao considerar-se o sentido em senso comum desta palavra, leva muitas vezes a uma compreensão errônea da definição de entropia e também a usos completamente inadequados da segunda lei da termodinâmica.

Portanto,  para a elaboração desta publicação respeitei os termos utilizados na informática internacional, mas eu desencorajo seu uso; o mais apropriado aqui, em vez de entropia, seria usar o termo desordem ou outro sinônimo, como aleatoriedade. – Particularmente acho o termo caos mais charmoso. Aos matemáticos, mencionar condição determinística com sensibilidade aos dados iniciais também é algo válido!

1. Introdução

Esse tutorial surgiu após eu presenciar um problema em alguns notebooks específicos e um Macbook Air onde instalei Ubuntu neles. Mesmo com uma instalação bem sucedida pelo LiveUSB, o sistema carrega o kernel, inicia o espaço de usuário, tudo certo de acordo com a tela de início sem a splash screen.

Porém quando ele prepara para exibir a tela de login, ele permanece numa tela preta por tempo indeterminado, entre 1 minuto e 5 minutos. Após uma exaustiva espera, ele inicia normalmente e exibe a tela de login – Em alguns casos ele não inicia exibindo a tela de login! Sem solução, nessas máquinas troquei de sistema.

O mais curioso é que o boot ocorre normalmente e o Desktop Environment, seja ele o MATE, KDE, GNOME, está devidamente instalado porém apenas não inicializa. Mesmo com o Xorg configurado. Essa constatação vem do fato de que com o comando CTRL + ALT + F1 você acessa o terminal e pode usar o sistema em modo texto, porém algo “impede” que a interface gráfica inicie, mesmo reinstalando o Xorg e todos os pacotes da interface gráfica.

O problema nesse caso está na entropia.

1. Gerador de Entropia

No Linux, a raiz de toda a aleatoriedade, a geração de código aleatório é algo chamado de pool de entropia do kernel. Este é um número grande (4.096 bits) mantido em segredo na memória do kernel. Existem 2^4096 possibilidades para este número, podendo conter até 4.096 bits de entropia. Há uma ressalva: o kernel precisa ser capaz de preencher essa memória a partir de uma fonte. E essa é a parte difícil: encontrar muita aleatoriedade.

Infelizmente nesse aspecto o computador falha: Um computador é uma calculadora preditiva com código previsível. É muito complicado gerar um algoritmo de aleatoriedade sem gastar muito hardware e/ou que seja difícil de quebrar. Caso uma fonte de aleatoriedade dessas seja fraca, uma senha, mesmo que possua 256 bits, será fácil de quebrar bastando descobrir o padrão que gerou ela.

O pool de entropia ainda tem outro problema: Ele tem uma validade. Quando números aleatórios são gerados a partir do conjunto de entropia, a entropia do conjunto é diminuída – o usuário ou processo que recebe o número aleatório tem alguma informação sobre o próprio pool. Assim, à medida que a entropia do conjunto diminui à medida que números aleatórios são distribuídos, o conjunto deve ser reabastecido.

Reabastecer o pool – piscina – de entropia é chamado de stirring (agitação): novas fontes de entropia são misturadas à mistura dessa piscina. Essas fontes podem ser os timestamps de cliques do mouse, o intervalo em segundos entre o pressionamento de uma tecla ou outra no teclado, velocidade exata de rotação do disco do HD, etc. – Não confunda com telemetria, o Linux não quer saber o que você faz, ele quer apenas o lixo, os dados inúteis que o humano produz ao controlar um PC.

Essa é a chave de como a geração de números aleatórios funciona no Linux.

2. Utilidade

Esse gerador de entropia também alimenta os dispositivos especiais /dev/random e /dev/urandom, cujas funções já informamos nesta publicação anterior em nosso site!

  • Mas onde o gerador de entropia é útil?

Alguns exemplos simples são: Quando o usuário solicita a um software uma “frase motivacional aleatória do dia” ou determinando a maneira como um adversário controlado por computador pode se mover em um jogo de computador, por exemplo, um adversário controlado pela máquina num jogo virtual de xadrez.

Formas mais fracas de aleatoriedade são usadas em algoritmos de hash e na criação de algoritmos de busca e classificação de itens em pastas dos sistemas de arquivos.

Também é usado entropia em um sistema que “aleatoriamente” seleciona faixas de música para um player de audio e pode até ter meios de controlar a seleção de música: um sistema aleatório verdadeiro não teria restrição sobre o mesmo item aparecendo dois ou três vezes em sucessão.

Um ultimo exemplo é a produção de chaves públicas SSH: Sem isso, as conexões SSH seriam muito inseguras.

3. O problema

Aparentemente o algoritmo gerador de entropia do sistema é ineficiente durante o processo de boot e, enquanto a “piscina” de código não é alimentada por entradas aleatórias, ele não exibe a tela de login.

O Ubuntu por exemplo – e várias distros Linux como o ArchLinux – fazem uso do GPG (OpenPGP encryption and signing tool, uma ferramenta GNU) para geração de entropia. Porém o GPG não é muito eficiente, principalmente quando você tem o Ubuntu 18.04 LTS e troca o kernel dele para algum mais moderno como o 4.19.2, a partir desse ponto deixa de suportar o GPG devidamente. Além disso o Ubuntu (e seus sabores) usam o GPG no kernel 4.15.x modificado nativo: o erro não costuma surgir a menos que você troque de kernel!

O resultado é problema na hora de encher a “piscina” de entropia, deixando o boot atrasado e afetando negativamente o sistema: As chaves SSL, SSH, VPN e outras são produzidas usando a fonte de entropia como base. Se ela está com problemas, você verá um erro de “no more random bytes are available and that it needs to collect more entropy” (seu sistema não possui mais bytes aleatórios disponíveis e precisa de coletar mais entropia). Mesmo que o erro não surja, ele é um dos principais problemas de atraso no boot do sistema, pois alguns setores do kernel fazem uso de entropia para funcionar corretamente.

4. A solução

4.1 A Solução Proprietária

Na minha opinião, a melhor.
Os chips processadores Intel e AMD possuem entropia por hardware. Pra confirmar, basta executar o comando:

# cat /proc/cpuinfo

E observar a presença do parâmetro RDRAND ou RDSEED em “flags”.

Há controvérsias quanto a fonte dos dados. A Intel garante que utiliza os mais altos padrões internacionais para produção de aleatoriedade no núcleo dos chips, seguindo as normas NIST SP 800-90A, FIPS 140-2 e ANSI X9.82. Porém, com as recentes e cada vez mais comuns descobertas de falhas nos processadores Intel, há dúvidas quanto a origem e integridade dos números gerados.

De acordo com Linus Torvalds, não há problemas em utilizar o RDRAND/RDSEED, já que o pool de entropia será preenchido com dados desta fonte (rapidamente) e também mesclado aos dados das fontes comumente utilizadas, como os já citados movimentos do mouse e teclado, por exemplo. Assim, mesmo que ajam falhas na fonte de entropia do processador Intel, o pool de entropia é enchido e misturado com maior segurança.

Você pode habilitar seu uso com o pacote rng-tools:

$ sudo apt/dnf/yum install rng-tools

Edite o arquivo /etc/default/rng-tools com seu editor de textos favorito porém como root e adicione a seguinte linha:

HRNGDEVICE=/dev/urandom

Inicie o daemon:

$ sudo systemctl start rng-tools

E por fim, execute este comando:

$ gpg --gen-key

Tecle no teclado, mova o mouse, faça coisas “aleatórias” para encher o pool de entropia com seus movimentos; Eles serão mesclados ao algorítimo atualmente presente no sistema e gerará uma saída de entropia mais segura contra quebras de segurança.

4.2 A solução OpenSource

Caso não queira usar o rng-tools, você pode alimentar o daemon GPG com mais entropia da seguinte maneira: Utilizando o Haveged.

O haveged (HArdware Volatile Entropy Gathering and Expansion) é um algoritmo de entropia sem predição que substitui o GPG e vai alimentar o pool e o /dev/random com código de entropia seguro, necessário para o sistema iniciar.

Apenas execute o comando, conforme seu sistema:

$ sudo apt install haveged

E pronto.
Ele será inserido no SystemD imediatamente após a instalação e estará apto para uso após o reinício do sistema. O problema do boot que não exibe a tela de login será resolvido!

5. Análise Opinativa

Eu sinceramente tento entender a lógica da Canonical no desenvolvimento do Ubuntu. E agora que encontrei problemas com outros kerneis se não o nativo 4.15, entendo melhor.

Quando o Ubuntu 18.04 LTS saiu, ele veio com o kernel 4.15; Esse kernel não é LTS e muito menos respaldado pela kernel.org. Ou seja: Quem dá manutenção nesse kernel morto é somente a Canonical. Provavelmente cientes do problema com o GPG, modificaram o sistema para continuar fazendo uso do GPG.

O problema está em casos de quem quer trocar o kernel por um mais estável (4.14.75) ou mais novo (4.19.2): Poderá presenciar o problema de entropia, onde o GPG não está tão otimizado e requer modificações para funcionar a contento – bastou trocar o kernel que o boot travou.

Para essas situações eu particularmente recomendo o rng-tools, resolvendo meu problema e deixando o tempo de boot curiosamente mais rápido.

#UrbanCompassPony

Fontes:
BlogCloudFlare

Deixe um comentário