¿Qué sigue después de instalar OpenBSD? • Introducción • Sistema de archivos ♦ Cuotas en los sistemas de archivo • Niveles seguros del núcleo y protección de archivos importantes ♦ Niveles seguros del Kernel ♦ chflags • Servicios de Red ♦ rc ♦ portmap ♦ inetd ♦ telnetd ♦ ftpd ♦ ipf • Bitácoras del sistema ♦ Syslog ♦ lastcomm y acct • Portes y paquetes • Actualizaciones del sistema ♦ ¿Cuál es la diferencia entre estos parches y los del árbol de fuentes? ♦ Prepararando el sistema para la aplicación de parches • Mantenerse informado • Referencias Introducción El proyecto OpenBSD ha logrado llevar a la comunidad usuaria de sistemas de cómputo, el sistema operativo más confiable, robusto y seguro, gracias a que es un proyecto con bases bien fundamentadas, en donde existen objetivos, metas y alcances definidos; lo cual ha permitido a los desarrolladores crear un sistema con código auditado y de calidad muy superior a otros sistemas. (Vea: http://www.openbsd.org). Una de las aspiraciones del equipo de desarrolló de este proyecto, era crear el sistema operativo más seguro y gracias a su esfuerzo y empeño se ha logrado tener un sistema NO vulnerable a exploits remotos por más de tres años en una instalación por default. Ya que la seguridad de un sistema de cómputo, inicia y termina con el administrador, por lo tanto es su responsabilidad realizar buenas prácticas de administración y mantenimiento del sistema, pues aún usando un sistema con la calidad y el nivel de auditoría como el de OpenBSD siempre existirán intrusos tratando de romper la seguridad. • ¿Esta guía es necesaria? ¡NO! :-) Un sistema OpenBSD viene seguro por default, por lo que este documento sólo pretende ayudar a mejorar la seguridad del sistema tomando en cuenta las necesidades y el nivel de paranoia del administrador ;-). • ¿Hablaremos a profundidad de tripwire, tcp_wrappers, crack, cops, logcheck y otras herramientas de seguridad? NO, esta guía es específica a OpenBSD, ya que la documentación para las herramientas de seguridad no específicas del sistema es muy extensa, por lo que se concentrará únicamente en el sistema operativo. • ¿Quién debería leer este documento? Cualquier persona que desee aprender varias formas para hacer su sistema más seguro. Esta guía cubrirá algunos pasos que irán desde básicos hasta a algunos más complejos. Si tienes preguntas o quisieras contribuir, envía un correo: [email protected]. Esta guía es específica OpenBSD, pero el material cubierto es aplicable a cualquier otro Unix o Unix-Like (especialmente a FreeBSD y NetBSD). • ¿Qué le falta a este documento? I. Cubrir /etc/login.conf y las clases de login. II. Hablar acerca del sistema X windows. III. Sendmail. IV. Apache. V. Corregir los horrores de redacción y de ortografía ;-). VI. Las sugerencias y observaciones que envíes a '[email protected]'. Sistema de archivos Puesto que Unix se considera todo un archivo, es muy importante proteger correctamente el sistema de archivos. Este proceso comienza antes de instalar el OSmismo, pues es necesario que diseñes y calcules el tamaño de las particiones. He aquí algunas razones para hacerlo: Puedes necesitar varios tipos de sistemas de archivos con diversas opciones (algunos ejemplos abajo). Puedes exportar uno o varios sistemas de archivos. Tendrás el control seccionado. A diferencia de Linux es importante mencionar OpenBSD por defecto, ya que requiere de 3 particiones " / ", " / usr " y " / var " más la partición de swap. Esto facilita realizar los respaldo con programas como dump(8), pero además hay ventajas en cuestiones de seguridad, pues una de las cosas que podemos hacer al particionar nuestro disco es limitar a los usuarios la escritura de archivos con modo 'suid', ejemplo: $cat /etc/fstab [enter] /dev/wd0a / ffs rw 1 1 /dev/wd0d /dev/wd0e /dev/wd0g /dev/wd0g /dev/wd0h /usr ffs rw 2 2 /home ffs rw,nosuid 2 2 /var ffs rw,nosuid 2 2 /tmp ffs rw,nosuid 2 2 /var/tmp ffs rw,nosuid 2 2 Al llegar a este punto necesitas estar seguro de que todos los directorios en donde los usuarios pueden escribir están montados con la opción 'nosuid', o han sido modificados de tal forma que sólo el usuario 'root' puede escribir este tipo de archivos. También es importante que busques directorios que permitan la escritura de todos tus usuarios y cambies los permisos a los que creas convenientes: # find / -perm -0777 -type d -ls Encuentra archivos instalados en tu sistema que usen suid o guid y desactiva los que no uses, además es necesario localizarlos para modificar los permisos que tienen en las particiones asignadas al espacio de tus usuarios, para encontrarlos puedes usar find: # find / -perm -2000 -ls # find / -perm -4000 -ls Otra cosa que puede resultar útil, es desactivar completamente comandos comúnmente no utilizados como: uustat, uucio, ppp, pppd, lpr, etc. Puedes estar preguntándote si estas recomendaciones pueden detener a un atacante para desmontar y montar el sistema de archivos sin la opción 'nosuid'. No, a menos que cambies el nivel de seguridad del núcleo del sistema y los indicadores de los archivos. Lee la sección 2 "Niveles seguros del núcleo e indicadores de archivos". Cuotas en los sistemas de archivo En caso de que permitas usar el 'shell' a tus usuarios, es recomendable establecer cuotas al espacio asignado en disco, pues esto te protegerá de ataques de negación de servicio llenado el sistema de archivos sea intencionalmente o por accidente. Para activar las cuotas, modifica la siguiente línea en el archivo /etc/rc.conf: check_quotas="NO" # Check quotas (or NO). check_quotas="YES" # Check quotas (or NO). Para más información y ejemplos lee la documentación que te proporcionan las páginas del manual de los comandos y archivos; quotaon, edquota, repquota, quota y fstab; ejemplo: man 5 fstab Niveles seguros del núcleo y protección de archivos importantes Niveles seguros del Kernel El núcleo de BSD tiene una noción del nivel de seguridad con el que es ejecutado, algunas veces se ha dicho, es tan perfecto como debería ser, hará el trabajo para parar a los "script kiddiez''. Cada nivel usa diversos mecanismos de protección y chequeo del sistema. La descripción se tomó de la pagina del manual de securelevel(7): man securelevel<enter> El núcleo de OpenBSD nos proporciona 4 niveles de seguridad del sistema: • -1 Modo permanentemente inseguro - init(8) no intentara levantarlo en nivel seguro - Sólo puede usarse con sysctl(8) mientras el sistema es inseguro - lo demás es idéntico al nivel 0 • 0 Modo inseguro - Usado durante el arranque y mientras el sistema está en modo mono usuario. - Todos los dispositivos y archivos pueden ser leídos o escritos de acuerdo a sus permisos - Los indicadores de archivo pueden limpiarse. • 1 Modo seguro - Modo usado por default cuando se utiliza el sistema en modo multiusuario. - securelevel may no longer be lowered except by init - /dev/mem /dev/kmem puede no permitir la escritura a - discos montados con permisos de sólo lectura - El sistema es inmutable y la protección de los archivos no puede ser cambiada - Podemos permitir o negar el proceso cargar o quitar módulos del kernel. • 2 Modo altamente seguro - Todos las restricciones del nivel 1 - Dispositivos de disco en crudo son siempre de modo lectura estén montados o no. - No es posible modificar la hora y fecha con settimeofday(2). - Las reglas de ipf(8) e ipnat(8) no pueden ser alteradas. Por ejemplo, si tu sistema se usa solamente como servidor web es recomendable que uses el nivel 2. Sin embargo, si estás usando el sistema X, cambia a nivel 1 ya que el servidor de X necesita escribir a /dev/mem y /dev/kmem y el nivel 1 previene de hacer eso, la recomendación es cambiar al nivel más seguro una vez que X ha iniciado. • Para saber en quequé nivel estáas usando tu kernel usa lo siguiente: $sysctl kern.securelevel [enter] • Para cambiar el nivel del kernel también usaraás sysctl, en donde N representa los niveles 0, 1, 2: $sysctl -w kern.securelevel=N [enter] El archivo de configuración de las variables del kernel es /etc/sysctl.conf y donde establecemos el nivel de arranque es el archivo /etc/rc.securelevel. chflags 'chflags' es un comando que nos permite hacer a un archivo o directorio inmutable, puedes usar el comando chflags en combinación con los niveles seguros del kernel y cuando reinicies tu sistema no permitirá modificaciones al archivo o directorio marcado auún por el usuarios 'root': $chflags schg /bsd # ls -lo /bsd -r-xr-xr-x 1 root wheel schg 1061679 Jun 30 01:27 /kernel "schg" previene de una sustitucion de nucleo: $id uid=0(root) gid=0(wheel) groups=0(wheel), 2(kmem) $sysctl kern.securelevel kern.securelevel: 2 $rm -rf /bsd rm: /bsd: Operation not permitted nfr# mv /bsd /tmp/ mv: rename /bsd to /tmp/bsd: Operation not permitted Si estáas ejecutando el kernel en el nivel 1 óo 2, el indicador de proteccionprotección no puede cambiarse: # chflags noschg /kernel chflags: /kernel: Operation not permitted Para que esto no suceda puedes usar el archivo /boot.config, el cual te permite cambiar los parámetros del kernel al momento de arrancar: # touch /boot_config # chflags schg /boot_config Puedes marcar los directorios, /bin, /sbin, /usr como inmutables y hacer más difícil al intruso la posibilidad de instalarte una backdoor o troyanos. Servicios de Red rc En OpenBSD los servicios del sistema se activan desde el script /etc/rc y son configurados en el archivo /etc/rc.conf. Por ejemplo si queremos activar el servicio de http, modificamos la siguiente línea en el archivo /etc/rc.conf: httpd_flags="NO" # for normal use: "" (or "-DSSL" after reading ssl(8) a httpd_flags="" # for normal use: "" (or "-DSSL" after reading ssl(8) Una vez que la modificación se realiza corremos el script /etc/rc: $sh /etc/rc portmap OpenBSD viene con el portmapper activado en la instalación por default. Si no lo necesitas ¡desactívalo!. No necesitarás el demonio de portmap si no estás usando programas que requieran de RPC, para desactivar este servicio edita el archivo /etc/rc.conf y remplaza la línea: portmap_enable="YES" # Run the portmapper service (or NO). por portmap_enable="NO" # Run the portmapper service (or NO). inetd Al utilizar elel servicio de Inetd debemos ser cuidadosos, ya que con este demonio brindamos servicios como telnet, ftp, etc. El archivo de configuración de inetd está ubicado en el directorio /etc y se llama inetd.conf. Para activar o desactivar necesitamos editarlo, la regla es sencilla el signo '#' se usa para comentar o descomentar las líneas de los servicios que queremos echar a andar; por ejemplo si deseamos desactivar el servicio de ftp será necesario cambiar la siguiente línea: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -US a #ftp stream tcp nowait root /usr/libexec/ftpd ftpd -US Para que los cambios surtan efecto en la configuración, es necesario resetear el demonio: $kill -HUP pid Otra consideración importante al usar inetd es combinarlo con el parámetro '-R', pues con ello permites disminuir o incrementar el rango de peticiones límite a las que responderá inetd. OpenBSD viene con un rango por default de 265, es recomendable cambiarlo a 1024. Para realizar este cambio edita el archivo /etc/rc y cambia la línea en donde se activa inetd: echo -n ' inetd'; inetd a echo -n ' inetd'; inetd -R 1024 telnetd ¡No lo uses!, sustituye el servicio de telnet por ssh(http://www.openssh.com); para desactivar el servicio edita el archivo /etc/inetd.conf y realiza el siguiente cambio: #telnet stream tcp nowait root /usr/libexec/telnetd telnetd En caso de que el uso de telnet sea inevitable, podemos hacer el servicio un poco más seguro e informativo. Usando el parámetro -h en el demonio de telnetd telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h El parámetro '- h' desactiva la impresión de información específica del host antes de que el login sea completado. Al dejar de usar telnet tú y tus usuarios estarán forzados a usar alternativas más seguras como ssh. Otro parámetro que es importante usar es '-U', el servicio se cancelará si la dirección IP que lo solicita no resuelve un nombre. telnet stream tcp nowait root /usr/libexec/telnetd telnetd -h -U ftpd La recomendación es no usar este servicio y sustituirlo por scp(1), pero si es indispensable puedes 'incrementar' el nivel de seguridad agregando el parámetro '-l', esto te ayudará a registrar todos los intentos de sesión fallidos y exitosos ocurridos en éste; para hacerlo cambia el contenido del archivo /etc/inetd.conf de: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -US a ftp stream tcp nowait root /usr/libexec/ftpd ftpd -US -l Para habilitar el registro de estos eventos en el sistema de bitácoras, edita el archivo /etc/syslog.conf y agrega lo siguiente: ftp.* /var/log/ftpd No olvides hacer un touch al archivo ftpd en el directorio /var/log, ahí registrarás todos los eventos. $touch /var/log/ftpd Si tu sistema prestara el servicio de FTP Anónimo, es de vital importancia que verifiques que todos los permisos son correctos y no permiten al usuario hacer modificaciones en ningún directorio. Es recomendable que leas la página del manual de ftpd(8). ipf IP Filter es un filtro de paquetes TCP/IP, usado comúnmente en la mayoría de los sistemas BSD para la implementación de firewalls. Puede implementarse en forma de módulo o directamente a tu kernel. El núcleo instalado por default incluye lo necesario para usar ipf. Un documento recomendado para comprender y aprender acerca de la ejecución de firewalls es el siguiente: http://www.obfuscation.org/ipf/ipf-howto.txt. Para este documento solamente mencionaré que además de poder usar ipf como filtro para firewalls, puede usarse para bloquear y detectar el barrido de puertos o el fingerprinting contra tu sistema, en lugar de implementar herramientas como 'portsentry' que consumen recursos del kernel y abren puertos adicionales para garantizar una supuesta detección a las peticiones del los puertos inactivos en nuestro sistema. • Activa IPF en los servicios del sistema, editando y cambiando la siguiente línea en el archivo /etc/rc.conf a: ipfilter=YES # IPF must be enabled for the bridge to work * Edita el archivo de reglas de ipf y agrega las siguientes líneas: # Bloqueará los intentos de fingerprinting con NMAP tpck nmap OS fingerprinting attempts # Fr # En donde fxp0 es tu tarjeta de red. # block in quick on fxp0 proto tcp all flags FUP • Inicializa ipf, tecleando como root: $ipf -Fa -FS -vf /etc/ipf.rules -E[enter] El uso de ipf se limitará a tu creatividad, y por lo tanto te recomiendo leer con calma el how to de ipf mencionado al inicio de esta sección. Bitácoras del sistema syslog Las bitácoras del sistema son sumamente importantes, pues serán muy útiles para identificar un ataque. Como tradicionalmente se ha visto en muchos papers de seguridad, el demonio syslogd es utilizado para llevar un registro de los eventos del sistema, este servicio viene activado por default y es recomendable que leas la página del manual de configuración del servicio, es muy sencilla: man syslog.conf<enter> Otras alternativas disponibles para incrementar el nivel de seguridad en tu sistema de bitácoras son ssyslog de CORE SDI, el cual puede ser obtenido de: http://www.core-sdi.com/Core-SDI/english/slogging/ssyslog.html, y otro es nsyslog (new syslog) localizado en: http://cheops.anu.edu.au/~avalon/nsyslog.html. La tarea de analizar las bitácoras es muy difícil de realizar, por lo tanto te recomiendo instalar la herramienta 'logcheck', la cual te ayudará a agilizar este proceso; puedes obtener los fuentes del port para OpenBSD en: ftp://ftp.openbsd.org/pub/ports/logcheck-1.1.1.tgz lastcomm y acct En caso de permitir el uso del 'shell' a tus usuarios, es buena práctica utilizar lastcomm(1), el cual llevará una bitácora de los comandos ejecutados en el sistema. El sistema de contabilidad de lastcomm(1) no viene activo en la instalación por default, pero es muy sencillo hacerlo funcionar, los comandos para activarlo son: $touch /var/log/acct $actton /var/log/acct Para hacer automático este proceso cada vez que la máquina se levante verifica que el archivo /etc/rc tenga el siguiente código de shell: if [ -f /var/account/acct ] then echo 'turning on accounting'; accton /var/account/acct fi Portes y paquetes El árbol de portes es un conjunto de archivos Makefile que permite bajar los programas fuente, parcharlos, configurarlos e instalarlos automáticamente. Se puede obtener desde el directorio /pub/OpenBSD/VERSION/ports.tar.gz en cualquiera de los servidores de ftp de OpenBSD. Para más información sobre los ports, lee la sección 8.6 de la FAQ: http://www.openbsd.org/faq/es/faq8.html#8.6. Para instalar los ports y/o paquetes debes considerar que muchas de estas aplicaciones no tienen el mismo nivel de auditoría que el código del sistema base y en caso de ser vulnerables, pueden representar huecos potenciales para comprometer la seguridad de tu sistema. Los paquetes son binarios precompilados listos para ser usados directamente en un sistema OpenBSD. Al igual que los portes, los paquetes son muy fáciles de mantener y actualizar. La lista de las herramientas utilizadas en el manejo de paquetes es la siguiente: pkg_add(1) - Herramienta para instalar distribuciones de paquetes de software. pkg_create(1) - Herramienta para crear distribuciones de paquetes de software. pkg_delete(1) - Herramienta para desinstalar distribuciones de paquetes de software previamente instalados. pkg_info(1) - Herramienta para mostrar información sobre paquetes de software. Para obtener más información acerca de cómo instalar un paquete consulta la sección 8.7 de la FAQ oficial: http://www.openbsd.org/faq/es/faq8.html#8.7. Actualizaciones del sistema El árbol de fuentes de OpenBSD experimenta continuamente cambios y mejoras, al tiempo que pone a disponibilidad pública y de manera regular parches para problemas comunes. Éstos aparecen separados por categorías en la página web de erratas: http://www.openbsd.org/es/errata.html, las cuales corresponden a los parches aplicados a las diferentes arquitecturas, o independientes de ella. Sin embargo, no se producen parches para las nuevas funcionalidades agregadas al sistema, sino para solucionar problemas de fiabilidad o seguridad que deban ser atajados inmediatamente, aunque la última palabra al respecto de aplicar o no la tiene siempre el administrador del sistema. A modo de ejemplo repararé talkd(8) con un parche de seguridad obtenido de http://www.openbsd.org/errata.html. ¿Cuál es la diferencia entre estos parches y los del árbol de fuentes? Todos los parches enviados a http://www.openbsd.org/es/errata.html son los que se aplican directamente al árbol de fuentes de la versión oficial más reciente. Los aplicados al árbol de CVS más reciente también incluyen otros cambios que no son deseables en un sistema con la versión oficial. Preparando el sistema para la aplicación de parches Los parches para el Sistema Operativo OpenBSD se distribuyen como archivos diff, son archivos de texto en los que se encuentran las diferencias con el código fuente original. NO se distribuyen en formato binario. Esto quiere decir que para aplicar un parche al sistema, es necesario disponer del código fuente de la versión RELEASE de OpenBSD sin que esto signifique disponer de TODO el código fuente del sistema operativo, sino tener todo el código para el programa al que vaya a aplicarse. Por ejemplo, si tienes que aplicar un parche al núcleo del sistema, deberías tener a la mano todo el código fuente para el núcleo. cvs(1) es una herramienta muy útil que puedes usar para obtener el código fuente que necesites por medio de los servidores anónimos de cvs ubicados alrededor del mundo. Puedes encontrar una lista de estos servidores en la siguiente dirección: http://www.openbsd.org/es/anoncvs.html. Para obtener el código fuente de la versión 2.8 usando cvs(1), debes hacer lo siguiente: $cvs [email protected]:/cvs co -rOPENBSD_2_8_BASE src/libexec/talkd/ cvs server: Updating src/libexec/talkd U src/libexec/talkd/announce.c U src/libexec/talkd/talkd.c U src/libexec/talkd/talkd.h Para encontrar en el CVS la ruta hasta el código que necesitas, puedes verlo en la línea Index: del parche. En este caso la ruta en el CVS era src/libexec/talkd/. Aplicaremos el parche del siguiente modo: $cd /usr/src $patch -p0 < 026_talkd.patch $cd libexec/talkd make obj && make depend && make && make install Una vez hecho esto, reinicia ese servicio. Para mayor información acerca de comocómo aplicar parches a tu sistema consulta la sección 10.4 de la FAQ oficial de OpenBSD: http://www.openbsd.org/faq/es/faq10.html#10.14. Mantenerse informado Si eres usuario o administrador de uno o varios sistemas OpenBSD es vital permanecer informado acerca de las vulnerabilidades y actualizaciones del sistema; para hacerlo las listas de correo y la página de erratas son un recurso valioso. Para ingresar a la página donde se publican los parches del sistema, utiliza tu navegador favorito y a entra a esta dirección: http://www.openbsd.org/errata.html Para suscribirte a la lista en donde se reportan problemas de seguridad y sus soluciones, envía un correo a [email protected] con la siguiente línea en el cuerpo del mensaje: subscribe security Esto te subscribirá a la lista [email protected]. Para suscribirte a la lista en donde se reportan problemas de seguridad, sus soluciones, y tópicos diversos referentes a OpenBSD en español, envía un correo a majordomo@openbsd con la siguiente línea en el cuerpo del mensaje: subscribe misc [email protected] Esto te subscribirá a la lista [email protected]. Referencias FAQ OpenBSD project http://www.openbsd.org/faq/ OpenBSD Mexico http://www.openbsd.org.mx/ FreBSD Security How-To http://people.freebsd.org/~jkb/howto.html Revisión histórica • Liberación original: 23-Feb-2006 • Última revisión: 7 de octubre de 2010 El Departamento de Seguridad en Computo/UNAM-CERT agradece el apoyo en la elaboración y revisión de este documento a: • Galvy Cruz Valencia • Andrés Leonardo Hernández Bermúdez Para mayor información acerca de éste documento de seguridad contactar a: UNAM CERT Equipo de Respuesta a Incidentes UNAM Departamento de Seguridad en Cómputo DGSCA - UNAM E-Mail:[email protected] http://www.cert.org.mx http://www.seguridad.unam.mx ftp://ftp.seguridad.unam.mx Tel:56 22 81 69 Fax:56 22 80 43