lunes, 11 de abril de 2016

Firewall ipwf en FreeBSD

Habilitación y configuración de firewall ipfw en FreeBSD

En la presente entrada hago la traduccion de un interesantisimo articulo que encontre en BSD Magazine, acerca de la habilitación y configuración básica del firewall de FreeBSD ipfw, el cual se incluye en el sistema, solo se debe habilitar y configurar.

Basicamente un firewall controla el flujo de información entre una red de confianza (tal como una red corporativa) y una red publica como Internet. Los tipos de firewall mas comunes son basados en puertos (o filtros de paquetes), o alguna variacion tales como los de inspeccion de estado (stateful). Este tipo de firewalls son muy comunes debido a que son muy faciles de operar y mantener, son baratos, tienen buen rendimiento y han sido utilizados durante mas de dos decadas.

Los firewalls (conocidos en español como muros de fuego o cortafuegos) se encargan de bloquear o prevenir que ciertos paquetes de red ingresen a ciertos servicios dentro de nuestra red. Las practicas modernas de seguridad consisten en bloquear todos los paquetes, a excepcion de un pequeño numero bien seleccionado de ellos a los que se les permite ingresar a nuestra red, con el fin de minimizar la superficie de ataque, ademas del numero y alcance de los servicios expuestos en nuestra red.

Los paquetes pueden ser bloqueados en varios niveles de la pila de red. Al nivel practico mas bajo (capa2: nivel de enlace de datos), se pueden bloquear los paquetes provenientes de ciertas direcciones MAC. Es mucho mas util bloquear paquetes entrantes o salientes de ciertas direcciones IP (capa 3: nivel de red), y es aún mas util hacer el bloqueo basados en las propiedades de las conexiones TCP, tales como puertos o sesiones TCP establecidas (capa 4 y superiores: nivel de transporte hacia arriba). Finalmente, hay firewalls que llevan a cabo una inspeccion profunda de paquetes y operan basados en los datos de aplicacion que se transportan a traves de conexiones TCP (capa 7: aplicacion).

La introduccion de firewalls en un sistema de red requiere una planificacion cuidadosa, ya que es muy facil bloquear involuntariamente ciertos servicios o sistemas, incluso para los administradores.

Firewalls con filtrado de paquetes stateful (con estado)

Los primeros tipos de cortafuegos operan basándose exclusivamente en la información estática disponible en paquetes individuales, y debido a eso se denominan "sin estado". Por ejemplo, este tipo de cortafuegos podría bloquear los paquetes a ciertas direcciones IP, o a ciertos puertos TCP mediante el analisis de cada paquete. Sin embargo, protocolos ligeramente más avanzados, tal como TCP, han incluido el estado de la sesión adjunta a los paquetes de red, que es mantenido simultáneamente en las dos partes de la conexión. Sobre la base del estado de la conexión, ciertos tipos de paquetes pueden o no ser aceptados. Por ejemplo (de manera muy simplificada), el protocolo TCP tiene paquetes de red que se utilizan para establecer una conexión, paquetes que llevan datos, y paquetes que llevan datos que tienen algun significado. Es una violación del protocolo enviar paquetes que supuestamente se refieren a una conexión antes o después que esta conexión se establezca correctamente, o enviar paquetes de confirmación de paquetes de datos no existentes. Los firewalls que mantienen un seguimiento del estado de la conexion TCP  se llama "con estado".

Firewalls implementados como parte de los sistemas operativos (como ipfw que forma parte del sistema operativo FreeBSD), operan por debajo de la pila de red TCP / IP del sistema operativo y, como tal, debe mantener el mismo tipo de información que la pila de red, aunque no toda. Esto significa una ligera duplicación de datos entre el firewall y la pila de red, pero es necesario para evitar que los paquetes potencialmente peligrosos lleguen a esta pila.

Como funciona ipfw

Ipfw es uno de los firewalls disponibles en FreeBSD por defecto. Los otros son pf e ipf.

El concepto básico de ipfw es una lista numerada de reglas de firewalls que se recorre en orden para cada paquete recibido. Cada paquete se prueba contra las reglas y si se aplica una regla, se toma una acción determinada (por ejemplo, el paquete es omitido o aceptado sin condiciones). Esta lista es de tamaño fijo y puede contener hasta 65.535 entradas numeradas. Los números asignados a las reglas individuales no tienen ningún significado, solo utilizan para ordenar las reglas.

Los paquetes de red se comparan con las reglas basadas en ciertos datos que contienen, como las direcciones MAC, direcciones IP, los puertos TCP, o incluso los datos del paquete, o cierta información que se asocia con ellos, además de los datos que contienen, por ejemplo de qué interfaz de red se les ha recibido, o el estado de la conexión TCP de la cual forman parte. 

La lista de cosas que ipfw puede hacer con los paquetes es bastante larga, e incluye NAT y calidad de servicio.

Sintaxis de reglas

La sintaxis de reglas ipfw es muy legible, y en general sigue esta forma:

<accion> <protocolo> from <fuente> [ to <destino> [recv| xmit | via <nic>] ] [ opciones ]

Las acciones más comunes son allow (permitir) y deny (denegar). Los protocolos son por lo general IP, TCP o UDP. El origen y el destino son direcciones IP o una de las palabras clave especiales como "any"o "me", y la nic es el nombre de una interfaz de red. Las opciones dependen de un protocolo especifico y pueden incluir palabras clave como "keep-state" para permitir comparacion con estado para esta regla, o "setup" que sólo se aplican a paquetes de establecimiento de conexión TCP (SYN).

Habilitacion de ipfw

Ipfw no está activado por defecto. Está disponible como un modulo del núcleo que se carga automáticamente en el arranque si aparece en  /etc/rc.conf. De forma predeterminada, ipfw se carga sólo con una sola regla, la cual descarta todo el tráfico de red. Debido a esto, tenemos que configurar algunas reglas predeterminadas con el fin de acceder al sistema de forma remota (por ejemplo a través de SSH).

Esto se puede hacer mediante la creación de un archivo llamado  /etc/ipfw.rules con las siguientes líneas:
  
add 500 allow ip from any to any via lo0
add 600 deny ip from table(0) to me
add 1000 allow icmp from any to any
add 2000 allow tcp from me to any setup keep-state
add 2001 allow udp from me to any keep-state
add 4022 allow tcp from any to me 22 setup keep-state
add 4080 allow tcp from any to me 80, 443 setup keep-state
add 5000 allow ip from 192.168.1.0/24 to 192.168.1.0/24
add 65400 deny log ip from any to any

Luego de esto el firewall se debe activar agregando la siguiente linea al archivo  /etc/rc.conf

firewall_enable=”YES”
firewall_type=”/etc/ipfw.rules”


Los ejemplos de la lista dada anteriormente son:

500   Primeramente se permite todo el trafico IP a traves del bucle loopback. Esta primera regla se usa para la eficiencia del firewall, para saltar el filtrado de los paquetes del equipo local en las otras reglas.

600   Bloquea todos los paquetes provenientes de alguna de las direcciones IP registradas en la tabla 0 (las tablas seran descritas mas adelante).

1000  Permite el paso de los paquetes del protocolo ICMP incondicionalmente.

2000  Permite el establecimiento de conexiones ("setup") desde todas las direcciones IP asignadas a las interfaces de red local ("me") hacia cualquier direccion foranea ("any") con inspección de estado de paquetes ("keep-state").


2001  Permitir que los paquetes UDP desde todas las direcciones IP asignadas a las interfaces de red local a cualquier direcciones foranea, y permitir un corto tiempo para recibir una respuesta en el mismo puerto ("keep-state").

4022, 4080  Permitir el establecimiento de conexiones TCP ("setup") desde cualquier dirección foranea ("any") para todas las direcciones IP asignadas a las interfaces de red local ("me") en los puertos 22 , 80 y 443 , con la inspección de estado de paquetes ("keep-state").

5000  Permitir todos los paquetes IP independientemente del protocolo o cualquier otro detalle de todas las direcciones en una red local a todas las direcciones en la misma red . Esto también partidos en todas las direcciones de las interfaces de red locales . Esta regla se abre efectivamente el sistema en su totalidad al tráfico de red en la subred loca.

65400 Niega todos los demas paquetes y hace un registro de ellos en syslog.

Ademas de ser leido desde el archivo de configuracion en el arranque del sistema, las reglas pueden ser cargadas en el firewall mediante el uso del comando ipfw como usuario administrador, por ejemplo:

# ipfw add 4025 allow tcp from any to me 25 setup keep-state

Esta regla permite el trafico TCP al puerto 25, usado por SMTP, a cualquier cliente desde internet.

Las reglas no son automaticamente guardadas en el archivo  /etc/ipfw.rules, este archivo debe ser actualizado manualmente.


Previniendo ataques de fuerza bruta al protocolo SSH

Si el sistema trabaja como enrutador IP y esta expuesto a Internet, probablemente se encuentren cientos de ataques de fuerza bruta al protocolo SSH registrados en el archivo  /var/log/security diariamente. Dichos ataques usualmente intentan utilizar docenas de nombres de usuario y contraseña para tratar de ingresar en nuestro sistema, y continuan intentando con otros sistemas cuando no tienen exito, pero estos intentos deben ser bloqueados.

Una forma facil de bloquear este tipo de ataques es usando el programa "sshit". Despues de instalarlo, se debe editar el archivo  /usr/local/etc/sshit.conf y se configura "FIREWALL_TYPE=ipfw2". Este archivo de configuracion tambien contiene parametros el programa sshit bloqueara direcciones IP.

El programa sshit trabaja analizando el archivo del sistema  auth.log en busca de cierto tipo de registros, y le indica al firewall que bloquee las direcciones IP apropiadas agregando dicha direccion a la tabla 0.

Las tablas en ipjw son listas de direcciones las cuales pueden ser usadas en lugar de direcciones individuales, en cuyo caso el firewall aplica las acciones a todas las direcciones IP registradas en la tabla.

REFERENCIAS


Tipos de firewalls de red
http://www.zonasystem.com/2012/06/tipos-de-firewall-de-red-stateless.html

Como configurar Sshguard con IPFW en FreeBSD
http://www.unixmen.com/configure-sshguard-ipfw-firewall-freebsd/

Local file sharing with Samba, NFS and firewall, Ivan Voras, BSD magazine vol 8 N° 12 12-2014, pag 16. Disponible en https://bsdmag.org/download/samba-nfs-and-firewall-new-bsd-issue/

Next-Generation Firewalls for Dummies, Lawrence C. Miller

miércoles, 23 de marzo de 2016

Implantacion de un servidor Samba en FreeBSD para compartir archivos en redes heterogeneas

COMPARTIR ARCHIVOS CON SAMBA EN FREEBSD


    Samba es una implementación libre del protocolo de archivos compartidos de Microsoft Windows, anteriormente conocido como SMB, recientemente nombrado CIFS, para sistemas del tipo UNIX.

    Samba fue creado originalmente para UNIX por Andrew Tridgell usando un sniffer para entender el protocolo y aplicarle ingeniería inversa para su implementación en software libre.

    Samba configura directorios y subdirectorios de UNIX y GNU/Linux como recursos para compartir a través de la red. Para los usuarios de Microsoft Windows, estos recursos aparecen como carpetas normales de la red.

El funcionamiento de Samba es el de permitir un lenguaje común entre sistemas UNIX y Windows, lo cual permite desde un equipo trabajando con Windows, ver las particiones y compartir archivos e impresoras con el equipo UNIX donde esté instalado.

Esta comunicación se logra con la implementación por parte de Samba del protocolo a nivel de sesión NetBIOS, el cual permite establecer una conexión entre dos computadoras conectadas en una red. El otro protocolo implementado por Samba es el SMB (Server Message Block), el cual se implementa sobre el protocolo NetBIOS y es el que permite a los equipos Windows compartir directorios y archivos.

Esencialmente Samba consiste en la ejecución de dos programas, smbd y nmbd, los cuales logran la comunicación con los sistemas Windows.

    Antes de realizar la instalación de cualquier paquete, se debe actualizar el árbol de ports del sistema para tener disponibles los paquetes mas actualizados para su instalación.

    Para realizar la instalación del paquete samba en nuestro sistema FreeBSD, procedemos a ubicarnos en la siguiente ruta:
cd  /usr/ports/net


    Al momento de revisar los paquetes dentro de este directorio, nos percatamos que existen varias versiones de samba almacenadas en diferentes carpetas, basicamente la diferencia fundamental entre las versiones 3.xxx y la 4.xxx, es que con las primeras podemos instalar, entre otros tipos de servicios, un Controlador Principal de Dominio al estilo de los NT4 de Microsoft; mientras que con la serie 4, ya podemos hacernos un Directorio Activo o “Active Directory” al estilo de los Directorios Activos con Microsoft Windows 2000 o superiores.

    Dentro del directorio actual se revisan las carpetas existentes para verificar las versiones de samba existentes dentro del árbol de ports descargado en nuestro sistema.
ls -l | grep samba


    Por el momento no se va a utilizar en esta implementación el Active Directory, por lo tanto usaremos la versión samb 3.6 que es la más documentada, nos ubicamos dentro del directorio indicado.
cd  samba36


    Una vez ubicados dentro del directorio se procede a ejecutar el comando de instalación de samba.
make install clean


    Una vez iniciado el proceso de instalación del paquete samba, se muestra la ventana de opciones de instalación. En esta ventana podemos activar la opción de instalar la interfaz web de configuración de samba SWAT.


    Se dejan las opciones seleccionadas por defecto y continua la instalación del paquete.


    A continuación se presenta la ventana de instalación de python para el correcto funcionamiento del paquete samba.


    Comienza la instalación de python.


    Se solicita la instalación de una serie de paquetes para el correcto funcionamiento de nuestro servidor samba



    A continuación comienza la instalación de toda la paquetería necesaria para el correcto funcionamiento de samba y su correspondiente compilación.






    Una vez instalados todos los paquetes necesarios para el funcionamiento de nuestro servidor samba, procedemos a configurar el inicio automático del servicio al arrancar el sistema, lo cual se logra editando el archivo /etc/rc.conf.


    Al final del referido archivo se debe agregar la siguiente línea
samba_enable=”YES”.


    Toda la configuración del servidor samba que estamos implementando se encuentra en un único archivo ubicado en el siguiente directorio.
cd  /usr/local/etc


    Como podemos observar en el listado de archivos del directorio indicado, existe un archivo con el nombre smb.conf.sample, el cual sirve como ejemplo de configuración del servidor samba, como podemos ver dicho archivo está protegido contra escrituras para mantenerlo original, lo que podemos hacer es crear una copia de este archivo para usarla en nuestra configuración personalizada y dejar un respaldo del archivo original.


    Al detallar el listado de archivos, podemos percatarnos que el archivo copiado hereda la permisología de solo lectura que presenta el archivo original, procedemos a cambiar dicha permisología para poder editar el mencionado archivo.


    Se procede a editar el archivo correspondiente smb.conf, para comenzar a configurar nuestro servidor samba



    Dentro de este archivo se revisan los parámetros básicos de configuración de nuestro servidor samba, los cuales incluyen el grupo de trabajo al cual queremos que pertenezca el servidor, la descripción del servidor, el modo de seguridad y los segmentos de red a los que se les va a brindar el servicio de directorio compartido.


    Para comenzar indicamos el grupo de trabajo al cual va a pertenecer nuestro equipo en la línea workgroup

Se indica una descripción de nuestro servidor samba en la línea server string

Se indica el modo de seguridad en la línea security, la cual puede tener una de las siguientes opciones

user
share
server

    Para definir los equipos o redes que se permite acceder al servicio, se indica en la linea hosts allow, en caso de ser una red completa como de 192.168.1.1 hasta 192.168.1.254 se indica con la opcion 192.168.1., al equipo local se le indica con la opción 127.

    Para realizar la correcta configuración del servidor samba se procede a realizar los pasos que a continuación se resumen.

  • Se crea el o los usuarios a los cuales se les quiere dar acceso a recursos compartidos en el servidor samba
    • adduser  nombreusuario
  • Se crea el grupo de usuarios al cual se va a agregar el o los usuarios que van a compartir el recurso
    • pw  groupadd  nombregrupo
  • Se agregan el o los usuarios al grupo correspondiente para darles acceso a la carpeta compartida por medio del servidor samba
    • pw  user  mod  nombreusuario  -G  grupo
  • Se crea el directorio a compartir
    • mkdir  directorioacompartir
  • Se cambia el grupo al cual pertenece la carpeta que se quiere compartir
    • chgrp nombregrupo directorioacompartir
  • Se cambian los permisos del directorio a compartir para que solo de acceso al usuario propietario y al grupo correspondiente
    • chmod  770  directorioacompartir
  • Se debe crear el bloque en el archivo correspondiente de configuración de samba /usr/local/etc/smb.conf
    • vi  /usr/local/etc/smb.conf
  • Finalmente se debe asignar a los usuarios una contraseña para que se validen en el servidor samba
    • smbpasswd  -a  nombreusuario

    Siguiendo estos pasos básicos podemos tener configurado un servidor samba para darle acceso a los usuarios a los cuales necesitemos brindarles algún tipo de almacenamiento compartido o para que guarden archivos fuera de su equipo personal para protegerlos de algún fallo de su equipo.

    A continuación se detallan los pasos a seguir para los diferentes escenarios que se presentan al momento de compartir un espacio de almacenamiento con uno o varios usuarios, los posibles casos que se presentan con mayor frecuencia son el compartir una carpeta con un único usuario, compartir la carpeta de acceso de cada uno de los usuarios creados, compartir una carpeta con los usuarios que pertenecen a un grupo específico.



CREAR UN ESPACIO PRIVADO DENTRO DE UN SERVIDOR SAMBA



    Para continuar con la configuración se procede a crear un espacio privado de almacenamiento perteneciente a un usuario específico, agregando al archivo smb.conf la siguiente información.


    Se crea el directorio necesario para compartir.
cd  /usr/home/dc/
mkdir  samba



    A continuación se procede a configurar los permisos de la carpeta que se va a compartir de la siguiente manera
chmod 770 samba


    Una vez creada la carpeta que se quiere compartir, es el momento de crear el grupo de samba y agregarle el usuario que va a compartir la carpeta samba mediante el siguiente comando.
pw groupadd smbprivate -M dc

Verificamos que el grupo fue creado correctamente y que se agrego el usuario deseado mediante el siguiente comando
cat /etc/group


    Al final del respectivo archivo se verifican el grupo creado y el usuario registrado a dicho grupo


    Una vez que se ha creado el grupo de samba, procedemos a agregar la carpeta creada para compartir al grupo de samba.
chgrp smbprivate samba


    Una vez realizada esta configuración, se procede a crear la contraseña del usuario de samba usando el siguiente comando
smbpasswd -a dc


    Ahora procedemos a iniciar el servicio con uno de los siguientes comandos, solo hace falta usar uno de ellos

/usr/local/etc/rc.d/samba onestart

ó

service samba restart


    A continuación se procede a comprobar el servidor con el siguiente comando.


    Al ingresar la contraseña de usuario samba, se despliega toda la información del servidor y del grupo de trabajo al cual pertenece.


    Para realizar la prueba definitiva del funcionamiento del servidor samba que acabamos de implementar, verificamos en el sistema la dirección IP asignada.
ifconfig


    Buscamos desde un equipo con Microsoft Windows la dirección indicada por nuestro servidor y tratamos de ingresar con el usuario y la contraseña creados en el equipo con samba.


    Para ingresar a nuestro directorio el sistema solicita autenticarse con nuestro usuario y contraseña





ESPACIO COMPARTIDO POR USUARIO



    Para realizar la configuración de compartir los directorios de conexión de cada usuario creado en el servidor samba, se procede a revisar el archivo de configuración para activarlo.

    En los bloques del archivo smb.conf se presenta un segmento marcado con la etiqueta homes


    Este segmento indica al servidor samba que comparta la carpeta home de cada usuario registrado en el sistema, si el usuario y la contraseña creados en el servidor samba coinciden con el usuario y contraseña de inicio de sesión de windows, se ingresa a la carpeta con solo indicar la dirección IP del servidor y sin necesidad de loguearse.

    Al colocarle browsable = yes al recurso compartido en Samba se visualiza en las carpetas compartidas, pero solo los usuarios pertenecientes al grupo administración pueden visualizar el contenido de la referida carpeta.

    Con esta configuración basta con crear el usuario en el sistema FreeBSD con la misma contraseña con el que está creado en la sesión de windows.
adduser


    Se colocan los datos del nuevo usuario que se está creando, teniendo la precaución de colocarle el mismo nombre de usuario de windows y la misma contraseña,

    Por último se crea la contraseña de acceso de samba para el usuario creado para habilitarlo a iniciar sesion en el servidor samba y ver su carpeta de acceso.
smbpasswd -a nombreusuario



ESPACIO COMPARTIDO PARA UN GRUPO



    Para realizar la configuración de espacio compartido con un grupo de usuarios específicos se debe proceder de la siguiente manera

    Se procede a agregar la sección al archivo smb.conf para dar acceso a un espacio de almacenamiento a todos los miembros del grupo administración.


A continuación se procede a crear una carpeta de acceso a los usuarios pertenecientes a un grupo específico.
cd  /home/samba
mkdir  administracion

Cambiamos la permisología de la carpeta creada para que sea accesible sólo para el usuario y el grupo con el siguiente comando
chmod 770 administracion

    Se debe crear el grupo al que se quiere dar acceso al almacenamiento, de forma tal que todos los usuarios pertenecientes al mencionado grupo puedan acceder al directorio indicado.
pw groupadd administracion

    Luego creamos el usuario que se va a loguear en nuestro servidor de archivos samba
adduser


Una vez creado nuestro usuario, este se agrega al grupo respectivo
pw user mod nuevousuario -G administracion


    Se agrega la contraseña de samba al usuario recién creado.
smbpasswd -a nuevousuario


 
REFERENCIAS



Usando samba, de Robert Eckstein, David Collier−Brown, Peter Kelly.
http://es.tldp.org/Manuales-LuCAS/USANDO-SAMBA/usando-samba.pdf

Servidor Samba
http://www.ite.educacion.es/formacion/materiales/85/cd/linux/m4/servidor_samba.html

Configuración básica de samba
http://www.alcancelibre.org/staticpages/index.php/como-samba-basico 

Instalacion y configuracion de Samba en FreeBSD 10
http://freebsd.mx/tutorial-instalacion-y-configuracion-de-samba-en-freebsd-10 

Instalar y configurar Samba FreeBSD
http://gnulinuxcodigo.blogspot.com/2013/12/instalar-y-congurar-samba-freebsd.html 

Gestión de usuarios, grupos y permisos de samba
http://www.ite.educacion.es/formacion/materiales/85/cd/linux/m4/gestin_de_usuarios_grupos_y_permisos_de_samba.html 

Tipos de servidores samba y el archivo smb.conf
http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-es-4/s1-samba-servers.html 

Montaje de unidad remota de Windows con samba
http://informatica-online.blogspot.com/2009/12/montar-unidad-compartida-via-cliente.html 
http://fraterneo.blogspot.com/2011/06/conectarse-desde-gnulinux-una-carpeta.html 

FreeBSD + Samba + Cups
http://angelvg.blogspot.com/2007/01/freebsd-samba-cups.html

Implementación de un servidor samba con autenticación LDAP como alternativa libre a los servidores de dominio de Windows, de Lázaro J. Ramos Alfonso y Miriel Martin Mesa.
http://www.monografias.com/trabajos-pdf4/implementacion-servidor-samba-autenticacion-ldap/implementacion-servidor-samba-autenticacion-ldap.pdf 

Migrar usuarios samba a nuevo servidor
http://www.tododebian.es/contenidos.php?opc=v&idc=00000126

Vulnerabilidades de denegación de servicio en Samba
http://feedproxy.google.com/~r/hispasec/zCAd/~3/aZh1il3emW4/vulnerabilidades-de-denegacion-de.html