¿Qué sigue después de instalar OpenBSD - UNAM-CERT

Anuncio
¿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
Descargar