Configuración inicial del sistema

Protección del sistema de arranqe

Como ya hemos explicado anteriormente, si queremos que nuestra máquina no pueda ser manipulada por alguien con acceso físico límitado a la misma deberemos proteger el acceso a la BIOS para evitar que se pueda arrancar desde un dispositivo que no sea el disco duro (si es un servidor en producción no pondremos clave de arranque al PC, ya que si se va la luz haría falta entrar directamente en la máquina para reiniciar) y además deberemos proteger el bootloader para que no permita modificar los parámetros de arranque del núcleo.

El método para hacerlo ya ha sido explicado en puntos anteriores del curso.

Sistemas de autentificación de usuarios y elección de contraseñas

En principio usaremos la autentificación tradicional de Unix (usando los ficheros /etc/passwd y /etc/group) pero con shadow passwords (el fichero de claves, que es legible para todos los usuarios, no contendrá las versiones cifradas de las contraseñas, estas estarán en el fichero /etc/shadow, que sólo puede leer el administrador) y cifrado de claves con MD5 en lugar de crypt (nos permite usar claves más largas y es más seguro criptográficamente hablando).

Aunque hemos dicho que tanto en Linux como en Solaris vamos a usar ficheros tradicionales, lo cierto es que lo que vamos a usar son los módulos de autentificación tradicional de Unix de PAM (''Pluggable Autentication Modules''), que es una biblioteca con la que se enlazan la mayoría de programas que requeren identificar a los usuarios.

PAM es un mecanísmo flexible para la autentificación de usuarios, permite que el administrador configure para cada aplicación un sistemas de identificación distinto sin necesidad de modificar el código del programa.

El PAM permite configurar 4 tipos distintos de módulos:

auth

Módulos de autentificación, comprueban que una clave corresponde a un usuario.

account

Módulos de contabilidad, realizan verificaciones que no tienen que ver con las claves, como comprobar la caducidad de los 'passwords' o ver

si el usuario puede acceder a una determinada hora.

session

Módulo de session, se emplea para realizar tareas que no tienen nada que ver con la gestión de claves, como guardar un log de inicio de sesión, montar o crear directorios, etc.

password

Módulo empleados para el cambio de claves.

Dependiendo del uso que se vaya a hacer del sistema puede ser muy interesante conocer como funciona el PAM, para más información se pueden mirar los siguientes sitios WEB:

Sistemas cortafuegos

Cortafuegos en Linux

En Debian y RedHat usaremos netfilter, que es el subsistema cortafuegos incluído en los núcleos de Linux en las series 2.4.x y posteriores. Este sistema nos proporciona funcionalidad de cortafuegos (con y sin estado), varios tipos de NAT (Network Address Translation) y nos permite manipular los paquetes.

En muchas ocasiones emplearemos el nombre iptables al nos referiremos a netfilter. En realidad lo que sucede es que el sistema se llama netfilter, pero la herrmienta que emplearemos para configurarlo se llama iptables.

Este sistema es muy potente y permite hacer gran cantidad de cosas con los paquetes que entran, salen y atraviesan nuestros sistemas; aquel que esté interesado encontrará mucha información de como usarlo en: http://www.netfilter.org/.

En lo que sigue explicaremos como instalar el cortafuegos inicial en un sistema Debian GNU/Linux, ya que la última versión de RedHat nos ayuda a configurar un cortafuegos sencillo durante la instalación y nos genera un script similar al que proponemos para debian.

Para configurar el cortafuegos emplearemos el programa iptables; en principio lo que haremos será arrancar el sistema sin conexión física a la red o en modo mono usuario (runlevel 1) y una vez identificados como administradores haremos:

  cseg:~# iptables -L
  Chain INPUT (policy ACCEPT)
  target     prot opt source               destination         
  Chain FORWARD (policy ACCEPT)
  target     prot opt source               destination         
  Chain OUTPUT (policy ACCEPT)
  target     prot opt source               destination         

Esto nos dice que no tenemos ninguna regla configurada.

A continuación presentamos los comandos que ejecutaríamos para configurar un cortafuegos sencillo:

  # Por defecto no aceptamos nada en la entrada ni en el forwarding
  iptables -P INPUT   DROP
  iptables -P FORWARD DROP
  # Pero aceptamos los paquetes de salida
  iptables -P OUTPUT  ACCEPT
  # Definimos una tabla para registrar conexiones y aceptarlas
  iptables -N LOGACCEPT
  iptables -A LOGACCEPT -m limit --limit 3/hour -j LOG --log-prefix "LOG_ACCEPT: "
  iptables -A LOGACCEPT -m limit --limit 3/hour -j ACCEPT
  # Definimos una tabla para registrar conexiones e ignorarlas
  iptables -N LOGDROP
  iptables -A LOGDROP -m limit --limit 3/hour -j LOG --log-prefix "LOG_DROP: "
  iptables -A LOGDROP -m limit --limit 3/hour -j DROP  
  # Input
  # -----
  # Loopback -- aceptamos todo
  iptables -A INPUT -i lo -j ACCEPT
  # Aceptamos conexiones establecidas
  iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  # Aceptamos paquetes ICMP
  iptables -A INPUT -p icmp --icmp-type pong -j ACCEPT
  iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
  iptables -A INPUT -p icmp --icmp-type ping -j ACCEPT
  iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
  # Aceptamos conexiones SSH
  # Logging de inicios de conexión al SSH
  iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j LOGACCEPT
  iptables -A INPUT -p tcp -m tcp   --dport 22 -j ACCEPT 
  # Para aceptar conexiones HTTP hariamos:
  # iptables -A INPUT -p tcp -m tcp   --dport 80 -j ACCEPT 
  # Para ignorar BROADCASTS hariamos:
  # iptables -A INPUT -p tcp -m pkttype --pkt-type broadcast -j DROP
  # Registrar e ignorar el resto de paquetes
  iptables -A INPUT -j LOGDROP 
  # Forward
  # -------
  # Registrar paquetes que intenten hacer forwarding
  iptables -A FORWARD -j LOGDROP
  # Output
  # ------
  # Filtrar paquetes ICMP desconocidos
  iptables -A OUTPUT -m state -p icmp --state INVALID -j LOGDROP

Una vez ejecutados todos estos comandos la configuración del sistema de cortafuegos se puede ver haciendo:

  # iptables -L

Para que la configuración no se pierda al reiniciar el equipo usaremos el script /etc/init.d/iptables; en primer lugar almacenaremos como configuración activa el firewall que acabamos de instalar:

  # /etc/init.d/iptables save active

Despues limpiaremos las reglas, volveremos a poner el forwarding a DROP (por si acaso) y guardaremos las reglas de firewall inactivo:

  # /etc/init.d/iptables clear
  # iptables -P FORWARD DROP
  # /etc/init.d/iptables save inactive

Para hacer que el firewall se active cada vez que arranquemos la máquina reconfiguraremos el paquete iptables:

  # dpkg-reconfigure iptables

Diciéndole que si queremos que active el cortafuegos al arrancar.

Ahora activaremos el firewall y conectaremos el equipo a la red o saldremos del modo mono usuario.

Por último indicar que si no conocemos bien como funciona el sistema de firewalling de Linux debemos tener cuidado con la configuración y en lugar de usar un sistema tan manual como el presentado es recomendable emplear alguno de los muchos sistemas de configuración de cortafuegos disponibles en la distribución como por ejemplo firestarter, fwbuilder o shorewall.

Cortafuegos en Solaris

Para Solaris podemos emplear varios sitemas cortafuegos, el que viene en los CD de Solaris 9 es el Sun Screen 3.2. Hay que indicar que está como software adicional, es decir, no va incluido en la instalación estándar del sistema.

La documentación oficial de esta versión está en en la web de documentos de Sun (http://docs.sun.com/db/coll/557.4). Además de esta documentación, en el URL http://www.bolthole.com/solaris/sunscreen.html hay una guía rápida de como configurarlo y hay un Blueprint denominado Securing Systems with Host-Based Firewalls - Implemented With SunScreen Lite 3.1 Software que está disponible en http://www.sun.com/solutions/blueprints/0901/sunscreenlite.pdf.

Además de este firewall existe otro de dominio público que tambien es muy interesante; se llama IP Filter y es el incluido por defecto el FreeBSD y NetBSD. Se puede conseguir en http://coombs.anu.edu.au/ipfilter/

En el resto de este punto vamos a explicar como instalar y configurar el SunScreen 3.2 para funcionar como sistema cortafuegos de host.

Para empezar insertamos el segundo CD de software de Solaris 9 y nos ponemos en el directorio de software adicional:

  # cd /cdrom/Solaris_9/ExtraValue/CoBundled/SunScreen_3.2/i386

Para ver la lista de paquetes hacemos:

  # pkgadd -d .

De estos instalamos los paquetes 2, 1, 3, 6-13, 18-20, 14-17.

Para configurar el firewall haremos:

  # ssadm configure

E iremos contestando lo siguiete a las preguntas que nos aparecen:

  1. ROUTING
  2. STEALTH
  Screen Type? 1
  1. LOCAL
  2. REMOTE
  3. BOTH
  Local, remote or both methods of administration? 1
  The security levels are as follow:
  1. Restrictive
  2. Secure (routing screens only)
  3. Permissive
  Select the initial security level for this Screen: 3
  The following name resolution method was detected on this machine:DNS -
  Domain Name Service.
  1. YES
  2. NO
  Is this is the name service that you want to use on this machine? 1

A partir de aquí reiniciamos la máquina y ya tenemos un firewall activo que en principio no hace nada.

Para ajustar las políticas miramos la que está activa:

  # ssadm active
  Active configuration: cseg default Initial.1
  Activated by root on Tue Jul 15 15:08:30 2003

Y la editamos:

  # ssadm edit Initial  
  Loaded common objects from Registry version 1
  Loaded policy from Initial version 1
  edit> list rules
  1 "common" "*" "*" ALLOW

Lo primero que hacemos es eliminar la regla 'promiscua':

  edit> delete rule 1

A partir de este punto podemos añadir objetos de varios tipos: direcciones, servicios, interfaces, etc.

Por ejemplo podemos añadir algunos elementos de red:

  edit> add ADDRESS dns_srv HOST 192.168.96.1 COMMENT "Servidor DNS"
  edit> add ADDRESS smtp_srv HOST 192.168.96.1 COMMENT "Servidor SMTP"
  edit> add ADDRESS adm_net RANGE 192.168.96.65 192.168.96.91

Y también algunos servicios de red que no están disponibles por defecto, como el https:

  edit> add SERVICE https SINGLE FORWARD "tcp" PORT 443

Podemos agrupar el http (www en SunScreen) y el https en un sólo grupo:

  edit> add SERVICE web GROUP www https

Ahora añadiremos reglas para habilitar el acceso desde la máquina local a la web (http y https) y al dns y smtp de los servidores de la red:

  edit> add rule "web" "localhost" "*" ALLOW COMMENT "Acceso web de salida"
  edit> add rule "dns" "localhost" "dns_srv" ALLOW COMMENT "Acceso al DNS"
  edit> add rule "smtp" "localhost" "smtp_srv" ALLOW COMMENT "Acceso al SMTP"

Para poder administrar la máquina habilitaremos el acceso al ssh desde la red de los administradores:

  edit> add rule "ssh" "adm_net" "*" ALLOW LOG SUMMARY COMMENT "Permitir ssh"

Para evitar problemas aceptamos todos los paquetes icmp (podríamo ser más estrictos, pero esto es cómodo).

  edit> add rule "icmp all" "*" "*" ALLOW COMMENT "Aceptamos todos los ICMP"

Y al final denegamos el resto con Logging:

  edit> add rule "*" "*" "*" DENY LOG SUMMARY COMMENT "Logging"

Nuestras reglas quedarán:

  edit> list rule
  1 "web" "localhost" "*" ALLOW COMMENT "Acceso web de salida"
  2 "dns" "localhost" "dns_srv" ALLOW COMMENT "Acceso al DNS"
  3 "smtp" "localhost" "smtp_srv" ALLOW COMMENT "Acceso al SMTP"
  4 "ssh" "adm_net" "*" ALLOW LOG SUMMARY COMMENT "Permitir ssh"
  5 "icmp all" "*" "*" ALLOW COMMENT "Aceptamos todos los ICMP"
  6 "*" "*" "*" DENY LOG SUMMARY COMMENT "Logging"

Para activar el firewall grabamos las reglas:

  edit> save
  Saved common objects to Registry version 2
  Saved policy to Initial version 2

Las validamos:

  edit> verify
  Configuration verified successfully (not activated).

Salimos y la activamos:

  edit> quit
  # ssadm activate Initial
  Configuration activated successfully on cseg.

Si por lo que sea preferimos volver a la configuración anterior haremos:

  # ssadm activate Initial.1

Para más detalles del uso del SunScreen 3.2 se puede consultar la documentación de Sun sobre el producto, disponible en http://docs.sun.com/db/coll/557.4.

Deshabilitar servicios inútiles

En general, después de reiniciar la máquina y configurarle el cortafuegos, intentaremos ver que servicios tenemos activos empleando los programas netstat y lsof. El primero de ellos nos servirá para saber que puertos tenemos escuchando y el segundo nos dirá que procesos son los que escuchan.

El primer demonio que deberemos parar será el inetd. Una vez esté parado miraremos el fichero de configuración /etc/inetd.conf y comentaremos todos los servicios que no necesitemos. Si cuando terminamos no queda ningún servicio podemos desactivar el arranque del demonio al inicio del sistema o incluso desinstalar el programa.

A continuación pararemos y deshabilitaremos el portmap y los demonios del nfs (salvo que los vayamos a utilizar, claro está).

Seguiremos haciendo lo mismo con los servicios que nos vayan apareciendo, en los casos en los que los programas si sean necesarios intentaremos limitar el acceso a los mismos al mínimo número de máquinas posibles; incluso si sólo es necesario para los usuarios o programas locales lo configuraremos para que escuche únicamnte en la dirección IP 127.0.0.1.

Debian

Miramos los servicios de red arrancados por defecto, podemos hacerlo mirando la salida del proceso de arranque, mirando los procesos en marcha con top o ps, o, dado que se trata de procesos de red, usando la salida del comando netstat y/o lsof:

  # netstat -tulpen

Nos dará una lista de puertos TCP (opción t) y UDP (opción u) en estado LISTEN (opción l) indicándonos los programas a los que pertenecen los sockets (opción p). Las opciones que restan nos dan información extendida (opción e) y evitan el uso de los sistemas de resolución de nombres (opción n).

Podemos obtener información similar del comando lsof haciendo lsof -i, que nos lista los ficheros de red abiertos y los programas que los están usando.

Una vez sabemos que procesos queremos que no se reinicien en el arranque podemos eliminar los enlaces de arranque en los distintos runlevels:

  # rm /etc/rc*.d/S*nombre_demonio

o simplemente eliminar los paquetes con dpkg --purge.

RedHat

Al igual que en debian, miramos los puertos que están escuchando y los programas que los tienen abiertos y cerraremos lo que no nos haga falta.

En principio detendremos el portmap y el rpc.statd:

  [root@cseg root]# /etc/init.d/portmap stop
  Parando portmapper:                                        [  OK  ]
  [root@cseg root]# /etc/init.d/nfslock stop
  Parada de NFS statd:                                       [  OK  ]

Ahora tendremos:

  [root@cseg root]# netstat -tuln
  Active Internet connections (only servers)
  Proto Recv-Q Send-Q Local Address           Foreign Address         State      
  tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
  tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      
  [root@cseg root]# lsof -i -n
  COMMAND   PID USER   FD   TYPE DEVICE SIZE NODE NAME
  sshd     1637 root    3u  IPv4   2043       TCP *:ssh (LISTEN)
  sendmail 1661 root    4u  IPv4   2108       TCP 127.0.0.1:smtp (LISTEN)

Dejaremos activo el ssh para poder administrar el equipo de forma remota y en principio mantendremos el sendmail funcionando en la dirección de loopback, aunque sería recomendable revisar su configuración (en la validación de la configuración de los servicios básicos de Solaris comentaremos como configurarlo el sendmail para que funcione únicamente como servidor local, sin escuchar en el puerto de smtp, ver http://www.samag.com/documents/s=8228/sam0306a/0306a.htm).

Si no queremos que en el próximo arranque se lancen los servicios que hemos detenido haremos:

  [root@cseg root]# chkconfig portmap off
  [root@cseg root]# chkconfig nfslock off

Esto los deshabilitará en todos los runlevels. Si sabemos con certeza que no vamos a necesitar ni el portmap ni el nfs, podemos borrar los paquetes con rpm -e.

A partir de aquí podemos comenzar a instalar los servicios que necesite nuestro sistema, recordando que tenemos un firewall habilitado.

Solaris

Hacemos lo mismo que en los otros sistemas, aunque empleamos instrucciones diferentes, para el netstat haremos:

  # netstat -an | grep LISTEN

Para la detección de demonios que tienen abiertos los distintos puertos no hay ninguna herramienta (al menos que yo conozca) que venga de serie con Solaris, por lo que instalaremos el lsof de www.sunfreeware.com.

Parámetros del kernel

En principio en la mayoría de sistemas operativos existen parámetros ajustables que son importantes ante distintos ataques contra nuestro sistema de red, por ejemplo podemos controlar si nuestros sistemas reenvían paquetes TCP entre distintas interfaces de red, podemos decidir si aceptamos o no los ICPM Redirect, podemos hacer que se validen las rutas de los paquetes para evitar el IP Spoofing, etc.

En los siguientes documentos se pueden encontrar análisis de los parametros que podemos manipular en los núcleos de Solaris (usando el programa ndd) y Linux (usando el programa sysctl o manipulando directamente ficheros de /proc):

Además de los ajustes del núcleo relacionados con la red, no está de más mencionar que existen varios conjuntos de parches para el nucleo de Linux que lo hacen menos vulnerable a todo tipo de ataques (no sólo de red), entre ellos podemos mencionar los siguientes:

Existen distribuciones orientadas a la seguridad basadas en RedHat y Debian que incluyen estos núcleos: