domingo, 8 de novembro de 2015

Nova Nomenclatura de Interfaces Previsíveis no Linux

Olá Pessoal

Recentemente, a partir da versão v197 do systemd/udev, o Linux passou a utilizar um novo mecanismo para nomenclatura das interfaces de redes, denominado Predictable Network Interface Names. O objetivo da nova nomenclatura foi solucionar problemas reais decorrentes da generalização dos nomes tradicionais que utilizavam o formato ethX (ethernet), wlanX (wireless), etc.

O problema da nomenclatura tradicional é que as interfaces de mesma natureza recebem seus nomes do kernel de maneira sequencial (no formato eth0, eth1, eth2, etc...) assim que elas são consultadas pelo driver. Ocorre que o mecanismo de comunicação entre o driver e a interface não é previsível, o que implica na possibilidade de alteração nos nomes das interfaces durante o processo de boot de máquinas que tenham múltiplas interfaces de rede em caso de atualização de hardware. Essa situação traz riscos de segurança em ambientes que tenham scripts de firewall que foram baseados nos nomes tradicionais.

Obs.: O leitor pode fazer um teste rápido para verificar essa situação usando um liveCD em máquina que tenha duas interfaces de rede. Repare que a indexação das interfaces ocorre de forma aleatória a cada boot. Em sistemas devidamente instalados os nomes permanecem persistentes depois de atribuídos pelo kernel até que haja alguma alteração de hardware que demande nova reindexação. 

O novo mecanismo de nomenclatura traz suporte nativo a diferentes políticas para nomeação das interfaces de rede, a destacar:

  1. Nomes Indexados via Firmware/BIOS On-Board
  2. Nomes Indexados via Firmware/BIOS PCI Express
  3. Nomes Indexados via Localização Física do Hardware
  4. Nomes Indexados via Endereço Físico (MAC)
  5. Nomes Clássicos Nativos do Kernel (Imprevisíveis)

Todas essas políticas são utilizadas em conjunto, de forma que a primeira política será adotada caso as informações do firmware on-board estejam disponíveis, seguida pela segunda política caso as informações do firmware PCI estejam disponíveis, seguida pela terceira política se disponível, seguida da quinta política caso contrário. A quarta política não é utilizada por padrão, a menos que seja explicitamente configurada pelo administrador. Por exemplo, possíveis nomes de interfaces baseados na primeira, segunda, terceira, quarta e quinta políticas, respectivamente, seriam: eno1, ens1, enp2s0, enx78e7d1ea46da e eth0


Apesar das políticas padrões, as configurações realizadas pelo administrador sempre têm precedência. Ou seja, se o administrador criar links para outras regras udev, por exemplo para utilizar seus próprios nomes personalizados ou mesmo os nomes tradicionais, o novo mecanismo de nomenclatura previsível não será adotado. A nova nomenclatura previsível pode ser desativada, fazendo com que o sistema volte a utilizar os nomes tradicionais, através da simples passagem de uma instrução ao kernel durante o processo de boot. Essa tarefa pode ser realizada adicionando a seguinte linha  no arquivo de configuração do GRUB que fica localizado em /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0

Obs.: Reparem que em distribuições desktop é provável que a opção "quiet splash" esteja presente para que o usuário, durante o processo de boot, não tenha contato direto com as várias informações de inicialização do sistema, sendo que, ao invés disso, o usuário visualiza na tela uma imagem de inicialização (splash). Se for esse o caso, basta adicionar o parâmetro net.ifnames na sequência, depois de um espaço e dentro das aspas.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash net.ifnames=0"

Para que as alterações no arquivo de configuração do GRUB tenham efeito a partir do próximo boot, é necessário digitar update-grub. Façam seus testes...

6 comentários:

  1. Outra opção é criar um link para negar as novas regras previsíveis:
     
    > a partir da v209 do systemd/udev
    ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules

     
    > da v197 até v208 do systemd/udev
    ln -s /dev/null /etc/udev/rules.d/80-net-name-slot.rules

    ResponderExcluir
  2. Cara, eu estava com dificuldades por causa dessa praga !!! Muito, como sempre na frente... Parabens

    ResponderExcluir
  3. Professor, essa falha de segurança comprometeria o que por exemplo, é algo que poderia permitir ganho de privilegios ou somente no caso perda de desempenho ou o dispositivo parar de funcionar?

    Grato...

    ResponderExcluir
    Respostas
    1. Não tem relação nenhuma com nível de acesso ou desempenho. A questão é que na escrita de scripts com regras de firewall é comum declararmos variáveis que fazem referência aos nomes das interfaces. Ocorre que esses scripts não irão funcionar automaticamente caso o(s) nome(s) da(s) interface(s) venha(m) a mudar por qualquer motivo. Por isso é importante que as interfaces de rede tenham nomes previsíveis, principalmente em servidores e roteadores.

      Excluir
  4. Caso sua interface já tenha sido inicializada previamente e a alteração do arquivo "/etc/default/grub" não funcione, outra opção é criar (ou editar) o arquivo "/etc/udev/rules.d/10-network.rules". O conteúdo abaixo deve ser inserido no arquivo, sendo que o endereço MAC da(s) interface(s) de rede deve(m) ser informado(s) manualmente no parêmtro ATTR{address}. Logo no sequência o parêmtro NAME deve ser alterado para personalizar o nome que será utilizado pela interface.

    Em: /etc/udev/rules.d/10-network.rules

    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="AA:AA:AA:AA:AA:AA", NAME="wlan0"

    ResponderExcluir