Asegurando Linux Julián Rodríguez
Whitepaper
Asegurando Linux Protegiendo Nuestro Sistema
20 de Julio del 2008
Page 1
Asegurando Linux Julián Rodríguez
Eres libre de: Copiar, Distribuir y Comunicar públicamente la obra. Bajo las condiciones siguientes: Atribución. You must attribute this work to Julian Antonio Rodriguez Vergara (with link). No comercial. No puedes utilizar esta obra para fines comerciales. No Derivadas. No está permitido que alteres, transformes o generes una obra derivada a partir de esta obra.
Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor Nada en esta licencia menoscaba o restringe los derechos morales del autor. Creative Commons
Page 2
Asegurando Linux Julián Rodríguez
Al instalar un sistema bajo entorno Unix lo primero que nos preocupa es la seguridad de nuestros datos, archivos, carpetas y documentos. En este documento vamos a explicar y detallar como asegurar nuestro sistema para prevenir ataques, y evitar las formas mas comunes de intrusión; el documento, comandos y ejemplos son probados bajo Slackware 12.0.0 , Kernel 2.6.21.5 y entorno de escritorio KDE.
Remover RPMs Innecesarios
Al manejar un sistema tenemos que obtener mayor provecho de las características del mismo por lo cual cualquier detalle que nos haga obtener mayor rendimiento puede ser muy importante por lo cual en este paso vamos a remover todos los rpm innecesarios. [root@root] ~# rpm -qa Un comando para eliminar rpms que ya no necesitamos en el sistema es el siguiente el cual les puede ayudar a liberar espacio en el disco duro y producir más rendimiento: [root@root] ~# rpm -e <paquete> Un problema que puede resultar a la hora de estar removiendo paquetes rpms es que no nos de autorización ya que el proceso aun esta corriendo por lo cual tenemos que ejecutar en consola lo siguiente: [root@root] ~# /etc/rc.d/init.d/service stop Si lo que queremos hacer es volver a poner nuestro servicio en ejecución tenemos que hacer lo mismo pero simplemente sustituyendo la palabra “stop” por “start” como en el siguiente ejemplo: [root@root] ~# /etc/rc.d/init.d/service start
Page 3
Asegurando Linux Julián Rodríguez
Detectar Puertos a la escucha
Uno de los problemas mas comunes es detectar backdoors en nuestro sistema por lo cual podemos utilizar netstat para verificar que puertos se encuentran a la escucha, ya que con esto se pueden hacer conexiones reversas a otras maquinas; esto se hace para poder burlar la seguridad de los Firewall. [root@root] ~# netstat -tulp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 *:bootpc *:* 3210/dhcpcd
PID/Program name
Como ejemplo deje el output de mí maquina para que pudieran observar un ejemplo real; en el output anterior de nuestro sistema podemos ver que todo se encuentra en perfecto estado, pero si nuestro sistema estuviera con un puerto a la escucha, la respuesta del programa seria como la siguiente: [root@root] ~# netstat -tlup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:9666 *:* LISTEN 4791/nc udp 0 0 *:bootpc *:* 3210/dhcpcd
PID/Program name
En el ejemplo anterior vemos como existe un puerto a la escucha ( Transfer Control Protocol ) el cual es el puerto 9666 , la manera de detener este tipo de ataques silenciosos es primeramente matar el proceso para que no siga corriendo el backdoor; por lo cual ejecutaremos lo siguiente para obtener el PID y matar al programa en ejecución : [root@root] ~# ps aux | grep nc root 4922 0.0 0.0 1692 600 pts/2 S+ 12:22 0:00 nc -vv -l -p 9666 Ahora que ya tenemos el PID ( 4922 ) podemos matar el proceso con el siguiente comando : [root@root] ~# kill -9 4922 El parámetro -9 es un tipo de termino de proceso especial el cual no nos dará problemas para terminar el backdoor en nuestro sistema. ( Nota: El parámetro funciona cuando estas con el usuario root ).
Page 4
Asegurando Linux Julián Rodríguez
Otra forma de obtener información sobre los puertos que se encuentran abiertos en nuestra maquina es correr un escáner como Nmap, esta herramienta es desarrollada por Insecure. Usted puede ejecutar un escaneo simple para detectar puertos a la escucha, citare un ejemplo de como puede ser el resultado: [root@root] ~# nmap xxx.xxx.xxx.xxx Starting Nmap 4.60 ( http://nmap.org ) at 2008-7-20 12:36 MDT Interesting ports on localhost (xxx.xxx.xxx.xxx): Not shown: 1714 closed ports PORT STATE SERVICE 5555/tcp open freeciv Nmap done: 1 IP address (1 host up) scanned in 0.194 seconds Aquí se puede detectar que nuestro sistema tiene el puerto abierto 5555, para verificar si realmente esta en uso podemos averiguar información sobre este puerto, en este caso freeciv es un video juego para computadora el cual nuestro sistema obviamente no contiene por lo cual podemos deducir fácilmente que nuestro sistema esta comprometido con una puerta trasera para el atacante.
Page 5
Asegurando Linux Julián Rodríguez
Detectando Rootkits
Un rootkit es un conjunto de programas que un atacante infiltra a nuestro sistema para seguir obteniendo permisos root, mantener el control del sistema y tener todo bajo control. Esto afecta archivos, procesos y llamadas al sistema por lo cual puede ser bastante complicado detectar un rootkit en nuestro sistema pero para esto tenemos herramientas como RkHunter (1.3.2). Descarga: http://sourceforge.net/projects/rkhunter/ [root@root] ~# tar -xzvf rkhunter-1.3.2.tar.gz [root@root] ~# cd rkhunter-1.3.2 [root@root] ~# ./installer.sh Después de haber ejecutado la instalación de nuestra herramienta para detectar rootkits podemos hacer varias cosas pero lo primero que realizaremos será un simple escaneo a nuestro sistema para que nos informe cuales son las partes mas sensibles del mismo y si realmente existe un rootkit. [root@root] ~# rkhunter -c El parámetro que utilizamos ( -c ) significa “check local system” por lo cual el output de nuestro programa será algo largo quizá con “Warnings” o sin ellos pero hay que prestar atención a cuales son los puntos que nos marca como vulnerables. Existe una manera de hacer escaneos diarios a nuestro sistema y recibir los resultados a nuestro e-mail por lo cual podemos estar monitoreando una red de sistemas desde otro lugar por lo cual puede ser bastante cómodo para un administrador. [root@root] ~# nano /etc/crondaily/rkhunter.sh Después de que nano abra el archivo rkhunter.sh agregamos las siguientes líneas: [root@root] ~# #!/bin/bash (/usr/local/bin/rkhunter -c --cronjob 2>&1 | mail -s “Reporte diario de RkHunter"
[email protected]) Aquí simplemente guardamos nuestro archivo correctamente y a partir de ese momento podremos recibir nuestros resultados del escaneo que realice RkHunter en nuestro sistema.
Page 6
Asegurando Linux Julián Rodríguez
Firewall para Linux
Mantener control sobre los servicios que presta nuestro sistema es algo muy importante pero también hay que mantener un régimen dentro de los protocolos que se utilizan para evitar intrusiones y proteger la información sensible que estemos manejando por lo cual un Firewall es indispensable. [root@root] ~# wget http://prdownloads.sourcefoge.net/firestarter/firestarter-1.0.3.tar.gz?download [root@root] ~# tar -xzvf firestarter-1.0.3.tar.gz [root@root] ~# cd firestarter-1.0.3 [root@root] ~# ./configure sysconfdir=/etc [root@root] ~# make [root@root] ~# make install Para esto simplemente con ejecutar en modo consola el programa comenzara su interfaz grafica y comenzara a trabajar en nuestro sistema pero lo recomendable es que comience junto con el sistema por lo cual para agregarlo al startup es muy fácil dentro de algunos desktops como Gnome pero en este caso pondré la manera de realizarlo dentro de KDE. [root@root] ~# ln -s /usr/bin/firestarter ~/.kde/Autostart/firestarterlink Espero que este pequeño tip les funcione para mantener su sistema muy bien protegido desde el comienzo de este, al igual que con otras aplicaciones de seguridad como el RkHunter que antes se hablo de el.
Page 7
Asegurando Linux Julián Rodríguez
Asegurando SSH
Que significa SSH ? Significa Secure Shell el cual permite a un usuario conectarse a la maquina remotamente para mantener control de ella bajo entornos seguros. Pero confiar en los parámetros por defecto es un gran error por lo cual nosotros vamos a personalizar la configuración y hacerlo realmente seguro. Muchos servicios que se manejan en la red como telenet, rlogin, rsh no son muy seguros por lo cual es recomendable utilizar ssh ya que nos brinda mas seguridad para realizar conexiones. El problema de esto son las configuraciones por defecto por lo cual comenzaremos a cambiar las siguiente cosas, el archivo de configuración se encuentra en /etc/ssh/sshd_config. [root@root] ~# nano /etc/ssh/sshd_config Cambiamos los parametros a lo siguiente :
PermitRootLogin no UsePrivilegeSeparation yes # Esto nos ayudara a mantener control dentro de los comandos que corren. Protocol 2 # Limitando el protocolo a la version 2. AllowTcpFowarding no # Si no lo necesitan. X11Fowarding no # Si no lo necesitan. StrictModes yes # Si algún tipo de autentificación falla no dejara que el usuario se logee de nuevo. IgnoreRhosts yes # Métodos principales para la autentificación. HostbasedAuthentification no RhostRSAAuthentification no #Subsystem sftp /usr/lib/misc/sftp-server # La almohadilla para quitar este servicio.
Después de haber cambiado estos parámetros por defecto podrán confiar mas en que su servicio SSH estará mas seguro simplemente para ver los cambios en ejecución tienen que volver a comenzar el proceso por lo cual simplemente ejecutan en su consola lo siguiente : [root@root] ~# /etc/init.d/sshd restart
Page 8
Asegurando Linux Julián Rodríguez
IDS – Intrusion Detection System
El mantener un IDS dentro de nuestro sistema es muy importante. Esto puede ser usado para detectar movimientos dentro del sistema que puedan comprometer los datos que estamos protegiendo ya sea malware ( virus, troyanos, worms ) o ataques directamente al sistema; un IDS tiene diferentes componentes que lo constituyen como censores que genera eventos de seguridad para proteger el sistema, una consola para monitorear eventos, alertas y tener el control de los censores del IDS y un motor central que es lo importante del IDS que maneja a los censores y la consola. Descargando snort ( No hacen falta explicaciones los comandos son muy básicos, puede que algunos nombres de los folders no concuerden por lo cual deben de estar atentos en este tipo de detalles. ) : [root@root] ~# cd /user/home/ [root@root] ~# mkdir .snortids [root@root] ~# cd .snortids [root@root] ~# wget http://www.snort.org/dl/current/snort-2.8.2.1.tar.gz [root@root] ~# tar -xzvf http://www.snort.org/dl/current/snort-2.8.2.1.tar.gz [root@root] ~# rm snort-2.8.2.1.tar.gz [root@root] ~# wget http://www.snort.org/pub-bin/downloads.cgi/Download/sub_rules/snortrules-snapshot-2.8_s.tar.gz [root@root] ~# mv snortrules-snapshot-2.8_s.tar.gz /usr/home/.snotids/snort-2.8.2.1 [root@root] ~# cd snort-2.8.2.1 [root@root] ~# tar -xvzf snortrules-pr-2.8.tar.gz [root@root] ~# rm snortrules-pr-2.8.tar.gz Ahora la base de nuestro Snort esta funcionando, simplemente instalamos. [root@root] ~# ./configure --enable-dynamicplugin [root@root] ~# make [root@root] ~# make install
Page 9
Asegurando Linux Julián Rodríguez
Ya que termino la instalación es hora de hacer algunos cambios en el snort.conf y terminar de crear algunos folders para que se guarden correctamente los logs de Snort ( IDS ). [root@root] ~# mkdir /etc/snort [root@root] ~# mkdir /etc/snort/rules [root@root] ~# mkdir /var/log/snort Ahora vamos al proceso de los logs y algunas modificaciones mas. [root@root] ~# cd snort-2.8.x.x [root@root] ~# cd rules [root@root] ~# cp * /etc/snort/rules [root@root] ~# cd ../etc [root@root] ~# cp * /etc/snort Ahora que hicimos estos cambios es hora de que cambiemos los parámetros de snort.conf: [root@root] ~# cd /etc/snort [root@root] ~# nano snort.conf Y los cambios que tenemos que realizar son los siguientes : "var HOME_NET any" -> "var HOME_NET xxx.xxx.xxx.xxx/xx" "var EXTERNAL_NET any" -> "var EXTERNAL_NET !$HOME_NET" "var RULE_PATH ../rules" -> "var RULE_PATH /etc/snort/rules" Ahora simplemente para correrlo ponemos el siguiente comando: [root@root] ~# snort –u snort –c /etc/snort/snort.conf Esto pueden agregarlo a algún .sh y después agregan la ejecución del archivo a el startup con esto su snort estará trabajando desde que inicie el sistema al igual que con Firestarter ( Firewall ).
Page 10
Asegurando Linux Julián Rodríguez
Permisos de Folders
Uno de los mayores problemas que se puede presentar en un sistema que no ha recibido ningún tipo de mantenimiento son las configuraciones por defecto y uno de ellos puede ser que los folders que contienen mucha importancia deberían de tener determinados tipos de permisos. Aquí dejare un tabla que tal vez les pueda ayudar para cambiar permisos y mantener todo en orden en caso de una intrusión. Estas son solo pequeñas trabas que hacen que el atacante se de por vencido si es que no tiene mucha experiencia manejando sistemas. /bin/ /boot/ /dev/ /dev/audio* /dev/dsp* /etc/ /etc/conf.modules /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.monthly/ /etc/cron.weekly/ /etc/crontab /etc/dhcpcd/ /etc/dhcpcd/* /etc/esd.conf /etc/ftpaccess /etc/ftpconversions /etc/ftpgroups /etc/ftphosts /etc/ftpusers /etc/gettydefs /etc/hosts.allow /etc/hosts.deny /etc/hosts.equiv /etc/inetd.conf /etc/rc.d/init.d/ /etc/rc.d/init.d/syslog /etc/inittab /etc/ld.so.conf /etc/lilo.conf /etc/modules.conf
root.root root.root root.root root.audio root.audio root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.audio root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm root.adm
711 700 711 600 600 711 640 750 750 750 750 640 750 640 640 640 640 640 640 640 640 640 640 640 640 750 740 640 640 600 640
Page 11
Asegurando Linux Julián Rodríguez
/etc/motd /etc/printcap /etc/profile /etc/rc.d/ /etc/securetty /etc/sendmail.cf /etc/shutdown.allow /etc/ssh_config /etc/ssh_host_key /etc/ssh_host_key.pub /etc/sshd_config /etc/syslog.conf /etc/updatedb.conf /home/ /home/* /lib/ /mnt/ /root/ /sbin/ /tmp/ /usr/ /usr/* /usr/X11R6/ /usr/bin/ /usr/bin/* /usr/sbin/ /usr/sbin/* /var/ /var/log/ /var/log/* /var/spool/mail/
root.adm root.lp root.root root.adm root.adm root.adm root.root root.root root.adm root.adm root.adm root.adm root.adm root.adm current root.adm root.adm root.root root.adm root.root root.adm root.adm root.xgrp root.adm root.root root.adm root.root root.root root.root root.root root.mail
644 640 644 640 640 640 600 644 640 644 640 640 640 751 700 751 750 700 751 1777 751 751 751 751 755 751 755 755 711 600 771
Algunos de los grupos en la lista que se presento puede que no existan en tu sistema por lo cual deberías crearlos para mantener tu sistema mas seguro y evitar problemas.
Page 12
Asegurando Linux Julián Rodríguez
Asegurando PAM
PAM son las iniciales de Pluggable Authentication Modules. La mayoría de las distribuciones linux corren PAM por lo cual es muy importante darle su debido mantenimiento. Los módulos de PAM se encuentran en las siguientes rutas : - /etc/pam.d/ - /etc/security/ - /etc/pam.d/ Muchos de los ataques mas recientes ( '08 ) y que están en su apogeo son los ataques Ddos, la denegación de servicio es un ataque común cuando un atacante simplemente lo que quiere es que el sistema no siga funcionando ya que por determinadas circunstancias no tiene los medios para realizar una intrusión. Así que aseguremos nuestro PAM para evitar ataques tan molestos como la denegación de servicio, abramos el archivo limits.conf con nano o algún otro editor : [root@root] ~# nano /etc/security/limits.conf Lo que nos mostrara nuestra consola será lo siguiente ( Elimine parte del output porque en este caso puede resultar innecesario ) : # ... #* #* #@student #@faculty #@faculty #ftp #@student
soft hard hard soft hard hard -
core rss nproc nproc nproc nproc maxlogins
0 10000 20 20 50 0 4
# End of file
Los parametros que tenemos agregar son los siguientes : # Limit user processes * soft nproc 100 * hard nproc 150
Con esto vamos a restringir acceso a aquellos usuarios que pasen de nuestro limite que en este caso son 40 MB. # limits size of any one of users' files" /etc/security/limits.conf *
hard
40000
Page 13
Asegurando Linux Julián Rodríguez
Conclusión Este documento es una pequeña guía que muestra algunos tips o métodos para asegurar nuestro sistema de ataques y detalles que hacen que nuestro sistema este bien asegurado junto con que nuestra información permanecerá en total privacidad. Créditos Autor: Julián Antonio Rodríguez Vergara Website: http://www.julianrdz.uni.cc Contacto:
[email protected]
Page 14