"Después del juego es antes del juego"
Sepp Herberger

viernes, 30 de septiembre de 2022

Filtrando publicidad con powerdns (III)

Nuestro filtro de publicidad basado en PowerDNS funciona bastante bien limpiando anuncios indeseados de las páginas y agilizando la navegación dentro de nuestra red.

El problema es que a veces filtra demasiado y nos quedamos sin ver cosas que pueden interesarnos (o no, como ATRESplayer). Esta semana me comunicaron que no se cargaban los contenidos de RTVE Play. Tras analizar el tráfico web con las opciones de desarrollador del navegador veo que se están cortando peticiones web a una serie de sitios con el nombre "gigya" y esto acababa repercutiendo en que no se cargaban los vídeos de RTVE.

La solución es no filtrar esos sitios, pero recordeoms que el script que construye la lista negra recopila los datos de varias ubicaciones web y no es sencillo quitar de esa lista uno a uno manualmente los sitios que si deseo permitir. Es el momento de implementar una "lista blanca" con patrones para identificar los sitios permitidos. El script blacklist-powerdns.sh quedaría:
# cat blacklist-powerdns.sh 
#!/bin/bash

#Crea fichero de bloqueos de publicidad y sitios web para powerdns.

#Descargamos listados de sitios web de publicidad a bloquear.
cp /dev/null /tmp/filter-hosts

wget -N -O /tmp/hosts https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
grep "^0.0.0.0" /tmp/hosts |  awk '{print $2}' >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

wget -N -O /tmp/hosts http://sysctl.org/cameleon/hosts
grep "^127.0.0.1" /tmp/hosts | awk '{print $2}' >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

wget -N -O /tmp/hosts https://mirror1.malwaredomains.com/files/justdomains
cat /tmp/hosts >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

wget -N -O /tmp/hosts https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
cat /tmp/hosts >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

wget -N -O /tmp/hosts https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
cat /tmp/hosts >> /tmp/filter-hosts
echo "" >> /tmp/filter-hosts

#Este enlace está muerto
#wget -N -O /tmp/hosts https://hosts-file.net/ad_servers.txt
#cat /tmp/hosts >> /tmp/filter-hosts

#Añadimos lista negra de dominios mantenida por nosotros
if [ -f /etc/powerdns/bloqueados.list ]
then
   cat /etc/powerdns/bloqueados.list >> /tmp/filter-hosts
   echo "" >> /tmp/filter-hosts
fi

#Ordenamos y quitamos dominios repetidos. Borramos comentarios.
cp /tmp/filter-hosts /tmp/filter-hosts2
sort -u -o /tmp/filter-hosts /tmp/filter-hosts
sed -i '/^localhost$/d' /tmp/filter-hosts
sed -i '/^#/d' /tmp/filter-hosts

#Quitamos de la lista los que tienen las palabras en /etc/powerdns/permitidos.list
if [ -f /etc/powerdns/permitidos.list ]
then
   for cadena in $(cat /etc/powerdns/permitidos.list)
   do
     sed -i  "/$cadena/d" /tmp/filter-hosts
   done
fi

#Generamos el fichero blocklist.lua compatible con powerdns
echo "return {" > /tmp/blocklist.lua
for i in $(cat /tmp/filter-hosts)
do
   echo \"$i\", >> /tmp/blocklist.lua
done
echo "}" >> /tmp/blocklist.lua

#Copiamos fichero de bloqueo DNS y reiniciamos servicio.
/etc/init.d/pdns-recursor stop
/etc/init.d/pdns stop
cp -f /etc/powerdns/blocklist.lua /etc/powerdns/blocklist.lua.bak
cp -f /tmp/blocklist.lua /etc/powerdns/blocklist.lua
/etc/init.d/pdns start
/etc/init.d/pdns-recursor start

exit 0

En negrita está el código nuevo: una vez hecha la lista de sitios filtrados recorremos el contenido del fichero /etc/powerdns/permitidos.list y eliminamos de la lista los sitios que tienen las palabras/subcadenas encontradas allí. En principio he puesto en permitidos.list solo una línea con la cadena "gigya", pero seguramente en los próximos meses vaya añadiendo mas contrafiltros que hagan menos estricta la lista negra con la que venimos trabajando.


Espectacular petardazo de la NASA para desviar un asteroide con el impacto de la sonda DART. Esperemos que, como las armas nucleares, todo se quede en ensayos y no sea necesario usarlo nunca.

lunes, 26 de septiembre de 2022

Lanzar de forma remota una aplicación dentro de la sesión gráfica del usuario.

En diferentes escenarios puede ser que tengamos que abrir una aplicación gráfica dentro del escritorio del usuario que ha iniciado la sesión sin estar fisicamente presentes en ese puesto. Esto va desde mostrar un mensaje al usuario con "zenity" o "notify-send" a abrir una aplicación concreta de forma automática en su escritorio en un momento dado.

Esto nos permitiría abrir una aplicación "mágicamente" en el escritorio del usuario desde una conexión ssh remota o desde un script lanzado desde crontab.

El truco está en que antes de ejecutar el comando que lanza la aplicación asignamos a las variables XAUTHORITY y DISPLAY los valores adecuados para entrometerse en la sesión abierta por el usuario que ha iniciado sesión físicamente en la máquina.

Una primera aproximación, muy burda, sería ejecutar, con el usuario root, estos comandos desde consola:
# export XAUTHORITY=/run/lightdm/root/:0 
# DISPLAY=:0 zenity --info --text "Ola ke ase"

Esto conecta con la sesión X iniciada con lightdm (el gestor de inicios de sesión) y muestra la ventana. El peligro que tiene esta forma es que el comando (zenity en este caso) se ejecuta como root, con los riegos que esto conlleva. En el caso de zenity en principio no hay mucho peligro, pero un programa como geany o un explorador de archivos abiertos como root en una sesión de usuario raso es bastante mas arriesgado.

La ventaja que tiene esté metodo es que permite mostrar la aplicación incluso si ningún usuario ha iniciado sesión, en la pantalla de login. Por ejemplo, puede ser util para mostrar mensajes en el escritorio haya o no sesión iniciada.

La otra aproximación, más ortodoxa, pasa por averiguar que usuario ha iniciado sesión en el escritorio y conectarnos con su sesión X en concreto. Los pasos son:
# comando='zenity --info --text "Ola ke ase"' # Programa a ejecutar
# user=$(who | grep "(:0)" | awk '{print $1}')) # Averiguamos que usuario ha iniciado sesión en el ordenador, 
# home_user=$(su usuario -c 'echo $HOME') # Averiguamos cual es su directorio home. Otra forma: home_user=$(getent passwd  usuario | cut -d":" -f6)
# export XAUTHORITY="$home_user/.Xauthority" # Accedemos a su fichero .Xauthority
# DISPLAY=:0 su $user -c $comando # Lanzamos el programa con la identidad del usuario

Todo este código anterior lo podemos meter un script que lancemos desde nuestra conexión ssh o desde un crontab u otro sistema de ejecución en background y con ello lograremos nuestro objetivo, para desconcierto del usuario que verá como se abren cosas de forma inesperada.

viernes, 23 de septiembre de 2022

Cambiar hostname de un equipo de forma automática a partir de los datos de ldap.

Como todo principio de curso, andamos de mundanza moviendo equipos de unas aulas a otras. Eso implica cambiar su nombre según la nomenclatura que sigamos en nuestro centro, para tenerlo localizado ante cualquier alarma o incidencia.

En el árbol ldap de nuestra red tenemos una entrada en la que asociamos la MAC de cada equipo con su hostname. Una vez hemos cambiado el nombre allí luego toca ir fisicamente al propio equipo y cambiar dicho hostname otra vez a mano. Como esta parte es muy aburrida he escrito un script que toma la MAC del equipo, la busca en ldap y si la encuentra cambia el hostname al que allí aparece.
# cat set-hostname-from-mac.sh 

#!/bin/bash

#Busca las MACs en ldap y si tienen un nombre asociado, configura el equipo con dicha mac.

#Sacamos las MACs de las tarjetas de red del equipo
macs=$(cat /sys/class/net/*/address | grep -v "00:00:00:00:00:00")

for mac in $macs
do
   #Buscamos en la MAC en ldap en la rama de configuración DHCP
   name=$(ldapsearch -xLLL -h ldap -b cn=DHCP\ Config,dc=instituto,dc=extremadura,dc=es "(dhcpHWAddress=ethernet $mac)" "cn" | grep "^cn" | cut -d" " -f2)
   if [ -n  "$name" ]
   then
         echo "Nombre nuevo: $name"

         echo $name > /etc/hostname
         hostname -F /etc/hostname
         echo $name > /proc/sys/kernel/hostname
         sed -i "s/127.0.1.1.*/127.0.1.1 $name/g"  /etc/hosts

         exit 0
   fi
done
echo "MAC no encontrada"
exit

Este script podemos ejecutarlo desde una tarea puppet o en paralelo sobre muchos equipos a la vez usando tmux-cssh.


Bonita foto tomada desde la ISS del despegue de la Soyuz MS-22 hace un par de días, con un astronauta estadounidense y dos astronautas rusos. Al menos allí arriba no hay guerras.

Nunca había visto un chemtrail de una Soyuz. Los conspiranoicos correrían en círculos gritando si se enterasen.