Permitindo que o plugin nagios check_dhcp trabalhe sem root setuid

3

O Nagios tem um plugin, check_dhcp , que faz exatamente o que você pensa . É amplamente sugerido para instalá-lo root setuid, porque usa SO_BINDTODEVICE , que normalmente só o root pode fazer. É claro que uma coisa semelhante pode ser realizada com sudo , mas resta que check_dhcp estaria executando com todos os privilégios de root quando não precisa deles.

Infelizmente, check_dhcp parece ser estupidamente escrito para esse uso, e não tenta perder privilégios de root depois de fazer o que precisa fazer. Isso leva a pelo menos um problema de segurança conhecido , mas apenas geralmente é uma má prática e eu gostaria de não fazê-lo.

Então, estou pensando, há alguma maneira de ativar o check_dhcp para fazer sua interface de rede necessária, sem conceder a ele todos os privilégios de root? Talvez algo com recursos, SELinux, AppArmor ou similar? Procurando por uma solução Linux - Ubuntu 14.04 em particular.

    
por Phil Frost 23.07.2014 / 15:35

2 respostas

9

SO_BINDTODEVICE requer CAP_NET_RAW . check_dhcp também deseja ligar à porta 68, que requer CAP_NET_BIND_SERVICE . Veja as capacidades (7) para descrições detalhadas das capacidades disponíveis.

Esses dois recursos podem ser concedidos ao executável com setcap , como isso:

setcap 'cap_net_raw,cap_net_bind_service=+ep' /usr/lib/nagios/plugins/check_dhcp

Isso deve permitir que qualquer usuário execute check_dhcp com êxito, sem possivelmente (se puder explorar check_dhcp ), fornecendo privilégios completos de root.

O plug-in ainda emitirá um aviso (um pouco estupidamente):

$ ./check_dhcp 
Warning: This plugin must be either run as root or setuid root.
To run as root, you can use a tool like sudo.
To set the setuid permissions, use the command:
    chmod u+s yourpluginfile
OK: Received 2 DHCPOFFER(s), max lease time = 259200 sec.

Para resolver isso, você poderia:

  • Ignore-o. O Nagios ainda vai olhar para o status de saída para obter o estado do plugin.
  • Remova a chamada para np_warn_if_not_root e recompilar.
  • Use o fork monitoring-plugins.org dos plug-ins do Nagios, que tem fixed this issue . debmon.org tem pacotes Debian disponíveis.
  • Modifique a definição do comando Nagios para executar o plug-in através do grep, removendo o aviso. É claro que agora você deve tomar cuidado para não alterar o código de saída do plug-in, então talvez você queira incluir isso em um script:
#!/bin/bash
/usr/lib/nagios3/plugins/check_dhcp | egrep -v 'run as root|^To |chmod u\+s'
exit "${PIPESTATUS[0]}"
    
por 23.07.2014 / 16:24
1

Com a maioria dos plug-ins padrão (escritos em C), existem implementações alternativas (não C) no Nagios Exchange.

Por exemplo, há um perl check_dhcp que é realmente apenas um wrapper em torno de dhcping . É claro que o binário do dhcping também precisa ser executado via root / sudo / setuid-root, mas talvez esse binário seja menos preocupante para você do que o plugin stock check_dhcp.

    
por 23.07.2014 / 18:59