Prácticas de Laboratorio Practicas básicas de de seguridad en Linux WALC 2012 PRACTICA DE LABORATORIO. Practicas básicas de de seguridad en Linux El objetivo de esta práctica es dar a conocer los mecanismos mínimos para asegurar un sistema Linux. Desarrollo Práctico Parte 1. Servicios en ejecución En esta sección el objetivo es detener los servicios en ejecución que no se están utilizando. a. Una vez instalado su sistema debe comenzar por revisar que puertos están abiertos, para ello utilice el nmapcon esto se podrá determinar que servicios de red se están ejecutando: #nmap localhost Starting Nmap 5.00 ( http://nmap.org ) at 2012-09-11 15:06 EDT Interesting ports on localhost (127.0.0.1): Not shown: 996 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http 111/tcp open rpcbind Nmap done: 1 IP address (1 host up) scanned in 0.12 seconds b. Para determinar que otros servicios están corriendo primero debe saber que nivel de ejecución (runlevel) esta utilizando, para esto utilice el comando runlevel y luego liste los servicios de arrancan y se detienen en el nivel 2: # runlevel N2 # ls /etc/rc2.d/ README S17rsyslog S19atd S19mpt-statusd S22rc.local S14portmap S18apache2 S19cron S19ssh S22rmnologin S15nfs-common S19acpid S19exim4 S21bootlogs S22stop-bootlogd Prácticas de Laboratorio Practicas básicas de de seguridad en Linux c. Para impedir que los servicios que no se están utilizando se ejecuten utilice el comando update-rc.d (Ejemplo): # update-rc.d -f exim4 remove update-rc.d: using dependency based boot sequencing d. Una vez que se impida el arranque de estos servicios hay que detenerlos (Ejemplo): # /etc/init.d/exim4 stop Stopping MTA: exim4_listener e. Una vez realizado este paso revise nuevamente su maquina con el nmap y revise su directorio /etc/rc2.d/. Recuerde que solo debe dejar activos los servicios que va ha utilizar. f. ¿Que sucede si usted desea determinar que demonio esta escuchando conexiones de red por un determinado puerto? Discuta su respuesta. ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________ Parte 2. Instalación de un firewall básico Construya o instale un firewall: a. Primero revise cuales reglas de firewall tiene su maquina activa # iptables -L b. Realice ping a la maquina virtual (Desde su máquina real ) # ping LA-IP-DE-SU-MAQUINA-VIRTUAL Para configura las reglas de iptables debe usa políticas por omisión tales como: iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP c. Coloque estas reglas básicas # iptables -A INPUT -i lo -j ACCEPT # iptables -A OUTPUT -o lo -j ACCEPT Prácticas de Laboratorio Practicas básicas de de seguridad en Linux # iptables -A OUTPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A OUTPUT -p TCP -d 0.0.0.0/0 --destination-port 22 -m state --state NEW -j ACCEPT # iptables -A OUTPUT -p TCP -d 0.0.0.0/0 --destination-port 80 -m state --state NEW -j ACCEPT # iptables -A OUTPUT -p UDP -d 0.0.0.0/0 --destination-port 53 -j ACCEPT # iptables -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -p tcp -s 0.0.0.0/0 --destination-port 80 -m state --state NEW -j ACCEPT # iptables -P INPUT DROP # iptables -P OUTPUT DROP # iptables -P FORWARD DROP d. Realice nuevamente ping a la maquina de su compañero. Que resultado obtuvo. Parte 2.1 Parametros del kernel Adicionalmente a las reglas de Firewall que pueda configurar en su maquina se recomienda configurar las opciones de red del kernel al momento del encendido. a. Edite el archivo /etc/sysctl.conf y descómete las siguientes líneas: net.ipv4.conf.all.rp_filter = 1 net.ipv4.tcp_syncookies = 1 net.ipv4.ip_forward=0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.all.accept_source_route = 0 b. Ejecute el comando sysctl -p # sysctl -p Prácticas de Laboratorio Practicas básicas de de seguridad en Linux Parte 2.2 Golpeo de puertos (Port knocking) El golpeo de puertos o port knocking es un mecanismo para abrir puertos en un firewall mediante una secuencia preestablecida de intentos de conexión a puertos que se encuentran cerrados. Una vez que el firewall recibe la secuencia de conexión correcta, sus reglas son modificadas para permitir a la IP que realizó los intentos conectarse a un puerto específico. a. Instale el paquete del port knocking # aptitude install knockd b. Edite el archivo de configuración para permitir que el servicio arranque # nano /etc/default/knockd # control if we start knockd at init or not # 1 = start # anything else = don't start START_KNOCKD=1 # command line options #KNOCKD_OPTS="-i eth0" c. Edite el archivo de configuración para de las reglas del paquete knockd # nano /etc/knockd.conf [options] logfile = /var/log/knockd.log [openSSH] sequence = 7001,8001 seq_timeout = 45 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 9000,8000 seq_timeout = 45 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn d. Arranque el servicio para comenzar a utilizarlo # /etc/init.d/knockd start e. Para abrir el puerto de la maquina destino se debe enviar la secuencia de apertura Prácticas de Laboratorio Practicas básicas de de seguridad en Linux IP-de-la-maquina-destino 7001 8001 f. Una vez enviada la secuencia de apertura se procede a establecer la conexión SSH # ssh IP-de-la-maquina-destino g. Compruebe que puede que sucede luego de la secuencia de apertura h. Se pueden observar la bitácora de la apertura con el comando # tail /var/log/knockd.log Parte 3.Configuración del TCP Wrappers Para configurar el TCP Wrappers los archivos de configuración son el /etc/hosts.allow y el /etc/hosts.deny a. En el archivo el /etc/hosts.allow configure su maquina para solo aceptar conexiones ssh desde su red: # vi /etc/hosts.allow sshd: 192.168..X.Y/255.255.255.Z b. Para negar el acceso a el resto de los servicios escriba en el /etc/hosts.deny # vi /etc/hosts.deny ALL:ALL except 127.0.0.1: Deny Parte 4. Búsqueda de rootkits Los rootkit son herramientas que tiene como finalidad esconderse a sí misma y esconder a otros programas, procesos, archivos, directorios, llaves de registro, y puertos que permiten a un intruso mantener el acceso a un sistema para remotamente poder ejecutar acciones o extraer información. a. Instalar los buscadores de rootkits # aptitude install chkrootkit rkhunter b. Ejecutar el chkrootkit y analizar la salida (esta operación tomara varios minutos) # chkrootkit Prácticas de Laboratorio Practicas básicas de de seguridad en Linux c. Actualizar el rkhunter y ejecutarlo (esta operación tomara varios minutos) # rkhunter --update # rkhunter -c --sk d. Discuta los resultado obtenidos e. Puede revisar la bitácora del rkhunter con el siguiente comando # more /var/log/rkhunter.log Parte 5.Configuración del tripwire En esta sección se configurar un IDS de target como es el caso Tripwire. a. Instalar el tripwire # aptitude install tripwire b. Siga las intrusiones que se presentan por pantalla Prácticas de Laboratorio Practicas básicas de de seguridad en Linux Prácticas de Laboratorio Practicas básicas de de seguridad en Linux c. Siga las instrucciones y coloque las contraseñas que se le soliciten. Importante Las contraseñas Tripwire deben de ser diferentes de las de root o de cualquier otra contraseña del sistema. Use contraseñas únicas tanto para la clave del sitio como para la local. Introduzca la contraseña de sitio (site-key) y su confirmación La clave de sitio se usa para proteger los archivos de políticas y los de configuración. Prácticas de Laboratorio Practicas básicas de de seguridad en Linux d. Introduzca la contraseña local (local key) y su confirmación. La clave local se utiliza para firmar los informes generados tras las comprobaciones de integridad. e. Una vez realizado el paso anterior hay que inicializar la base de datos del tripwire, mediante el comando: # tripwire --init f. Una vez inicializada la base de datos ejecute una revisión del sistema mediante el comando # tripwire --check Esta revisión debe hacerse periódicamente por tanto por omisión por tanto tripwire añade un script llamado tripwire-check al directorio /etc/cron.daily/. Este script automáticamente un control de integridad una vez al día. ejecuta Prácticas de Laboratorio Practicas básicas de de seguridad en Linux g. Para visualizar los reportes del tripwire ejecute los siguientes comandos: # cd /var/lib/tripwire/report/ # ls debian-20120911-152322.twr h. Para visualizar este reporte ejecute el comando: # twprint --print-report --twrfile debian-20120911-152322.twr Note: Report is not encrypted. Open Source Tripwire(R) 2.4.1 Integrity Check Report Report generated by: root Report created on: Thu Oct 11 15:23:22 2012 Database last updated on: Never =============================================================================== Report Summary: =============================================================================== Host name: debian Host IP address: Host ID: 127.0.1.1 None Policy file used: /etc/tripwire/tw.pol Configuration file used: Database file used: /etc/tripwire/tw.cfg /var/lib/tripwire/debian.twd Command line used: tripwire --check =============================================================================== Rule Summary: =============================================================================== ------------------------------------------------------------------------------Section: Unix File System ------------------------------------------------------------------------------- Rule Name --------- Severity Level Added Removed Modified -------------- Invariant Directories * Tripwire Data Files Other binaries Tripwire Binaries Other libraries ----- 66 100 66 ------- -------0 1 0 100 66 0 0 0 0 0 0 0 0 0 0 0 0 Prácticas de Laboratorio Practicas básicas de de seguridad en Linux Root file-system executables 100 0 0 0 System boot changes 100 0 0 0 Root file-system libraries 100 0 0 0 Critical system boot files 100 0 0 0 Other configuration files 66 0 0 0 (/lib) (/etc) Boot Scripts 100 0 0 0 Security Control 66 0 0 0 * Root config files 100 0 0 1 * Devices & Kernel information 100 211 152 0 Total objects scanned: 24060 Total violations found: 365 Parte 6. Revisión de logs del sistema Para facilitar la visualización de los mismos puede usar herramientas tales como logwatch. Ejemplo: # aptitude install logwatch # logwatch --detail High --range All | more Analice el resultado. Parte 7. Prueba de los password del sistema Para esta sección de la práctica trataremos de encontrar password fáciles de romper por medio de la herramienta John de Ripper. Para esto copiaremos el archivo /etc/shadow en el directorio /root y luego se ejecutara John. a. Instale el paquete con el comando: # aptitude install john b. Ejecute John de Ripper: # john /etc/apache2/users.dat & c. Ejecute el siguiente comando para ver el progreso de el proceso: # john -show /etc/apache2/users.dat Prácticas de Laboratorio Practicas básicas de de seguridad en Linux Parte 8. Llaves para conexiones SSH Para establecer conexión ssh de forma más segura los usuarios deben autentificarse en los servidores mediante le uso de llaves, para ello se debe seguir los siguientes pasos: a. Generar la llaves # ssh-keygen -t dsa -b 1024 Generating public/private dsa key pair. Enter file in which to save the key (/root/.ssh/id_dsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): introduzca un password Enter same passphrase again: introduzca el password nuevamente Your identification has been saved in /root/.ssh/id_dsa. Your public key has been saved in /root/.ssh/id_dsa.pub. The key fingerprint is: 30:6c:73:a9:af:f7:b4:99:88:74:47:6a:26:b9:f2:e6 root@debian b. Copie la llave recientemente generada al la maquina al la cual desea conectarse (cuidad asegures de la identidad de la maquina destino) # ssh-copy-id -i /root/.ssh/id_dsa.pub root@IP-de-la-maquina-destino The authenticity of host `IP-de-la-maquina-destino' can't be established. RSA key fingerprint is 30:6c:73:a9:af:f7:b4:99:88:74:47:6a:26:b9:f2:e6. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'localhost' (RSA) to the list of known hosts. root@IP-de-la-maquina-destino's password: introduzca el password de root de la maquina destino Now try logging into the machine, with "root@IP-de-la-maquina-destino", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. c. Establezca una conexión SSH al la maquina destino usada en el paso anterior # ssh root@IP-de-la-maquina-destino Enter passphrase for key '/root/.ssh/id_dsa': introduzca el password utilizado en el paso “a” The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@nombre-de-la-maq-dest:~$ Prácticas de Laboratorio Practicas básicas de de seguridad en Linux Parte 9. Instalación de mod-chroot para asegurar el servidor Web Mod-chroot sirve para enjaular las aplicaciones, restringiendo asi el acceso a el sistema de archivos del host. a. Para esto instalamos y habilitamos el modulo # apt-get install libapache2-mod-chroot # a2enmod mod_chroot # /etc/init.d/apache2 restart b. Creamos la estructura de directorios necesaria # mkdir -p /var/www/var/ # mkdir -p /var/www/var/run # cd /var/www/var # ln -s ../../ www # mkdir -p /var/www/etc # mkdir -p /var/www/lib # mkdir -p /var/www/var/run/apache2 # chown -R root:root /var/www/var/run # cp /etc/mime.types /var/www/etc/ # cp /lib/libgcc_s.so.1 /var/www/lib c. Editamos el archivo /etc/apache2/apache2.conf y agregamos al final la línea ChrootDir /var/www d. Detenemos el servicio, creamos un enlace para el pid y se arranca de nuevo el servicio # /etc/init.d/apache2 stop # sleep 10 && ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid # /etc/init.d/apache2 start e. Revisamos el archivo de log de apache para ver que no existan problemas # tail /var/log/apache2/error.log Parte 10. Instalación de mod-evasive para mitigar ataques de DoS en el servidor Web Mod-evasive sirve para mitigar ataques de DoS en el servidor Web, y asi poder servir a los clientes reales. Prácticas de Laboratorio Practicas básicas de de seguridad en Linux a. Para esto instalamos el modulo # apt-get install libapache2-mod-evasive b. Creamos la estructura para los archivos de logs # mkdir /var/log/mod_evasive # chown www-data:www-data /var/log/mod_evasive/ c. Configuramos el modulo # vi /etc/apache2/mods-available/mod-evasive.conf <ifmodule mod_evasive20.c> DOSHashTableSize 3097 DOSPageCount 2 DOSSiteCount 50 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 10 DOSLogDir /var/log/mod_evasive #DOSWhitelist 127.0.0.1 </ifmodule> d. Habilitamos el modulo y se reinicia el servicio # a2enmod mod-evasive # /etc/init.d/apache2 restart e. Realizamos una prueba del funcionamiento del modulo # perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl | more HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden Prácticas de Laboratorio Practicas básicas de de seguridad en Linux Parte 11. Instalación de mod-security para asegurar el servidor Web Mod-security es un firewall de aplicaciones Web que ejecuta como módulo del servidor Web (Apache), El mismo se utiliza un modulo que se encarga de proporcionarle un nivel de seguridad adicional a nuestro servidor Web es muy potente, flexible y fácil de personalizar. f. Para observar con facilidad los efectos del mismo se procederá a verificar la firma del servidor Web previa a la configuración del mod-security. # nmap localhost -sV -p 80 Starting Nmap 5.00 ( http://nmap.org ) at 2012-10-11 15:38 EDT Interesting ports on localhost (127.0.0.1): PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.2.16 ((Debian)) g. Para instalar el modulo debemos ejecutar el siguiente comando # aptitude install libapache-mod-security h. Para copiar las reglas debemos copiarlas de al ubicación actual a la configuración de apache # cp /root/reglas-modsec/* /etc/apache2/conf.d/ i. Cree el directorio para los LOGS # mkdir /var/log/mod_sec # chown www-data:www-data /var/log/mod_sec/ j. Edite el archivo de configuración de servidor Web /etc/apache2/httpd.conf y agregue las siguiente líneas # nano /etc/apache2/httpd.conf ServerSignature Off ServerTokens Full k. Active el modulo Prácticas de Laboratorio Practicas básicas de de seguridad en Linux # a2enmod mod-security l. Reinicie el servidor Web # /etc/init.d/apache2 restart m. Trate de acceder al servidor web y verifique que sucede, revise los log y la firma de la versión del servicio Parte 12. Correcto montado de las particiones Para aumentar la seguridad de los servidores se deben montar las particiones de forma correcta. a. Primero instalamos el paquete que se utiliza para las cuotas # aptitude install quota b. Para montar las particiones de forma correcta se debe editar el archivo /etc/fstab # nano /etc/fstab ///archivo original /// # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/sda2 / ext3 defaults,errors=remount-ro 0 /dev/sda1 /boot ext3 defaults 0 2 /dev/sda5 /home ext3 defaults 0 2 /dev/sda11 /opt ext3 defaults 0 2 /dev/sda9 /tmp ext3 defaults 0 2 /dev/sda6 /usr ext3 defaults 0 2 /dev/sda10 /usr/local ext3 defaults 0 2 /dev/sda7 /var ext3 defaults 0 2 /dev/sda8 /var/log ext3 defaults 0 2 /dev/sda3 none swap sw 0 0 /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0 1 ///archivo modificado /// # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/sda2 / ext3 defaults,errors=remount-ro 0 1 /dev/sda1 /boot ext3 noauto,noatime 0 2 /dev/sda5 /home ext3 rw,nosuid,nodev,exec,auto,nouser,async,usrquota,grpquota /dev/sda11 /opt ext3 defaults 0 2 /dev/sda9 /tmp ext3 defaults,nodev,nosuid,noexec,usrquota,grpquota 0 /dev/sda6 /usr ext3 defaults,ro,nodev 0 2 /dev/sda10 /usr/local ext3 defaults 0 2 /dev/sda7 /var ext3 defaults,nodev,usrquota,grpquota 0 2 /dev/sda8 /var/log ext3 defaults,nodev,nosuid,noexec 0 2 /dev/sda3 none swap sw 0 0 /dev/hdc /media/cdrom0 udf,iso9660 user,noauto 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0 0 2 2 Prácticas de Laboratorio Practicas básicas de de seguridad en Linux c. Para que el sistema de pueda actualizar de forma correcta se debe modificar el archivo /etc/apt/apt.conf. # nano /etc/apt/apt.conf DPkg { Pre-Invoke { "mount /usr -o remount,rw" }; Pre-Invoke { "mount /boot" }; Pre-Invoke { "mount -o remount,exec /tmp" }; Post-Invoke { "mount /usr -o remount,ro" }; Post-Invoke { "umount /boot" }; Post-Invoke { "mount -o remount /tmp" }; };