miércoles, 28 de noviembre de 2018

(2/2) Hotspot con portal captivo y autoregistro( VirtualBox,FreeRadius, Coovachilli, HostAPd, MySQL,wifi USB )

CentOS7: (2/2) Hotspot con portal captivo usando  VirtualBox, Wifi USB , FreeRadius, Coovachilli, HostAPd, MySQL y auto-registro.

Esta es la parte 2 del articulo, porque aparentemente Blogger tiene un limite de contenido por post.


Parte 1 (ir)

1.Pre-requisitos para instalación
2.Configuración Virtualbox
3.Freeradius, autenticacion para clientes en red
4.Hostapd, Access Point con USB Wifi
5.Modificar intensidad de señal (dBm)

Parte 2

6.CoovaChilli, portal captivo y DHCP.
7.Probar portal captivo
8.Administración de usuarios
9.Autoregistro y otras personalizaciones del portal




6. Coovachilli, DHCP y portal captivo.


CoovaChilli es un controlador de acceso de software de código abierto, basado en el popular proyecto ChilliSpot que ya no existe, y es mantenido activamente por un colaborador original de este ultimo.

Tiene numerosas funciones que proporciona un portal captivo y utiliza RADIUS para el aprovisionamiento de acceso y su contabilidad(ancho de banda, tiempo, etc).

Cabe mencionar que al iniciar crea su propia red aislada, y sirve de servidor DHCP para la interfaz en la que se le asigne.

-Instalar dependencias
Todos los paquetes necesarios para compilar Coovachilli están aquí, ya que no está disponible en los repositorios.

yum install libnl3-devel libtalloc-devel -y

yum install openssl-devel -y

yum install libtool libgcc gcc-c++ gengetopt -y

yum install patch -y

yum install iptables -y
yum install git -y
 


-Instalar Haserl
Haserl es un pequeño wrapper de cgi que permite la programación de cgi al estilo "PHP", pero utiliza el shell BASH de Linux o Lua como lenguaje de programación. Haserl es necasrio para el mini portal que trae Coovachilli, mas que todo para validaciones desde la web contra Radius.

Descargar haserl:

cd ~
wget -c http://superb-dca2.dl.sourceforge.net/project/haserl/haserl-devel/haserl-0.9.35.tar.gz

Desempaquetarlo al directorio /usr/src:

sudo tar zxvf haserl-0.9.35.tar.gz -C /usr/src/
cd /usr/src/haserl-0.9.35/

Compilar e instalar:

./configure --prefix=/usr --libdir=/usr/lib64

make
sudo make install

Deberia terminar sin ningun problema,y aparecer algo así.



-Instalar CoovaChilli
Hay que descargar la ultima versión, desde donde tienen alojado el código, luego se compila. Aquí es donde se necesitan las dependencias que instalamos anteriormente.

cd /usr/src


sudo git clone https://github.com/coova/coova-chilli.git



cd /usr/src/coova-chilli


sh bootstrap


./configure --prefix=/usr --libdir=/usr/lib64 --localstatedir=/var --sysconfdir=/etc --enable-miniportal --with-openssl --enable-libjson --enable-useragent --enable-sessionstate --enable-sessionid --enable-chilliredir --enable-binstatusfile --enable-statusfile --disable-static --enable-shared --enable-largelimits --enable-proxyvsa --enable-chilliproxy --enable-chilliradsec --with-poll



make


sudo make install

-Configurar CoovaChilli
Todos los archivos a configurar están en /etc/chilli, y son los siguiente:

Hay que crear el archivo de config global, copiando la plantilla que venia con la instalación

sudo cp -v /etc/chilli/defaults /etc/chilli/config
sudo vim /etc/chilli/config

Cambiar parametros que vayan de acuerdo a nuestro ambiente:
# Inferfaz WAN que sale a internet (usualmente es la eth0 o la cableada)
HS_WANIF=eth0

# El dispositivo que va o tiene el AP (la red de suscripción)
HS_LANIF=wlan0



# Los siguientes valores son definidos por nosotros

# La red del HotSpot (obviamente, el mismo server debe estar allí)
HS_NETWORK=10.1.0.0

# Mascara de subred (255.255.255.0 es para 254 hosts, si van a modificar saber de subnetteo.
HS_NETMASK=255.255.255.0

# IP de servidor HotSpot
HS_UAMLISTEN=10.1.0.1



# El secret password que pusimos en el paso de Radius ( valor secret  en /etc/raddb/clients.conf )
HS_RADSECRET=probando123

HS_UAMSECRET=probando123

# Aqui poner el usuario que desean sea administrador de coova si lo van a administrar después.

HS_ADMUSR=coova_admin_usuario
HS_ADMPWD=coova_admin_password


Agregar el script ipup.sh que sirve para hacer unas reglas con iptables, que permite hacer de router para la red que estamos creando con CoovaChilli.


sudo vim /etc/chilli/ipup.sh


#!/bin/sh
#
# Agrega una regla de NAT que pasa todo el trafico por la interface que mira la WAN, o el ISP, o el internet.

/usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

#NOTA: colocar el dispositivo WAN correcto, como les dije arriba comúnmente será eth0 pero puede ser diferente según tu ambiente o configuración, el mio era el ensps03.

Se guarda y se vuelve ejecutable y se ejcuta para ya dejar el cambio:

sudo chmod 755 /etc/chilli/ipup.sh


/etc/chilli/ipup.sh



-Generar archivo de configuración:

/etc/rc.d/init.d/chilli


7. Probar el portal captivo

Esto tomando en cuenta que ya se puede acceder a internet desde la máquina virtual. 
NOTA**  Se debe iniciar primero hostapd y freeradius en el mismo orden que se miro en la parte 1/2 , lo resumo aquí:

sudo systemctl start mariadb
sudo nmcli radio wifi off
sudo rfkill unblock wifi
sudo systemctl start hostapd
sudo systemctl start radiusd

Se recomienda crear script para iniciar el servicio.

Luego se inicia CoovaChilli y se prueba desde un dispositivo

/usr/sbin/chilli


 


  




Para bajar el servicio:

pkill -f chilli

NOTA**
Algunos dispositivos, incluyendo moviles antiguos o computadoras No haran el redireccionamiento automatico, por lo que tendran que indicarle al usuario que intente navegar a algun dominio “.com” pero no debe haber estado guardado en memoria, ya que para que pueda cargar el login del portal captivo CoovaChilli, y por ende navegar, debe hacer una “intercepcion” del trafico que no funciona con HTTPS , solo HTTP (sin ssl) , ya posterior al login todo funciona normal
Ejemplo:
www.algo.com (sin https) 
El portal captivo aparecerá y pedira credenciales, y podrá navegar
https://www.algo.com
El portal captivo NO aparecera, y nunca podra navegar.



8.  Administración de usuarios.

Para agregar usuarios pueden crear este pequeño Script:

sudo vim /etc/usuariosportal.sh

Y agregar el siguiente contenido:

#!/bin/bash

read -p "Ingrese nombre de usuario: " user

read -p "Ingrese contraseña: " pass



read -p "Se agregará el - $user - con la contraseña - $pass -, está bien? (s/n) " sn


case $sn in

          [sS]*)

         echo "INSERT INTO radius.radcheck (UserName, Attribute, Value, Op) VALUES ('$user', 'Cleartext-Password', '$pass', ':=');" |  mysql -u usuario_db -p password_db radius

          ;;

              *)

            echo "No se aplicará el cambio, adiós"

  esac


Guardarlo y hacerlo ejecutable:


Y probarlo:

/etc/usuariosportal.sh

  
 

9. Autoregistro y otras personalizaciones del portal

Para hacer auto registro es decir, que se logeen con sus nombres y correo, u otros parametros que nosotros deseemos, incluyendo la MAC address del dispositivo, se pueden realizar ciertos cambios al código de la aplicación, recordar que es Open Source <3.
Primero, se debe hacer respaldo de los archivos que se utilizarán.
De la ruta copiarlos a un lugar seguro:
cd /etc/chilli/www

mkdir backup

cp -v coova.html login.tmpl login.chi login_success.tmpl terms.tmpl header.tmpl footer.tmpl config-local.sh login_form.tmpl backup/


-Modificar login_form.tmpl
Este es la plantilal dónde se ingresan las credenciales, aqui se debe poner como hidden los campos dónde se van las credenciales para el Radius server, y ponerlas en duro. En amarillo lo que se comenta y modifica,  en verde lo que se agrega.
vim /etc/chilli/www/login_form.tmpl

Y editar:

<tr>

   <!-- <td>Usuario</td>

   <td><INPUT NAME="username" VALUE="usuario_radius" TYPE="hidden"></td>

</tr>

<tr>

  <td>Nombre</td>

  <td><INPUT NAME="usernombre" VALUE="$FORM_usernombre" TYPE="text" required  style="text-transform:uppercase"></td>

</tr>

<tr>

  <td>Email</td>

  <td><INPUT NAME="usermail" VALUE="$FORM_usermail" TYPE="email"  pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$" required style="text-transform:lowercase" title="Ingrese email valido."></td>

</tr>

<tr>

  <td><INPUT NAME="password" VALUE="contraseña_radius" TYPE="hidden"></td>

</tr>


-Modificar config-local.sh
Este es el Script dónde entra en juego Haserl. Es dónde se hacen las validaciones contra la base de datos y se recuperan muchas variables. Es el más importante de todos. En amarillo lo que se comenta y modifica,  en verde lo que se agrega.
vim /etc/chilli/www/config-local.sh
Y editar:

dologin() {

            echo "insert into radcheck (username, attribute, op, value) values ('$FORM_usermail', '$(date)', ':=', 'self-reg', upper('$FORM_usernombre');" | mysql -u db_usuario -p db_password radius

url=$(chi_login_url "$FORM_username" "$FORM_password" "$FORM_userurl")



FORM_username="${FORM_username:-$FORM_UserName}"

FORM_username="${FORM_username:-$FORM_Username}"

FORM_password="${FORM_password:-$FORM_Password}"

FORM_usermail="${FORM_usermail:-$FORM_UserMail}"

FORM_usernombre="${FORM_usernombre:-$FORM_UserNombre}"

FORM_usernombre="${FORM_usernombre:-$FORM_Usernombre}"
Nota** Parecen duplicados unos valores, pero por alguna razón asi funciona bien, si se quita la duplicidad me vaciaba las variables.

Otros cambios:
-Cambiar Mensaje de bienvenida al cargar Login.
vim /etc/chilli/www/login.tmpl

-Cambiar imagen de espera al cargar Login.
vim /etc/chilli/www/coova.html



Modificar lo que está en rojo (recordar que las imagenes que pongamos, DEBEN existir en el folder):

<img src="coova.jpg" alt="" border="0" height="210" width="242"/></a><br>

<small><img src="wait.gif"/> redirecting...</small></p>

-Cambiar pagina a la que redirecciona una vez que hace loggeo exitoso:
vim /etc/chilli/www/login.chi



case "$FORM_res" in

            success|already)

                url=$FORM_redirurl

                url=${url:-$FORM_userurl}

                        url="https://www.google.com"

                header "<meta http-equiv=\"refresh\" content=\"5;url=${url}\"/>"

                uamfile "login_success" 1

                footer

                exit


-Cambiar Mensaje de loggeo exitoso:
vim /etc/chilli/www/login_success.tmpl



<!--

  --  The login success message

  -->

-<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>-

  <h1>Ha iniciado exitosamente!</h1>

Seras redirigido a: <p><a href="https://www.google.com">https://www.google.com</a></p>

Para salir de la sesion, escriba "logout" (o "http://logout/") en su navegador. <b>Disfrute!</b>

-Cambiar Terminos y Acuerdos de Uso del Servicio:
vim /etc/chilli/www/terms.tmpl

-Cambiar imagen y texto en encabezado y pie de pagina:
vim /etc/chilli/www/header.tmpl

vim /etc/chilli/www/footer.tmpl

FINAL DEL ARTICULO.

Este tutorial se validó al momento de su redacción, por lo que si algo falla, favor hacer doble check o dejar preguntas en los comentarios.

Recordar que esto es Open Source, por lo que no deben quitar logos y mensajes que hagan mención de Coova.org ya que ellos son los que lo desarrollan.

Tambien tomar en cuenta que todo esto es con fines educativos, o quizás también para algo pequeño como un negocio propio, y pequeño, ya que se salta MUCHAS medidas de seguridad, que para aplicar en un caso corporativo, no ajustaría este tutorial, sin embargo, es un buen comienzo para formar algo mejor.

 Referencias

How to install a wireless hotspot with captive page on Linux using CoovaChilli

https://www.howtoforge.com/tutorial/how-to-install-a-wireless-hotspot-with-captive-page-in-linux-using-coovachilli/#configure-hostapd

FreeRadius 3.0.x Installation and configuration with Mysql
https://lalitvc.wordpress.com/2014/07/03/freeradius-3-0-x-installation-and-configuration-with-mysql/

Hostapd : The Linux Way to create Virtual Wifi Access Point
https://nims11.wordpress.com/2012/04/27/hostapd-the-linux-way-to-create-virtual-wifi-access-point/

Open source captive portal and RADIUS solution
https://github.com/coova/coova-chilli