Configuración de SNMP en Debian
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
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