Proyecto

General

Perfil

« Anterior | Siguiente » 

Revisión 451

dhcp-server-denegar: Filtro por MAC

Ver diferencias:

dhcp-server-denegar/trunk/dhcp-server-denegar
#!/bin/bash
# ***********************************************************************************************************
# Antonio J. Abasolo Sierra (Dic-2012)
#
# Controla el acceso al sistema, filtrando los equipos a los que el servidor dhcp del centro ofrecerá ip,
# y por lo tanto podrán navegar.
# Se base en el sistema de lista blanca (mantenida por el usuario),
# y lista negra (obtenida por filtrado de entradas del fichero del servidor dhcp: dhcpd.leases)
#
# La Lista_Blanca de equipos que dejamos conectarse la mantenemos nosotros, y debe tener este formato:
# MAC,EQUIPO[,IP][,NOMBRE]
# EQUIPO --> nombre personal para conocer al equipo.
# [,IP] --> Se rellenará automáticamente por el script.
# [,NOMBRE] --> Se rellenará automáticamente por el script (si lo tiene).
#
# Para dejarlo operativo colocaremos un crontab que ejecute este script cada 5 min. (por ej.)
# ***********************************************************************************************************
FILE_CONF=/etc/dhcp/dhcpd.conf
FILE_LEASES=/var/lib/dhcp/dhcpd.leases
LISTA_NEGRA=/etc/dhcp/hosts.deny
LISTA_BLANCA=/etc/dhcp/hosts.accept
SERVICIO=isc-dhcp-server
Crear_BaseConf() {
if [ ! -f $FILE_CONF.base ]; then
cat $FILE_CONF > $FILE_CONF.base
fi
}
Configuracion_Base() {
Crear_BaseConf
if [ -f $FILE_CONF.base ]; then
cat $FILE_CONF.base > $FILE_CONF
fi
}
Configuracion_Base2() {
echo "
# ------------------------------------------------
ldap-server "ldap";
ldap-port 389;
ldap-base-dn "dc=instituto,dc=extremadura,dc=es";
ldap-dhcp-server-cn "ldap";
ldap-method dynamic;
#ldap-method static;
ddns-update-style none;
# ------------------------------------------------
" > $FILE_CONF
}
Obtener_Leases() {
# Creamos un fichero de leases con una entrada por línea: MAC,IP,NOMBRE
echo " - Obtenemos 'pcs.leases': equipos conectados vía dhcp-server ..."
cat $FILE_LEASES | grep -v '#' > pcs.leases
rm -f pcs 2>/dev/null ; touch pcs
cat pcs.leases | while read linea ; do
KEY=`echo $linea | awk '{print $1}'`
case "$KEY" in
lease) IpPC=`echo $linea | awk '{print $2}'`
;;
hardware) MacPC=`echo $linea | awk '{print $3}' | cut -f1 -d';' | tr A-Z a-z`
;;
client-hostname) NombrePC=`echo $linea | awk -F'"' '{print $2}'`
;;
*)
if [ $MacPC ]; then
esta=`grep -i $MacPC pcs` 2>/dev/null
if [ ! $esta ]; then
echo "$MacPC,$IpPC,$NombrePC" >> pcs
NombrePc=""
fi
fi
;;
"")
;;
esac
done
cat pcs | uniq | sort -t, -u -k2 > pcs.leases
rm -f pcs
}
Obtener_ListaNegra() {
# Recorremos el fichero de leases obtenido, y lo filtramos con la lista-blanca
echo " - Creamos $LISTA_NEGRA: lista de equipos a denegar (lista negra)"
rm -f $LISTA_NEGRA 2>/dev/null ; touch $LISTA_NEGRA
cat pcs.leases | while read linea; do
MAC=`echo $linea | cut -f1 -d,`
IP=`echo $linea | cut -f2 -d,`
PC=`echo $linea | cut -f3 -d,`
ESTA=`grep -i $MAC $LISTA_BLANCA` 2>/dev/null
if [ ! $ESTA ]; then
echo "$MAC,$PC,$IP" >> $LISTA_NEGRA
else
EQUIPO=`grep ^$MAC $LISTA_BLANCA | cut -f1-2 -d,`
grep -v ^$MAC $LISTA_BLANCA > tmp
mv tmp $LISTA_BLANCA
echo "$EQUIPO,$IP,$PC" >> $LISTA_BLANCA
fi
done
}
Crear_Configuracion() {
echo " - Creamos $FILE_CONF: fichero de configuración de dhcp-server"
Configuracion_Base
NUMPC=0
echo "" >> $FILE_CONF
echo "# Equipos con entrada denegada:" >> $FILE_CONF
echo "# -----------------------------" >> $FILE_CONF
cat $LISTA_NEGRA | while read linea; do
NUMPC=`expr $NUMPC + 1`
MAC=`echo $linea | cut -f1 -d,`
PC=`echo $linea | cut -f2 -d, | tr '-' '_'`
if [ $PC ]; then
ESTA=`grep -w $PC $FILE_CONF` 2>/dev/null
if [ "$ESTA" ]; then PC=Equipo_$NUMPC; fi
else
PC=Equipo_$NUMPC
fi
echo "host $PC {
hardware ethernet $MAC;
deny booting;
}" >> $FILE_CONF
done
}
Reiniciar_Servicio() {
echo " - Reiniciamos el servicio $SERVICIO:"
#/etc/init.d/$SERVICIO restart
/etc/init.d/$SERVICIO stop > /dev/null
/etc/init.d/$SERVICIO start > /dev/null
if [ $? -ne 0 ]; then
echo " * Error al iniciar el servicio."
echo " * Comprueba el fichero de configuración creado: $FILE_CONF"
else
echo " * Servicio reiniciado correctamente."
fi
echo ""
}
# -----------------------------------------------------------------------------
case "$1" in
start)
echo ""
echo " Configurando dhcp.conf para denegar conexiones ... "
echo " ---------------------------------------------------"
Obtener_Leases
Obtener_ListaNegra
Crear_Configuracion
Reiniciar_Servicio
;;
stop)
echo ""
echo " Configurando dhcp.conf para aceptar todas las conexiones ... "
echo " ---------------------------------------------------"
Configuracion_Base
Reiniciar_Servicio
;;
status)
;;
*)
N=/etc/init.d/$NAME
echo ""
echo "Usage: $N {start|stop|status}" >&2
echo ""
exit 1
;;
esac
exit 0
dhcp-server-denegar/trunk/readme
# Script: dhcp-server-denegar
# Autor: Antonio J. Abasolo Sierra
# Fecha: Diciembre-2012
Este script se encarga de regenerar el fichero de configuración de isc-dhcp-server, situado en /etc/dhcp/dhcpd.conf
A groso modo, hace lo siguiente:
- Se crean dos ficheros en la ruta de dicho servicio, que son:
* /etc/dhcp/hosts.accept --> lista blanca de equipos conocidos a los que no será cortado su acceso.
Formato: MAC,Nombre
00:1c:b3:c4:fe:13,Ponente
* /etc/dhcp/hosts.denny --> lista negra de equipos a los que les cortaremos el acceso
Formato: MAC,Nombre
00:1c:b3:c4:fe:13,InglesP1
- Se crea el fichero 'pcs.leases' (en ruta de ejecución del script),
con las mac's del fichero /var/lib/dhcp/dhcpd.leases --> Solo estarán las MAC's de equipos
que no esten dados de alta en LDAP, y que no tengan puesta ip fija (manualmente).
Formato: MAC,IP,Nombre
00:1c:b3:c4:fe:13,172.23.23.5,InglesP1
- El script regenere el fichero /etc/dhcp/dhcp.conf, con
las líneas básicas de ldap (almacenadas previamente en el fichero /etc/dhcp/dhcpd.conf.base,
y las denegaciones de mac's del fichero de lista-negra-macs: /etc/dhcp/hosts.deny
- El fichero de lista-negra-macs se obtiene del quitarle al fichero pcs.leases, las mac's del fichero de lista-blanca
* /etc/dhcp/hosts.deny = (pcs.leases - /etc/dhcp/hosts.accept)
- Se reinicia el servicio correspondiente:
* /etc/init.d/isc-dhcp-server stop
* /etc/init.d/isc-dhcp-server start
- Pones un cron (crontab) en el servidor NFS para que ejecute dicho
script cada X tiempo, por ej. cada 5 min.
*****
Posibles Mejoras:
- Permitir añadir ip's manualmente al fichero de lista-negra-macs
- Limpiar el fichero /var/lib/dhcp/dhcpd.leases

Exportar a: Unified diff