Verifique o número de atualizações de segurança pendentes no Ubuntu

25

Deixe-me começar dizendo que fui proibido ativar atualizações automáticas em nossos servidores Ubuntu, tanto para segurança quanto para pacotes regulares.

Quando entro em qualquer um dos meus quatro servidores Ubuntu, a mensagem de boas-vindas contém:

39 packages can be updated.
26 updates are security updates.

No entanto, quando executo o plugin Nagios que monitora o APT, recebo:

% /usr/lib/nagios/plugins/check_apt
APT WARNING: 33 packages available for upgrade (0 critical updates). 

Preciso saber como detectar corretamente se há atualizações de segurança pendentes e atualizações regulares. Depois que eu puder fazer isso, planejo escrever um script Nagios que retornará WARNING para atualizações regulares pendentes e CRITICAL para atualizações de segurança pendentes.

Alguém sabe como detectar essas duas condições?

Mak Kolybabi
fonte

Respostas:

12

O plug-in Nagios /usr/lib/nagios/plugins/check_aptnão detecta atualizações críticas no Ubuntu corretamente devido à maneira como detecta atualizações críticas via aptcombinado com a publicação de atualizações não críticas do Ubuntu. Mais detalhes estão no bug aqui: https://bugs.launchpad.net/bugs/1031680

Usar /usr/lib/update-notifier/apt-checkuma alternativa é uma solução confiável.

Robie Basak
fonte
31

Acontece que o número de atualizações regulares pendentes pode ser encontrado usando:

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 1

E o número de atualizações de segurança pendentes pode ser encontrado usando:

/usr/lib/update-notifier/apt-check 2>&1 | cut -d ';' -f 2

No final, meu plugin Nagios foi o seguinte:

#!/bin/sh
#
# Standard Nagios plugin return codes.
STATUS_OK=0
STATUS_WARNING=1
STATUS_CRITICAL=2
STATUS_UNKNOWN=3

# Query pending updates.
updates=$(/usr/lib/update-notifier/apt-check 2>&1)
if [ $? -ne 0 ]; then
    echo "Querying pending updates failed."
    exit $STATUS_UNKNOWN
fi

# Check for the case where there are no updates.
if [ "$updates" = "0;0" ]; then
    echo "All packages are up-to-date."
    exit $STATUS_OK
fi

# Check for pending security updates.
pending=$(echo "${updates}" | cut -d ";" -f 2)
if [ "$pending" != "0" ]; then
    echo "${pending} security update(s) pending."
    exit $STATUS_CRITICAL
fi

# Check for pending non-security updates.
pending=$(echo "${updates}" | cut -d ";" -f 1)
if [ "$pending" != "0" ]; then
    echo "${pending} non-security update(s) pending."
    exit $STATUS_WARNING
fi

# If we've gotten here, we did something wrong since our "0;0" check should have
# matched at the very least.
echo "Script failed, manual intervention required."
exit $STATUS_UNKNOWN
Mak Kolybabi
fonte
1

Por que não usar simplesmente o comando apt-get ?:

apt-get -s dist-upgrade | grep "^Inst" | grep -i security | wc -l
Matías
fonte
2
Esse hack não fará uma distinção confiável entre atualizações de segurança e não relacionadas à segurança. Por exemplo, no Ubuntu, as atualizações de segurança também são publicadas no bolso das atualizações. Se o bolso das atualizações estiver listado primeiro sources.list, sua sugestão levará à falta de notificações de atualização de segurança. O apt escolherá baixá-los do bolso de atualizações, e assim o grep sentirá falta deles.
precisa saber é o seguinte
O problema identificado por @RobieBasak pode ser corrigido de acordo com a minha resposta em serverfault.com/a/856769/134053
mc0e
0

Depois que o Nagios informa que você possui atualizações de segurança, é assim que você obtém uma lista de quais são necessárias.

grep security /etc/apt/sources.list > /tmp/security.list
sudo apt-get upgrade -oDir::Etc::Sourcelist=/tmp/security.list -s

Você também pode usar esses comandos direcionados ao wc -l para obter uma contagem, mas as respostas acima são provavelmente mais eficientes e apropriadas para um script do Nagios.

flickerfly
fonte
"-ODir" é um erro de digitação ?!
Travis van der Font