Tag Archives: linux

Como hacer un “host checker” en Python para Linux

pythonHoy vamos a hacer una pequeña tool en Python para chequear si los hosts están “vivos”. Algo a tener en cuenta es que la tool que desarrollaremos solamente funcionara en Linux

Que vamos a necesitar:

  • Python (funciona en 2.7, pero mejor en 3+)
  • Una conexión a una red (LAN o Internet)
  • Una Computadora corriendo Linux

Si no tenes instalado Python, algo muy difícil ya que la mayoría de las distros actuales lo traen pre-instalado, lo podes bajar de este link: Python

Porque funciona solamente en Linux?

Nunca recomiendo utilizar librerías de terceros, pero sin una librería no se puede utilizar el comando ping de la misma manera que en Linux. En linux cuando usas el comando ping recibís como respuesta un “0” si el host esta “vivo” y otros números si el host no responde. Esto significa que, en Linux, cuando el host responde el ping con éxito recibiremos como respuesta “0” (operation completed successfully), en el caso contrario responderá con un numero de error. En Windows esto es mas complicado. Cuando le hacemos ping a un host el comando devolverá como respuesta que la operación se completo indistintamente si el host vivo o no.

Código Fuente:

Modo de uso:

> $ python hostchecker.py -s xxx.xxx.xxx -r1 xxx -r2 xxx

Ejemplo

$ python hostchecker.py -s 10.0.0 -r1 1 -r2 150
[*] Host Scanner launched!
[+] 10.0.0.1 is up!
[+] 10.0.0.21 is up!
[+] 10.0.0.23 is up!
[+] 10.0.0.26 is up!
[+] 10.0.0.100 is up!

Como ven es una tool muy sencilla y fácil de usar!

Tips de “Hardering” de seguridad para Servidores Linux (Parte II)

Linux-SecureEsta es la segunda parte de los “Tips de Hardering de seguridad para Servidores Linux” que había iniciado ya hace un tiempo largo.

En este segundo post vamos a explicar mas consejos y trucos para asegurar un sistema Linux. Espero que los consejos y trucos debajo descritos ayuden a asegurar su sistema Linux.

11. Deshabilitar IPv6

Si no estamos usando el protocolo IPv6, entonces debemos deshabilitarlo, porque la mayoría de las aplicaciones o políticas no requieren IPv6, y actualmente no se utiliza en servidores. Para desactivarlo, debemos ir al archivo de configuración de red y agregar las siguientes lineas:

12. Restringir a los usuarios de utilizar contraseñas anteriores

Esto es muy útil si desea restringir que los usuarios utilicen las mismas contraseñas antiguas. El archivo de contraseñas antiguas se encuentra en /etc/security/opasswd. Esto se puede lograr utilizando el modulo PAM.

Abrir el archivo ‘/etc/pam.d/system-auth‘ en RHEL/CentOS/Fedora.

Abrir el archivo ‘/etc/pam.d/common-password‘ en Ubuntu/Debian/Linux Mint.

Agregar la siguiente linea a la sección ‘auth

Agregar la siguiente linea a la sección ‘password‘ para restringir a los usuarios reutilizar las ultimas 5 contraseñas.

El servidor recordara solos los últimos 5 passwords. Si un usuario trata de utilizar cualquiera de las ultimas 5 contraseñas antiguas, saldrá el siguiente error:

13. Comprobar la caducidad de las contraseñas de usuarios

En Linux, las contraseñas de usuario se almacenan en el archivo ‘etc/shadow‘ en formato encriptado. Para comprobar la caducidad de las mismas, es necesario utilizar el comando ‘chage‘. Este comando muestra los detalles de la caducidad de las contraseñas junto con la fecha del ultimo cambio. Estos datos son utilizados por el sistema para decidir cuando un usuario debe cambiarla.

Para ver la información sobre la vigencia de la contraseña de cualquier usuario del sistema, como la fecha y hora de vencimiento, utilice el siguiente comando:

Para cambiar el tiempo de caducidad de cualquier usuario, utilice el siguiente comando:

14. Bloqueo y Desbloqueo de cuentas de usuario manual.

El bloqueo y desbloqueo de cuentas son características muy útiles, en lugar de eliminar una cuenta del sistema podemos bloquearla por una semana o un mes (por ejemplo, un usuario que se toma vacaciones). Para bloquear a un usuario especifico, se utiliza el siguiente comando:

Nota: El usuario bloqueo continuara disponible solo para el usuario root. El bloqueo se realiza mediante la sustitución de la contraseña cifrada por el string (!). Si alguien intenta acceder al sistema utilizando esta cuenta, recibirá un error similar al siguiente:

Para desbloquear o permitir acceso a una cuenta que fue bloqueada, utilice el siguiente comando (Esto eliminara el string (!) por la contraseña cifrada):

15. Forzar el uso de contraseñas mas seguras

Muchos usuarios utilizan contraseñas débiles, y estas pueden ser hackeadas por medio de ataques basados en diccionario o fuerza bruta. El modulo ‘pam_clicklib‘ esta disponible dentro de la pila de módulos PAM (Pluggable Authentication Modules) y obligara a los usuarios a establecer contraseñas mas seguras. Debemos abrir el siguiente archivo con algún editor:

Y agregue la siguiente linea usando los siguientes parámetros (credit, ucredit, dcredit y/o ocredit que son minúsculas, mayúsculas, números y otros caracteres especiales respectivamente.)

16. Habilitar IPTables (Firewall)

Es casi obligatorio activar el firewall de Linux para evitar el acceso no autorizado a los servidores. Aplicar reglas en IPTables para filtros entrantes, salientes y reenvío de paquetes. Podemos especificar la dirección de origen y de destino para permitir o denegar el numero de puerto udp/tcp especifico

En el futuro realizare un post explicando detalladamente como utilizar IPTables, por ahora les dejo esta guía (en Ingles) de uso de IPTables

17. Deshabilitar Ctrl+Alt+Delete en Inittab

En la mayoría de las distribuciones de Linux, al pulsar “ALT+CTRL+DEL” se activa el proceso de reinicio del sistema. Por lo tanto, no es buena idea tener esta opción activada, al menos en los servidores de producción, si alguien por error hace esto.

Esto se define en el archivo ‘etc/inittab‘, si nos fijamos bien en este archivo, se vera una linea similar a la siguiente. De forma predefinida, la linea no esta comentada. Tenemos que comentarla para desactivar la opción. En este ejemplo en particular, la secuencia de letras apagara el sistema:

18. Comprobar cuentas de usuario con contraseñas vacías

Cualquier cuenta sin contraseña significa una puerta abierta para un acceso no autorizado para cualquier persona en la red (LAN o WAN) y es un problema de seguridad dentro de un servidor Linux. Por lo tanto, debemos asegurarnos de que todas las cuentas tienen contraseñas seguras y nadie tenga acceso autorizado. Las cuentas sin contraseñas son un gran riesgo de seguridad y pueden ser fácilmente hackeables. Para comprobar si hay cuentas sin contraseña, utilizamos el siguiente comando:

19. Mostrar un Banner antes del login en SSH

Siempre es buena idea poner un banner legal o de seguridad con algunas advertencias antes de la autenticación en SSH. Para configurar este tipo de banners debemos hacer lo siguiente:

Podemos reformar cualquiera de los siguientes archivos, según nuestro interés

issue.net — Mostrara el banner antes de ingresar el password
motd — Mostrara el banner después de ingresar el password

Si queremos que el banner se muestre antes de ingresar el password

Aquí configuramos para que muestre el banner

agregamos la siguiente linea al archivo ‘sshd_config

Reiniciamos el servicio sshd para reflejar los cambios

Si queremos que el banner se muestre después de ingresar el password creamos el banner en el archivo

20. Revisar Logs regularmente

Una idea interesante es mover los logs a un servidor dedicado, esto evitara que un intruso pueda modificar fácilmente los logs. A continuación se muestran los logs comunes en Linux y su uso:

  • /var/log/message – Donde están disponibles los logs del sistema entero y de la actividad actual.
  • /var/log/auth.log – Logs de Autenticación
  • /var/log/kern.log – Logs del Kernel
  • /var/log/cron.log – Logs del demonio cron (cron jobs)
  • /var/log/maillog – Logs del servidor de Mail
  • /var/log/boot.log – Logs del booteo del sistema
  • /var/log/mysqld.log – Logs del servidor de DB MySQL
  • /var/log/secure – Logs de Autenticación
  • /var/log/utmp or /var/log/wtmp – Logs de registro de acceso
  • /var/log/yum.log – Log de YUM

21. Realizar Backup de los archivos importantes

En un sistema de producción, es necesario tener copias de seguridad de archivos importantes, y guardarlos en un lugar seguro, en un sitio remoto o fuera de las instalaciones en caso de recuperación de desastres.

22. Mantener la partición /boot como solo-lectura

El Kernel de Linux y los archivos relacionados se encuentran en el directorio/partición /boot, que esta configurada por defecto como lectura/escritura. Si lo cambiamos a solo-lectura reducimos el riesgo de modificación no autorizada de archivos de arranque críticos. Para ellos, abra el archivo ‘/etc/fstab’

Agregamos la siguiente linea en la parte inferior, guardamos y cerramos

Nota: Hay que tener en cuenta que necesitamos restablecer los cambios y volver a lectura-escritura si en el futuro necesitamos actualizar el kernel.

23. Ignorar ICMP (ping) o Solicitudes de Broadcast

Agregamos la siguiente linea en el archivo ‘/etc/sysctl.conf‘ para ignorar las solicitudes de ping o broadcast

Para levantar los nuevos ajustes/cambios ejecutamos el siguiente comando

Si creen que me olvide de algún consejo de seguridad o hardering de linux siéntanse libre de colaborar y lo incluiré en el futuro en alguna publicación.

Tips de “Hardering” de seguridad para Servidores Linux (Parte I)

Linux-SecureTodo el mundo dice que Linux es seguro por default y estamos de acuerdo en cierta medida (hay temas discutibles). Sin embargo, Linux tiene incorporado un modelo de seguridad por default. Necesitamos ajustarlo y personalizarlo según la necesidad que tengamos de manera que pueda ayudar a hacer el sistema mas seguro. Linux es mas difícil de administrar, pero ofrece mas flexibilidad y opciones de configuración.

Asegurar un sistema en producción de ataques de hackers y crackers es una tarea difícil para un SysAdmin. Este no es el primer post relacionado a “Como proteger un sistema Linux” o “Hardering de Linux“. En este post vamos a explicar algunos consejos y trucos para asegurar un sistema Linux. Espero que los consejos y trucos debajo descritos ayuden a asegurar un sistema.

1. Seguridad Física del Sistema

Configure la BIOS des-habilitando la opción de arranque desde CD/DVD, dispositivos externos y unidades de Diskettes. A continuación, habilite la contraseña de la BIOS y también proteja con contraseña el gestor de arranque (GRUB, LiLo, etc) para restringir el acceso físico de su sistema.

2. Particiones de Disco

Es importante tener diferentes particiones para obtener mayor seguridad de los datos en caso de que ocurra cualquier desastre. Mediante la creación de diferentes particiones los datos se pueden separar y agrupar. Cuando ocurre un accidente inesperado, se dañaran solo los datos de esa partición, mientras que los datos de las demás particiones sobrevivirán. Asegúrese de que dispone de las particiones separadas abajo listadas y también de que las aplicaciones de terceros se deben instalar en sistemas de archivos separados en /opt.

3. Minimizar los Paquetes instalados para minimizar las vulnerabilidades

¿De verdad necesitas todo tipo de servicios instalados?. Se recomienda evitar la instalación de paquetes inútiles para evitar vulnerabilidades que dichas instalaciones puedan tener. Esto puede minimizar el riesgo de que al comprometerse un servicio pueda llevar a que otros servicios sean comprometidos. Buscar y des-instalar o des-habilitar los servicios que no usemos del servidor para minimizar el riesgo de vulnerabilidades. Utiliza el comando “chkconfig” para averiguar que servicios se están ejecutando en runlevel 3.

Nota: Si el servidor esta instalado en idioma español la cadena es ‘3:activo’

Una vez que hayas averiguado que servicios innecesarios se están ejecutando, hay que desactivarlos con el siguiente comando:

Utiliza la herramienta del gestor de paquetes como “yum” o “apt-get” para listar todos los paquetes instalados en el sistema y puedes eliminar los que no sean necesarios con el siguiente comando:

4. Comprobar los puertos abiertos (listening)

Con la ayuda del comando de red “netstat” se pueden ver todos los puertos abiertos y programas asociados a dicho puerto. Como dije antes se puede usar el comando “chkconfig” para des-habilitar los servicios de red que no usemos en el sistema.

5. Utilizar SSH

Los protocolos Telnet y rlogin utilizan texto plano, sin encriptación lo cual es muy inseguro. SSH es un protocolo seguro que utiliza tecnología de encriptación durante la comunicación con el servidor.

Nunca iniciar sesión directamente como root a menos que sea necesario. Utilizar “sudo” para ejecutar comandos como administrador. Los usuarios que pueden ejecutar sudo se especifican en el archivo /etc/sudoers. También se puede editar con la utilidad “visudo” que se abre con el editor VI.

También es recomendable cambiar el puerto predeterminado (22) por algún otro mas alto. Abrimos el archivo principal de configuración de SSH y realizamos algunos cambios de parámetros para restringir el acceso de usuarios:

Des-habilitar el inicio de sesión “root”

Permitir solo usuarios especificados

Utilizar Protocolo SSH v2

6. Mantener el sistema actualizado

Siempre mantenga el sistema actualizado con los últimos parches lanzados, parches de seguridad y kernel cuando estén disponibles.

7. Bloqueo de CronJobs

cron tiene su propia función incorporada, en la que permite especificar quien puede y quien no puede ejecutar trabajos. Esto es controlado por dos archivos llamados /etc/cron.allow y /etc/cron.deny. Para bloquear un usuario y que no pueda usar cron, simplemente el/los nombres de usuarios en cron.deny y para permitir a un usuario ejecutar cron agregarlo al archivo cron.allow. Si desea que ningún usuario pueda utilizar cron, debe añadir la linea ‘ALL’ al archivo cron.deny.

8. Des-habilitar la detección de Memorias USB

Muchas veces queremos restringir a otros usuarios el uso de memorias USB en el sistema para proteger y asegurar los datos de posibles robos. Creamos el archivo /etc/modprobe.d/no-usb y añadimos la linea que figura abajo y no detectara mas memorias USB.

9. Activar SELinux

Security-Enhanced Linux (SELinux) es un mecanismo de seguridad de control de acceso obligatorio dispuesto en el kernel. Des-habilitar SELinux significa la eliminación del mecanismo de seguridad del sistema. Piense cuidadosamente dos veces antes de desactivarlo, si su sistema esta conectado a Internet y tiene acceso publico, piense un poco mas sobre esto.

SELinux proporciona tres modos básicos de operación y son:

Enforcing: Este es el modo por default que permite hacer cumplir la política de seguridad de SELinux en la maquina

Permisive: En este modo, SELinux no hace cumplir la política de seguridad en el sistema, solo muestra advertencias y registra las acciones. Este modo es muy útil en termino de cuestiones relacionadas con la solución de problemas de SELinux.

Disabled: SELinux esta desactivado.

Puedes ver el estado actual de SELinux desde la linea de comandos, utilizando los comandos “sestatus“, “getenforce” o “system-config-selinux“.

Si esta desactivado, activa SELinux con el siguiente comando:

También se puede gestionar desde el archivo /etc/selinux/config, donde se puede habilitar o des-habilitar.

10. Eliminar Escritorio GNOME/KDE

No hay necesidad de correr escritorios “X Window” como GNOME o KDE en un servidor dedicado. Puede quitarlo o des-habilitarlo para aumentar la seguridad del servidor y el rendimiento. Para des-habilitarlo simplemente abrir el archivo /etc/inittab y establezca el runlevel a 3. Si desea eliminar el sistema de escritorio por completa utilizar el siguiente comando:

Continuara…

Lynis: Herramienta de Seguridad y Auditoria para Sistemas *nix

lynisLynis es una herramienta de auditoria para sistemas *nix (Unix/Linux). La misma ejecuta un análisis de seguridad y determina el estado de “hardering” del host. Cualquier problema de seguridad que sea detectado proporcionara una sugerencia o una advertencia. Junto con la información relacionada con la seguridad también buscara información general del sistema, paquetes instalados y posibles errores de configuración. En general, es una herramienta de auditoria y seguridad para “hardering” de sistemas *nix (Unix/Linux).

Este software tiene como objetivo asistir de manera automatica en la auditoria, “hardering”, gestion de parches, y el analisis de vulnerabilidades y malware de sistemas *nix (Unix/Linux). Se puede ejecutar sin necesidad de instalación, por lo que se puede utilizar en medios extraibles como ser CD/DVD, pendrives, etc.

Es una herramienta que ayuda a los auditores en la realizacion de auditorias basadas en los estandares Basel II, GLBA, HIPAA, PCI DSS and SOx (Sarbanes-Oxley).

Lynis esta desarrollada para ser utilizada por especialistas de seguridad, pentesters, auditores de sistemas, administradores de sistemas.

Algunos ejemplos de testeos:

  • Métodos disponibles de autenticación
  • Certificados SSL expirados
  • Software desactualizado
  • Cuentas de usuario sin password
  • Permisos de archivos incorrectos
  • Errores de configuración
  • Auditoria de Firewall

lynis-screenshot

Lynis es un script de auditoria escrito en lenguaje de scripting shell (sh). Por lo tanto, se ejecuta en la mayoría de los sistemas sin ningún tipo de configuración. Los paquetes están creados para facilitar su instalación. Aun así, si nos interesa bajar la versión mas reciente, basta con descargar el “tarball”, extraerlo en un directorio temporal y ejecutar la herramienta.

Testeado en los siguientes SO:

  • ArchLinux
  • CentOS
  • Debian
  • FedoraCore
  • FreeBSD
  • Gentoo
  • Knoppix
  • LinuxMint
  • MacOSX
  • Mandriva
  • OpenBSD
  • OpenSolaris
  • OpenSuSE
  • OracleLinux
  • PcBSD
  • PCLinuxOS
  • RedHatEnterpriseLinux(RHEL)
  • RedHatderivatives
  • Slackware
  • Solaris10
  • Ubuntu

Descarga

Seguridad en Apache (Parte III): Ocultar Información

Apache-LogoEn la presente entrada, se describirán métodos para tratar de minimizar la información expuesta que facilite ataques sobre el servidor web.
Una de las primeras fases de los ataques sobre los sistemas de información es la revelación de información (o information disclosure). Cuanta más información tenga el atacante, más fácil le resultara encontrar vulnerabilidades existentes en el sistema atacado.
A continuación, se detallarán varias medidas para tratar de exponer la mínima información posible.

Deshabilitar el listado de ficheros

Si se le envía a Apache una URL que solicita un directorio y no un archivo concreto, Apache permite mostrar los contenidos de este directorio. Esta funcionalidad puede ser aprovechada por un atacante para descubrir archivos que el administrador del sitio no tenía intención de publicar.

Esta característica de Apache es controlada por la directiva Options, para desactivarla se debe aplicar la siguiente configuración:

Options -Indexes

Como su propio nombre indica, mediante esta directiva se controlan varias opciones de configuración. Puede aceptar varios valores, entre ellos All y None para activar o desactivar todas las opciones disponibles. De hecho, en la configuración del directorio raíz se recomienda desactivar todas por seguridad, lo que incluiría la opción Indexes:

 

Limitar el acceso a archivos por extensión

En algunas ocasiones determinados ficheros deben existir dentro del DocumentRoot del servidor pero no se desea que estén disponibles, como los ficheros .htaccess y .htpasswd, cuya funcionalidad se explicará posteriormente. En estos casos, se pueden utilizar las directivas Files y FilesMatch para denegar su acceso.

En el siguiente ejemplo, se deniega el acceso a todos los ficheros que comienzan por los caracteres “.ht” (entre ellos .htaccess y .htpasswd):

 

Las siguiente configuración evita que se publiquen los archivos de copia de seguridad:

 

Files y FilesMatch sólo actúan sobre el nombre del archivo, para filtrar directorios, se debe utilizar DirectoryMatch. Mediante las directivas presentes a continuación se vetaría el acceso a todos los directorios CVS:

 

Información en la cabecera Server

En las respuestas HTTP se incluye la cabecera Server que contiene información sobre el software que ejecuta el servidor web:

apache_wireshark_header_server_full

Si se desea restringir esta información se puede utilizar la directiva ServerTokens, aunque no se puede restringir la información enviada completamente ya que la configuración más restrictiva es Prod que, como se aprecia a continuación, envía el nombre del servidor web:

apache_wireshark_header_server_prod

Mediante el módulo mod_security es posible modificar el valor de esta cabecera completamente:

SecServerSignature “Microsoft-IIS/5.0”

Aunque mod_security es un módulo de gran utilidad, se desaconseja su instalación únicamente para enmascarar el servidor ya que un hacker dispone de múltiples herramientas de fingerprinting como HTTPrint, que basándose en pequeñas diferencias de implantación del protocolo HTTP, permite obtener la versión del navegador web:

httprint

Información en páginas generadas por el servidor

La directiva ServerSignature establece si se desea mostrar la versión del servidor, el correo del administrador y el nombre del servidor virtual en las páginas generadas por Apache (por ejemplo, errores o listados de directorio FTP). Para no mostrar información se puede establecer a Off.

La dirección de correo electrónico del administrador, que muestra en determinadas páginas de error para que el internauta pueda notificar el error, se establece mediante la directiva ServerAdmin. No es recomendable establecer una personal, sino una genérica con este fin específico.

Por otro lado, Apache muestra una página de error genérica cuando se produce un error que revela información sobre la versión del software ejecutada:

apache_error_404

Mediante la directiva ErrorDocument se puede modificar este texto, incluso invocar un script que lo construya dinámicamente. Aunque esta directiva es poco flexible ya que hay que crear una entrada por cada código de error. Por ejemplo:

ErrorDocument 404 /error/404.html
ErrorDocument 500 “Error en el servidor”