jueves, 15 de mayo de 2008

Seguridad basica de servicios de red

¿Qué se está ejecutando y con quién se está hablando?

No se pueden empezar a segurar servicios hasta que no se sepa qué se está ejecutando. Para este tipo de tareas, ps y netstat no tienen precio; ps dice qué se está ejecutando (httpd, inetd, etc) y netstat te dirá cuál es el estado de los puertos (llegados a este punto, estamos interesados en los puertos que están abiertos y escuchando, es decir, esperando conexiones). Se les puede echar un vistazo a los diferentes ficheros de configuración que controlan los servicios de red.



Salida de PS

El programa ps nos muestra el estado de procesos (información disponible en el sistema de ficheros virtual /proc). Las opciones más comúnmente utilizadas son "ps -xau", que muestra algo así como toda la información que siempre quisiste saber. Por favor, ten en cuenta: estas opciones cambian entre sistemas UNIX, Solaris, SCO, todos se comportan de manera diferente (lo cual es increíblemente molesto). Lo que viene a continuación es una salida típica de una máquina (utilizando "ps -xau").

USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND

bin 320 0.0 0.6 760 380 ? S Feb 12 0:00 portmap

daemon 377 0.0 0.6 784 404 ? S Feb 12 0:00 /usr/sbin/atd

named 2865 0.0 2.1 2120 1368 ? S 01:14 0:01 /usr/sbin/named -u named -g named -t /home/named

nobody 346 0.0 18.6 12728 11796 ? S Feb 12 3:12 squid

nobody 379 0.0 0.8 1012 544 ? S Feb 12 0:00 (dnsserver)

nobody 380 0.0 0.8 1012 540 ? S Feb 12 0:00 (dnsserver)

nobody 383 0.0 0.6 916 416 ? S Feb 12 0:00 (dnsserver)

nobody 385 0.0 0.8 1192 568 ? S Feb 12 0:00 /usr/bin/ftpget -S 1030

nobody 392 0.0 0.3 716 240 ? S Feb 12 0:00 (unlinkd)

nobody 1553 0.0 1.8 1932 1200 ? S Feb 14 0:00 httpd

nobody 1703 0.0 1.8 1932 1200 ? S Feb 14 0:00 httpd

root 1 0.0 0.6 776 404 ? S Feb 12 0:04 init [3]

root 2 0.0 0.0 0 0 ? SW Feb 12 0:00 (kflushd)

root 3 0.0 0.0 0 0 ? SW Feb 12 0:00 (kswapd)

root 4 0.0 0.0 0 0 ? SW Feb 12 0:00 (md_thread)

root 64 0.0 0.5 736 348 ? S Feb 12 0:00 kerneld

root 357 0.0 0.6 800 432 ? S Feb 12 0:05 syslogd

root 366 0.0 1.0 1056 684 ? S Feb 12 0:01 klogd

root 393 0.0 0.7 852 472 ? S Feb 12 0:00 crond

root 427 0.0 0.9 1272 592 ? S Feb 12 0:19 /usr/sbin/sshd

root 438 0.0 1.0 1184 672 ? S Feb 12 0:00 rpc.mountd

root 447 0.0 1.0 1180 644 ? S Feb 12 0:00 rpc.nfsd

root 458 0.0 1.0 1072 680 ? S Feb 12 0:00 /usr/sbin/dhcpd

root 489 0.0 1.7 1884 1096 ? S Feb 12 0:00 httpd

root 503 0.0 0.4 724 296 2 S Feb 12 0:00 /sbin/mingetty tty2

root 505 0.0 0.3 720 228 ? S Feb 12 0:02 update (bdflush)

root 541 0.0 0.4 724 296 1 S Feb 12 0:00 /sbin/mingetty tty1

root 1372 0.0 0.6 772 396 ? S Feb 13 0:00 inetd

root 1473 0.0 1.5 1492 1000 ? S Feb 13 0:00 sendmail: accepting connections on port 25

root 2862 0.0 0.0 188 44 ? S 01:14 0:00 /usr/sbin/holelogd.named /home/named/dev/log

root 3090 0.0 1.9 1864 1232 ? S 12:16 0:02 /usr/sbin/sshd

root 3103 0.0 1.1 1448 728 p1 S 12:16 0:00 su -root 3104 0.0 1.3 1268 864 p1 S 12:16 0:00 -bash

root 3136 0.0 1.9 1836 1212 ? S 12:21 0:04 /usr/sbin/sshd

Los interesantes son: portmap, named, Squid (y su servidor dns, los procesos hijos unlinkd y ftpget), httpd, syslogd, sshd, rpc.mountd, rpc.nfsd, dhcpd, inetd, y sendmail (este servidor parece estar proveyendo servicios de puerta de enlace, correo y compartición de ficheros FNS). La forma más fácil de aprender a leer la salida de ps es irse a la página del manual de ps y aprender a qué se refiere cada campo (la mayoría se explican por sí mismos, tales como el %CPU, mientras que algunos como SIZE son un poco más oscuros: SIZE es el número de páginas de memoria de 4k que está utilizando un programa). Para averiguar qué programas se están ejecutando, una apuesta segura es hacer ‘man ’; lo cual casi siempre suele sacar la página del manual que pertenece a ese servicio (como httpd). Te darás cuenta de que servicios como telnet, ftpd, identd y otros no aparecen aunque estén ahí. Esto es debido a que se ejecutan desde inetd, el "superservidor". Para encontrar estos servicios, mira en /etc/inetd.conf o en la salida de "netstat -vat".



Salida de Netstat

netstat informa acerca de casi cualquier cosa que se pueda imaginar relacionada con la red. Es especialmente buena para sacar listados de conexiones y sockets activos. Al usar netstat se puede encontrar qué interfaces están activas en qué puertos. Lo que viene a continuación es la salida típica de un servidor, con netstat –an.

Active Internet connections (including servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 24.108.11.200:80 205.253.183.122:3661 ESTABLISHED

tcp 0 0 0.0.0.0:1036 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN

tcp 0 0 10.0.0.10:53 0.0.0.0:* LISTEN

tcp 0 0 28.208.55.254:53 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:635 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN

udp 0 0 127.0.0.1:1031 0.0.0.0:*

udp 0 0 0.0.0.0:1029 0.0.0.0:*

udp 0 0 0.0.0.0:800 0.0.0.0:*

udp 0 0 0.0.0.0:1028 0.0.0.0:*

udp 0 0 10.0.0.10:53 0.0.0.0:*

udp 0 0 28.208.55.254:53 0.0.0.0:*

udp 0 0 127.0.0.1:53 0.0.0.0:*

udp 0 0 10.1.0.1:138 0.0.0.0:*

udp 0 0 10.1.0.1:137 0.0.0.0:*

udp 0 0 10.0.0.10:138 0.0.0.0:*

udp 0 0 10.0.0.10:137 0.0.0.0:*

udp 0 0 0.0.0.0:138 0.0.0.0:*

udp 0 0 0.0.0.0:137 0.0.0.0:*

udp 0 0 0.0.0.0:2049 0.0.0.0:*

udp 0 0 0.0.0.0:635 0.0.0.0:*

udp 0 0 0.0.0.0:514 0.0.0.0:*

udp 0 0 0.0.0.0:111 0.0.0.0:*

raw 0 0 0.0.0.0:1 0.0.0.0:*

raw 0 0 0.0.0.0:6 0.0.0.0:*

En mi opinión la salida numérica es más fácil de leer (una vez que se memoriza /etc/services). Los campos que nos interesan son el primero, el tipo de servicio, el cuarto campo, que es la dirección IP de la interfaz y el puerto, la dirección externa (si no es 0.0.0.0.* significa que alguien le está hablando activamente), y el estado del puerto. La primera línea es un cliente remoto hablando con el servidor de Web de esta máquina (puerto 80). Cuando se ve el servidor www escuchando en 0.0.0.0:80 que significa, todos los interfaces, puerto 80, seguidos del servidor DNS ejecutándose en las 3 interfaces, un servidor samba (139), un servidor de correo (25), un servidor NFS (2049), etc. Observarás listado el servidor de ftp (21), que aunque se ejecuta desde inetd, y aunque actualmente no está en uso (p. ej., no hay nadie activo haciendo un ftp), sale en el listado de la salida de netstat. Lo cual convierte a netstat en una herramienta especialmente útil para averiguar qué es lo que está activo en una máquina, haciendo más sencillo el inventariado en el servidor del software activo e inactivo.



lsof

lsof es un práctico programa cuya idea es similar a la de ps, excepto en que muestra qué ficheros/etc están abiertos, lo cual puede incluir sockets de red. Desafortunadamente, el lsof medio saca bastante información, de modo que será necesario utilizar grep o redireccionarlo mediante less ("lsof | less") para hacerlo más cómodo de leer.

squid 9726 root 4u inet 78774 TCP localhost:2074->localhost:2073 (ESTABLISHED)

squid 9726 root 5u inet 78777 TCP localhost:2076->localhost:2075 (ESTABLISHED)

squid 9726 root 6u inet 78780 TCP localhost:2078->localhost:2077 (ESTABLISHED)

squid 9726 root 7w CHR 1,3 6205 /dev/null

squid 9726 root 14u inet 78789 TCP host1:3128 (LISTEN)

squid 9726 root 15u inet 78790 UDP host1:3130

squid 9726 root 16u inet 78791 UDP host1:3130

squid 9726 root 12u inet 167524 TCP host1:3128->host2:3630 (ESTABLISHED)

squid 9726 root 17u inet 167528 TCP host1:3424->www.ejemplo.org:http (SYN_SENT)

Este ejemplo muestra que se tiene ejecutándose a Squid, escuchando en los puertos 3128 y 3130, las últimas dos líneas muestran una conexión abierta desde un host interno al servidor de Squid y la acción resultante que ha emprendido Squid para cumplir con la solicitud (ir a www.playboy.com) host1 es el servidor de Squid y host2 es la máquina cliente haciendo la petición. Es una herramienta que no tiene precio para hacerse una idea exacta de qué es lo que está ocurriendo con tu servidor en la red. Se puede conseguir lsof con algunas distribuciones. Ten en cuenta que las versiones de losf compiladas para las versiones del kernel 2.0.x no funcionarán con el kernel 2.2.x y vice versa, pues hay bastantes cambios. El sitio primario de lsof es: ftp://vic.cc.purdue.edu/pub/tools/unix/lsof/∞

No hay comentarios: