Configuración de SNMP en Debian

De WikiSalud
Revisión a fecha de 18:04 5 sep 2017; Alortiz (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar

Contenido

Resumen

Instalación y configuración de snmp, con enfásis en la configuración de SNMP v3 con autenticación y cifrado

Introducción

SNMP (Simple Network Management Protocol) fue en su momento pensado para habilitar la configuración de sistemas por medio de red en forma estándar; si bien aún puede ser usado de esta forma, lo cierto es que su uso más amplio hoy en día se refiere al monitoreo de equipos. SNMP se consideró por mucho tiempo como un protocolo bastante inseguro, hasta que la versión 3 del mismo ha incluido autenticación y cifrado de la comunicación, configuración que debería ser el objetivo de cualquier nueva instalación hoy en día.

Guía de configuración

Instalación

Para Debian, instalar el paquete es tan sencillo como ejecutar como root desde consola:

apt-get install snmpd

Configuración

El fichero de configuración en /etc/snmp/snmpd.conf por el momento va de la siguiente forma, ahora sigue estando en funcionamiento:

###############################################################################
#
#  AGENT BEHAVIOUR
#

#  Listen for connections from the local system only
agentAddress  udp:161
#  Listen for connections on all interfaces (both IPv4 *and* IPv6)
#agentAddress udp:161,udp6:[::1]:161



###############################################################################
#
#  SNMPv3 AUTHENTICATION
#
createUser alortiz      
createUser mafi         MD5 "fsrv2025" DES "fsrv2025"
createUser mafi2        SHA "fsrv2025" DES "fsrv2025"
# No, pos SHA-1, al menos, siempre
createUser kpena        SHA "fsrv2025" DES "fsrv2025"
# No, pos AES siempre, siempre
createUser kpenate      SHA "fsrv2025" AES "fsrv2025"


###############################################################################
#
#  ACCESS CONTROL
#
                                                 #  system + hrSystem groups only
view   systemonly  included   .1.3.6.1.2.1.1
view   systemonly  included   .1.3.6.1.2.1.25.1

rocommunity minsal  default    -V systemonly
                                                 #  rocommunity6 is for IPv6
                                                 #  Full read-only access for SNMPv3
rouser  alortiz         noauth  1.3.6.1.2.1
rouser  mafi            auth    1.3.6.1.2.1
rouser  mafi2           auth    1.3.6.1.2.1
rouser  kpena           auth    1.3.6.1.2.1
rouser  kpenate         priv    1.3.6.1.2.1

#  It's no longer typically necessary to use the full 'com2sec/group/access' configuration
#  r[ow]user and r[ow]community, together with suitable views, should cover most requirements


###############################################################################
#
#  SYSTEM INFORMATION
#

#  Note that setting these values here, results in the corresponding MIB objects being 'read-only'
#  See snmpd.conf(5) for more details
sysLocation    Minsal
sysContact     Alexander Ortíz <alortiz@salud.gob.sv>
                                                 # Application + End-to-End layers
sysServices    72

#
#  Process Monitoring
#
                               # At least one  'mountd' process
proc  mountd
                               # No more than 4 'ntalkd' processes - 0 is OK
proc  ntalkd    4
                               # At least one 'sendmail' process, but no more than 10
proc  sendmail 10 1

#  Walk the UCD-SNMP-MIB::prTable to see the resulting output
#  Note that this table will be empty if there are no "proc" entries in the snmpd.conf file


#
#  Disk Monitoring
#
                               # 10MBs required on root disk, 5% free on /var, 10% free on all other disks
disk       /     10000
disk       /var  5%
includeAllDisks  10%

#  Walk the UCD-SNMP-MIB::dskTable to see the resulting output
#  Note that this table will be empty if there are no "disk" entries in the snmpd.conf file


#
#  System Load
#
                               # Unacceptable 1-, 5-, and 15-minute load averages
load   12 10 5

#  Walk the UCD-SNMP-MIB::laTable to see the resulting output
#  Note that this table *will* be populated, even without a "load" entry in the snmpd.conf file



###############################################################################
#
#  ACTIVE MONITORING
#

                                    #   send SNMPv1  traps
 trapsink     localhost public
                                    #   send SNMPv2c traps
#trap2sink    localhost public
                                    #   send SNMPv2c INFORMs
#informsink   localhost public

#  Note that you typically only want *one* of these three lines
#  Uncommenting two (or all three) will result in multiple copies of each notification.


#
#  Event MIB - automatically generate alerts
#
                                   # Remember to activate the 'createUser' lines above
iquerySecName   internalUser       
rouser          internalUser
                                   # generate traps on UCD error conditions
defaultMonitors          yes
                                   # generate traps on linkUp/Down
linkUpDownNotifications  yes



###############################################################################
#
#  EXTENDING THE AGENT
#

#
#  Arbitrary extension commands
#
#extend-sh test3   /bin/sh /tmp/shtest

#
#  "Pass-through" MIB extension command
#
#pass .1.3.6.1.4.1.8072.2.255  /bin/sh       PREFIX/local/passtest
#pass .1.3.6.1.4.1.8072.2.255  /usr/bin/perl PREFIX/local/passtest.pl

# Note that this requires one of the two 'passtest' scripts to be installed first,
#    before the appropriate line is uncommented.
# These scripts can be found in the 'local' directory of the source distribution,
#     and are not installed automatically.

#  Walk the NET-SNMP-PASS-MIB::netSnmpPassExamples subtree to see the resulting output


#
#  AgentX Sub-agents
#
                                           #  Run as an AgentX master agent
 master          agentx
                                           #  Listen for network connections (from localhost)
                                           #    rather than the default named socket /var/agentx/master
#agentXSocket    tcp:localhost:705

Una vez configurado de esta manera, debe reiniciarse el equipo:

systemctl restart snmpd.service

Comprobación

Como siempre, debe verificarse la configuración desde un equipo externo, con confianza. En dicho equipo externo debe instalarse el paquete net-snmp-utils o snmp, pero la idea es tener las utilerías y no el servidor SNMP

Primer configuramos un OID conocido para no tener que escribirlo cada vez:

iso='iso.3.6.1.2.1.1.5.0'

En este punto tenemos dos opciones: snmpget y snmpwalk, su diferencia más fundamental es que al primero es necesario especificarle un OID, y este recogerá especifícamente este. snmpwalk es un poco más recursivo, tanto como si le especificamos un OID como si debe usar el OID más alto al que tiene acceso, empezará a recoger todas las ramas bajo este.

  • SNMP v1, especifica comunidad minsal. Este tipo de consultas debería estar bastante restringida, o mejor aún, estar totalmente deshabilitada
snmpwalk -c minsal -v1 192.168.2.24 $iso
SNMPv2-MIB::sysName.0 = STRING: fw-establecimiento
  • SNMP v2c, entre sus pocas diferencias con v1 se encuentran una mejora en la longitud de sus índices internos, nada más.
snmpwalk -c minsal -v2c 192.168.2.24 $iso
SNMPv2-MIB::sysName.0 = STRING: fw-establecimiento
  • Parece que con SNMP v3, al menos un usuario es necesario. Nuestro usuario más inseguro es alortiz según la configuración en SNMP
...
createUser alortiz
...
rouser  alortiz         noauth  1.3.6.1.2.1

Verificamos con alortiz desde consola :

snmpwalk -c minsal -v3 -u alortiz 192.168.2.24 $iso
SNMPv2-MIB::sysName.0 = STRING: fw-establecimiento
  • El usuario mafi necesita que se especifique su nivel de autenticación:
...
createUser mafi         MD5 "fsrv2025" DES "fsrv2025"
...
rouser  mafi            auth    1.3.6.1.2.1

... devolviendo un mensaje de error si este no se especifica

snmpwalk -c minsal -v3 -u mafi 192.168.2.24 $iso
Error in packet.
Reason: authorizationError (access denied to that object)

... Y actuando como se espera al hacerlo

snmpwalk -c minsal -v3 -u mafi -l authNoPriv -A fsrv2025 192.168.2.24 $iso
SNMPv2-MIB::sysName.0 = STRING: fw-establecimiento
  • El usuario kpena necesita además que se especifique el tipo de hash (SHA-1, que se considera bastante seguro) para la contraseña:
...
createUser mafi2        SHA "fsrv2025" DES "fsrv2025"
...
rouser  mafi2           auth    1.3.6.1.2.1

... Devolviendo un mensaje de error si este no se específica

snmpwalk -c minsal -v3 -u kpena -l authNoPriv -A fsrv2025 192.168.2.24 $iso
snmpwalk: Authentication failure (incorrect password, community or key)

... Y, claro, actuando como se espera de hacerlo

snmpwalk -c minsal -v3 -u kpena -l authNoPriv -a SHA -A fsrv2025 192.168.2.24 $iso
SNMPv2-MIB::sysName.0 = STRING: fw-establecimiento
  • El usuario kpenate es como la joya de la corona.
...
createUser kpenate      SHA "fsrv2025" AES "fsrv2025"
...
rouser  kpenate         priv    1.3.6.1
...

Su configuración requiere que se especifique el protocolo de cifrado de datos, AES en nuestro ejemplo. Y configurado así, necesita especificar la frase que se usa para cifrarlos.

snmpwalk -c minsal -v3 -u kpenate -l authPriv -a SHA -A fsrv2025 -x AES -X fsrv2025 192.168.2.24 $iso
SNMPv2-MIB::sysName.0 = STRING: fw-establecimiento

No especificarlo genera un error del tipo:

snmpwalk -c minsal -v3 -u kpenate -l authPriv -a SHA -A fsrv2025 -x AES  192.168.2.24 $iso
snmpwalk: USM generic error

Y hacerlo mal genera un error bastante confuso (En general, por eso me tomé el tiempo de recoger algunos de los mensajes de error

snmpwalk -c minsal -v3 -u kpenate -l authPriv -a SHA -A fsrv2025 -x AES -X falsofalso 192.168.2.24 $iso
Timeout: No Response from 192.168.2.24

(En este punto, es evidente que los errores de snmp no son nada evidentes ni tan congruentes como podríamos esperar)

Un intento por usar un nivel de autenticación más bajo resulta en error:

snmpwalk -c minsal -v3 -u kpenate -l authNoPriv -a SHA -A fsrv2025 -x AES -X fsrv2025 192.168.2.24 $iso
Error in packet.
Reason: authorizationError (access denied to that object)


Entiendo que pueda haber mucha curiosidad sobre este último punto. Yo mismo la tuve, por lo que me decidí verificarlo. Los paquetes marcados en el recuadro pertenecen a una petición hecha con el usuario kpenate

01 - snmp.png

Mejoras

Desactivando SNMP v1 y v2c

La primera será desactivar a los usuarios alortiz, mafi y kpena, que son una verdadera riesgo de seguridad. Desde el primero que no necesita de contraseña, a todos, que no urgen de cifrar la comunicación. Con esto, sigue siendo posible hacer consultas usando v1, que claro, son bastante parciales según se define en systemonly, pero sigue dando información que no deberíamos hacer disponible

snmpwalk -On -c minsal -v1 192.168.2.24 
.1.3.6.1.2.1.1.1.0 = STRING: Linux fw-establecimiento 4.9.0-3-amd64 #1 SMP Debian 4.9.30-2+deb9u2 (2017-06-26) x86_64
.1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.8072.3.2.10
.1.3.6.1.2.1.1.3.0 = Timeticks: (12418) 0:02:04.18
.1.3.6.1.2.1.1.4.0 = STRING: Alexander Ort..z <alortiz@salud.gob.sv>
.1.3.6.1.2.1.1.5.0 = STRING: fw-establecimiento
.1.3.6.1.2.1.1.6.0 = STRING: Minsal
.1.3.6.1.2.1.1.7.0 = INTEGER: 72
.1.3.6.1.2.1.1.8.0 = Timeticks: (1) 0:00:00.01
...

Para esto, bastará con borrar o comentar la línea respectiva de comunidad, habiendo configurado un usuario con el cual conectarse

# rocommunity minsal  default    -V systemonly

Ahora la comunidad minsal esta abajo

snmpwalk -c minsal -v1 192.168.2.24 
Timeout: No Response from 192.168.2.24

Especificando más de una rama OID

Mientras que 1.3.6.1.2.1 muestra casi que todo lo que se puede saber con el sistema, habría ocasiones en que se quiera acceder a otras partes del árbol, para lo cual podría considerarse base a 1.3.6.1.6, que engloba a toda la rama disponible, lo que incluye por ejemplo a 1.3.6.1.6, que dejaría disponible la configuración misma de SNMP. Podemos granularizar los permisos sobre que puede ver o no un usuario mediante las vistas. En el ejemplo, la vista vmonitoreo permite a kpenate ver dos ramas bastante distintas del árbol SNMP

...
view    vmonitoreo  included    .1.3.6.1.2.1
view    vmonitoreo  included    .1.3.6.1.4.1.2021.7890
...
rouser  kpenate     priv    -V vmonitoreo

Extendiendo el agente

Es posible extender el agente de monitoreo SNMP con lo que parecen ser comandos personalizados. Pues como la idea de todo eso fue la de usar LibreNMS, nada, que agregamos lo que nos dicen en su guía oficial:

...
###############################################################################
#
#  EXTENDING THE AGENT
#

#
#  Arbitrary extension commands
#
extend .1.3.6.1.4.1.2021.7890.1 distro /usr/bin/distro
extend .1.3.6.1.4.1.2021.7890.2 hardware '/usr/sbin/dmidecode -s system-product-name'
extend .1.3.6.1.4.1.2021.7890.3 manufacturer '/usr/sbin/dmidecode -s system-manufacturer'
extend .1.3.6.1.4.1.2021.7890.4 serial '/usr/sbin/dmidecode -s system-serial-number'
...

El comando distro necesita conseguirse desde su repositorio. En Debian, wget esta casi siempre disponible:

wget https://raw.githubusercontent.com/librenms/librenms-agent/master/snmp/distro -O /usr/bin/distro
chmod +x /usr/bin/distro

Como en Debian los procesos de snmp se ejecutan con el usuario Debian-snmp, sería necesario agregar una configuración en sudo que le permita a este usar a dmidecode sin problemas:

echo "Debian-snmp ALL=(ALL) NOPASSWD:/usr/sbin/dmidecode" >/etc/sudoers.d/snmp

Se quiera agregar o no estas últimas extensiones, el archivo mínimo para funcionar con SNMP v3 (en exclusiva), parece quedar de la siguiente forma:

###############################################################################
#
#  AGENT BEHAVIOUR
#

#  Listen for connections on IPv4 interfaces
agentAddress  udp:161


###############################################################################
#
#  SNMPv3 AUTHENTICATION
#
# SHA-1 y AES, siempre
createUser kpenate      SHA "fsrv2025" AES "fsrv2025"


###############################################################################
#
#  ACCESS CONTROL
#
view    vmonitoreo  included    .1.3.6.1.2.1
view    vmonitoreo  included    .1.3.6.1.4.1.2021.7890
# Se refiere a la rama UCD, librenms la usa para el uso de memoria que se muestra en la cabecera de cada host
view    vmonitoreo  included    .1.3.6.1.4.1.2021.4

rouser  kpenate     priv    -V vmonitoreo

###############################################################################
#
#  SYSTEM INFORMATION
#

#  Note that setting these values here, results in the corresponding MIB objects being 'read-only'
#  See snmpd.conf(5) for more details
sysLocation    Minsal
sysContact     Alexander Ortíz <alortiz@salud.gob.sv>
                                                 # Application + End-to-End layers
sysServices    72

#  Walk the UCD-SNMP-MIB::prTable to see the resulting output
#  Note that this table will be empty if there are no "proc" entries in the snmpd.conf file


#
#  Disk Monitoring
#
                               # 10MBs required on root disk, 5% free on /var, 10% free on all other disks
disk       /     10000
disk       /var  5%
includeAllDisks  10%

#
#  System Load
#
                               # Unacceptable 1-, 5-, and 15-minute load averages
load   12 10 5

#  Walk the UCD-SNMP-MIB::laTable to see the resulting output
#  Note that this table *will* be populated, even without a "load" entry in the snmpd.conf file

###############################################################################
#
#  EXTENDING THE AGENT
#

#
#  Arbitrary extension commands
#
#extend .1.3.6.1.4.1.2021.7890.1 distro /usr/bin/distro
#extend .1.3.6.1.4.1.2021.7890.2 hardware '/usr/bin/sudo /usr/sbin/dmidecode -s system-product-name'
#extend .1.3.6.1.4.1.2021.7890.3 manufacturer '/usr/bin/sudo /usr/sbin/dmidecode -s system-manufacturer'
#extend .1.3.6.1.4.1.2021.7890.4 serial '/usr/bin/sudo /usr/sbin/dmidecode -s system-serial-number'


#
#  AgentX Sub-agents
#
                                           #  Run as an AgentX master agent
 master          agentx
                                           #  Listen for network connections (from localhost)
                                           #    rather than the default named socket /var/agentx/master
#agentXSocket    tcp:localhost:705

Fuentes

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas