develop

pfSense – Notificar via email Alerta de acceso a shell interactiva y NO interactiva.

Refs:

Procedimiento:
-Condición necesaria: Tener configurado y operativo: System > Advanced > Notifications > E-Mail

-Se crea (o se modifica si existiese) el fichero sshrc en /etc/ssh ( /etc/ssh/sshrc ) con el contenido:

ipfrom=`echo $SSH_CONNECTION | cut -d " " -f 1`
ippf=`echo $SSH_CONNECTION | cut -d " " -f 3`
theport=`echo $SSH_CONNECTION | cut -d " " -f 4`
echo "User $USER just logged in from $ipfrom to $ippf at port $theport || date: `date` || who: `who`" | /usr/local/bin/php /usr/local/bin/mail.php -s"`hostname`"

Y ya sea por un login vía SSH interactivo (con shell) o no interactivo (sin shell, como cuando se ejecuta un comando remoto vía ssh), el sistema nos enviará un e-mail con los datos:

User root just logged in from 10.2.0.10 to 10.2.0.254 at port 22 || date: Wed Mar 22 15:58:25 CET 2017 || who: root             ttyv0        Mar 14 13:23

root             pts/0        Mar 22 15:51 (10.2.0.10)

Y voila 🙂

(Visited 338 times, 1 visits today)

WordPress Updater Script

Un bash/shell script para actualizar WordPress (Multisite) vía WP CLI (WordPress Command Line Interface), que he encontrado en github. Lo he probado en mi wordpress, y así es como lo he implementado y me ha funcionado.

#cd /path/your-blog-folder/
cd /home/YOUR-USER/YOUR-PATH/YOUR-WP-FOLDER
wp core update
wp core update-db
wp plugin update --all
wp theme update --all
wp db optimize

Y voila 🙂

(Visited 19 times, 1 visits today)

shallalist2pfBlockerNG.php V2 – script para importar categorias shallalist a pfBlockerNG

Nueva versión de este script ( v1 en https://www.javcasta.com/shallalist2pfblockerng-php-script-para-importar-categorias-shallalist-a-pfblockerng/ )

Sólo cambio el “path” o camino donde trabaja el script. Ya que /tmp no es persistente en un reinicio del sistema, y he chequeado que /usr/games sí es persistente

I only change the path, because on a reboot the directory /tmp is not persistent.
Now the path is: /usr/games/ , I have checked that this directory is persistent after a reboot.

El código

<?php

/*
	shallalist2pfBlockerNG.php
	Copyright (C) 2016 javier@javcasta.com Javier Castañón
        @javcasta - PIyMenta - https://javcasta.com/

	Redistribution and use in source and binary forms, with or without
	modification, are permitted provided that the following conditions are met:

	1. Redistributions of source code must retain the above copyright notice,
	   this list of conditions and the following disclaimer.

	2. Redistributions in binary form must reproduce the above copyright
	   notice, this list of conditions and the following disclaimer in the
	   documentation and/or other materials provided with the distribution.

	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
	POSSIBILITY OF SUCH DAMAGE.
*/

require_once("config.inc");
require_once("util.inc");
require_once("functions.inc");
require_once("pkg-utils.inc");
require_once("pfsense-utils.inc");
require_once("globals.inc");
require_once("services.inc");

global $config;
$config = parse_config(true);

//bash 
// /usr/games/
//Remove directory
print_r("Remove /usr/games/BL dir \n");
mwexec("/bin/rm -rf /usr/games/BL");
//Create directory
print_r("Create /usr/games/BL dir \n");
mwexec("/bin/mkdir /usr/games/BL");
//Download list
print_r("Download shallalist.tar.gz \n");
mwexec("/usr/bin/fetch -o /usr/games/BL http://www.shallalist.de/Downloads/shallalist.tar.gz");
#Extract and remove archive
print_r("Extract... \n");
//mwexec("/usr/bin/cd /usr/games/BL");
mwexec("/usr/bin/tar -xf /usr/games/BL/shallalist.tar.gz --strip 1 -C /usr/games/BL");
mwexec("/bin/rm -rf /usr/games/BL/shallalist.tar.gz");

function listFolders($dir)
{
    //ref //http://stackoverflow.com/questions/14358346/how-to-build-a-array-that-contains-a-folder-structure
    $dh = scandir($dir);
    $resultado = array();
    $laruta = '';

    foreach ($dh as $folder) {
        if ($folder != '.' && $folder != '..' && $folder != 'COPYRIGHT' &&
                $folder != 'global_usage' && $folder != 'shallalist.tar.gz') {
            $laruta = $dir . '/' . $folder;
            if (is_dir($dir . '/' . $folder)) {                
                $resultado[] = listFolders($dir . '/' . $folder);               
            } else {
                if (strpos($folder, 'domains') !== false) $resultado[] = $laruta;                
            }
        }
    }
    return $resultado;
}
//folders /usr/games/BL to array
$losdiraux = listFolders("/usr/games/BL");
$losdir = iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($losdiraux)), 0);

//DNSBL feed shallalist2pfBlockerNG
$j = 0;
$existeDNSBLfeed = false;
while (!empty($config['installedpackages']['pfblockerngdnsbl']['config'][$j]['aliasname'])) {
    $j++;
    if (strpos($config['installedpackages']['pfblockerngdnsbl']['config'][$j]['aliasname'], "shallalist2pfpBlockerNG") !== false) {
        $existeDNSBLfeed = true;
        print_r("Already exists DNSBL feed shallalist2pfpBlockerNG ... \n");
    }
}

if (!$existeDNSBLfeed) {
    $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['aliasname'] = "shallalist2pfpBlockerNG";
    $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['description'] = "shallalist to pfBlockerNG";
    $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['infolist'] = "";
    //...
    $i = 0;
    foreach ($losdir as $elemento) {
        $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['row'][$i]['format'] = 'auto';
        $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['row'][$i]['state'] = 'Disabled'; //Enabled
        $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['row'][$i]['url'] = "$elemento";
        $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['row'][$i]['header'] = "sh2pfB_$i";
        $i++;
    }
    //...
    $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['action'] = "unbound";
    $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['cron'] = "Weekly";
    $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['filter_alexa'] = "on";
    $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['custom'] = "";
    $config['installedpackages']['pfblockerngdnsbl']['config'][$j]['custom_update'] = "disabled";
    print  "pfBlockerNG DNSBL feed List shallalist2pfpBlockerNG Import Completed...\n\n";
    write_config();
}

//Cron
//si no existe /usr/games/scripts lo creamos - if not exist /scripts create it
if(!is_dir('/usr/games/scripts')) {
  mkdir('/usr/games/scripts');
}
//si no existe /usr/games/scripts/cron-download-shallalist2pfpBlockerNG.sh lo creamos
if (!file_exists('/usr/games/scripts/cron-download-shallalist2pfpBlockerNG.sh')) {
 //bash
 $contenido = "#!/bin/sh\n"
        . "/bin/rm -rf /usr/games/BL\n"
        . "/bin/mkdir /usr/games/BL\n"
        . "/usr/bin/fetch -o /usr/games/BL http://www.shallalist.de/Downloads/shallalist.tar.gz\n"
        . "/usr/bin/tar -xf /usr/games/BL/shallalist.tar.gz --strip 1 -C /usr/games/BL\n"
        . "/bin/rm -rf /usr/games/BL/shallalist.tar.gz\n";
 file_put_contents("/usr/games/scripts/cron-download-shallalist2pfpBlockerNG.sh", $contenido);
 print_r("Create /usr/games/scripts/cron-download-shallalist2pfpBlockerNG.sh ... \n");

} else print_r("Already exists /usr/games/scripts/cron-download-shallalist2pfpBlockerNG.sh ... \n");
//existe Cron?
$j = 0;
$existecron = false;
while (!empty($config['cron']['item'][$j]['command'])) {
    $j++;
    //print_r($config['cron']['item'][$j]['command']."\n");
    if (strpos($config['cron']['item'][$j]['command'], "/bin/sh /usr/games/scripts/cron-download-shallalist2pfpBlockerNG.sh") !== false) {
        $existecron = true;
        print_r("Already exists cron for /bin/sh /usr/games/scripts/cron-download-shallalist2pfpBlockerNG.sh \n");
    }
}
//si no existe cron lo creamos a ejecutar como root cada domingo a las 06:06
if (!$existecron) {
    $config['cron']['item'][$j]['minute'] = "6";
    $config['cron']['item'][$j]['hour'] = "6";
    //$config['cron']['item'][$j]['mday'] = "*";
    //$config['cron']['item'][$j]['month'] = "*";
    $config['cron']['item'][$j]['wday'] = "7";
    $config['cron']['item'][$j]['who'] = "root";
    $config['cron']['item'][$j]['command'] = "/bin/sh /usr/games/scripts/cron-download-shallalist2pfpBlockerNG.sh";
    print_r("Create cron for /bin/sh /usr/games/scripts/cron-download-shallalist2pfpBlockerNG.sh ... \n\n");
    write_config();
}
print_r("You have to go to https://YOUR-IP-PFSENSE/pkg.php?xml=/pfblockerng/pfblockerng_dnsbl_lists.xml \n"
        . " Firewall > pfBlockerNG > DNSBL Feeds: and edit/put ON/OFF the Categories you wish \n"
        . "and Force Update update/reload DNSBL pfblockerNG \n\n");
print_r("The End :). By javcasta - htpps://javcasta.com \n");
?>

Y voila 🙂

(Visited 84 times, 1 visits today)

Liberado – Release – mail_package_platform_status.php – Notificador updates por mail

Libero un script: mail_package_platform_status.php , un notificador de actualizaciones de pfSense vía e-mail.

Ir a: https://www.javcasta.com/bounties/#notifier_package_plarform

Feliz solsticio de invierno 😉

 

 

(Visited 99 times, 1 visits today)

pfSense – release_old_dhcp_leases.php (Beta)

release_old_dhcp_leases.php: Un cli php script para borrar las entradas dhcpd leases con fecha de expiración menor a la fecha actual del sistema.

Se aloja en una carpeta, por ejemplo /scripts, y se ejecuta desde shell. El comando para añadirño a un cron seria

/usr/local/bin/php /scripts/release_old_dhcp_leases.php

Está en fase beta (es decir que lo he probado y me ha funcionado, pero conviene contrastarlo con más usuarios de pfSense, ver https://forum.pfsense.org/index.php?topic=122267.0)

El código:

<?php
/*
 * release_old_dhcp_leases.php
 * By @Javcasta - Javier Castañon - https://javcasta.com/ 
 */


$leasesfile = "/var/dhcpd/var/db/dhcpd.leases";
exec("cat /var/dhcpd/var/db/dhcpd.leases", $salida);

//echo "lineas: " . count($salida) . "\n";
$today = date('Y/m/d');

// Stop DHCPD
//killbyname("dhcpd");
echo "Stop dhcpd service... \n";
exec("/usr/local/sbin/pfSsh.php playback svc stop dhcpd");
sleep(5);

// Read existing leases
$newleases_contents = array();
$i = 0;
$marca = '}';

while ($i < count($salida)) {
	if (strpos($salida[$i],"lease ") !== false && strpos($salida[$i], " {") !== false ) {
		$posendsdate = $i+2;
		$endsdate = explode(" ", $salida[$posendsdate]);
		//echo ">>>>> " . $endsdate[4] . "\n";
		//si la fecha ends es < today NO
		if ($endsdate[4] > $today || $endsdate[4] == $today) {
			$newleases_contents[] = $salida[$i];
			/* Skip to the end of the lease declaration */
			do {
				//echo "vamos por $i: $salida[$i] \n";
				$i++;
				$newleases_contents[] = $salida[$i];			
			} while ($i < count($salida) && strpos($salida[$i], $marca) !== true);
		}
	} else {
		//$newleases_contents[] = $salida[$i];
	}
	$i++;
}
//print_r(array_values($newleases_contents));
$fd = fopen($leasesfile, 'w');
fwrite($fd, implode("\n", $newleases_contents));
fclose($fd);
echo "Start dhcpd service... \n";
exec("/usr/local/sbin/pfSsh.php playback svc start dhcpd"); 
?>

Y voila 🙂

(Visited 73 times, 1 visits today)

Monitorizar logs de pfSense con Nagios Log Server

Enlazando con http://www.javcasta.com/implementacion-de-maquina-virtual-de-nagios-log-server-e-instalacion-en-la-misma-de-nagios-core/

Con ese post veia cómo tener un Nagios Log Server y un Nagio Core en una misma máquina virtual. Ahora voy a monitorizar los logs del pfSense con el Nagios Log Server.

Tan simple cómo configurar en el pfSense, en el menú: Status > System Logs > Settings

En la sección: Remote Logging Options , habilitar:

Enable Remote Logging [x] Send log messages to remote syslog server

Indicando interfaz por donde enviar los logs, lo que queremos que envie al servidor de logs remoto y la IP:puerto del log server remoto

rsyslog

Y si todo ha sido correctamente configurado, en el dashboard del Nagios Log Server se deben de ver los logs del pfSense

rsyslog2

Y voila 🙂

(Visited 170 times, 2 visits today)

pfSense – Script: wol-dhcpleases.sh – Wake On Lan All dhcp leases

Enlazando con el post: http://www.javcasta.com/pfsense-wol-wake-on-lan/

captura-de-pantalla-de-2016-12-04-122221wol-dhcpleases.sh un shell script en pfSense para lanzar un wol a todas las entradas dhcp (dhcp leases) vía todas las direcciones de broadcast de sus interfaces .

#!/bin/sh
# wol-dhcpleases.sh
# wol all dhcp leases via all interfaces
# by javcasta - 2016 - https://javcasta.com

BROADCAST=$(ifconfig | grep broadcast | cut -d' ' -f 6)
DHCPLEASES=$(cat /var/dhcpd/var/db/dhcpd.leases | grep "hardware ethernet" | cut -d ' ' -f 5 | sort -u | sed "s|;||")
for LAMAC in $DHCPLEASES; do
   echo "wake on lan:  ${LAMAC}"
   for ELBROADCAST in $BROADCAST; do
	   /usr/local/bin/wol -i ${ELBROADCAST} ${LAMAC}
   done
done

Y voila 🙂

(Visited 31 times, 1 visits today)

pfSense Memory usage via shell – Obtener vía shell % memoria RAM usada en pfSense

captura-de-pantalla-de-2016-12-02-145217

Buceando en el código de /usr/local/www/includes/functions.inc he implementado una manera de obtener el % de ram usada en pfSense vía shell:

mem-used

[2.3.2-RELEASE][root@pfsense.localdomain]/scripts: echo `php -r “require(‘/etc/inc/functions.inc’);echo ‘% Memoria usada = ‘.round(get_single_sysctl(‘vm.stats.vm.v_page_count’)-get_single_sysctl(‘vm.stats.vm.v_inactive_count’)-get_single_sysctl(‘vm.stats.vm.v_cache_count’)-get_single_sysctl(‘vm.stats.vm.v_free_count’))*100/get_single_sysctl(‘vm.stats.vm.v_page_count’).’ ‘;”`
% Memoria usada = 8.2853002576452

El comando:

echo `php -r "require('/etc/inc/functions.inc');echo '% Memoria usada = '.round(get_single_sysctl('vm.stats.vm.v_page_count')-get_single_sysctl('vm.stats.vm.v_inactive_count')-get_single_sysctl('vm.stats.vm.v_cache_count')-get_single_sysctl('vm.stats.vm.v_free_count'))*100/get_single_sysctl('vm.stats.vm.v_page_count').' ';"`

O de forma más simplificada:

echo `php -r “require(‘/usr/local/www/includes/functions.inc.php’);echo mem_usage();”`

echo `php -r "require('/usr/local/www/includes/functions.inc.php');echo mem_usage();"`

Que coincide por lo indicado en el widget del dashboard

Y voila 🙂

(Visited 87 times, 1 visits today)

Implementación de máquina virtual de Nagios log Server e instalación en la misma de Nagios Core

1. Descargar OVA de Nagios Log Server:

https://assets.nagios.com/downloads/nagios-log-server/1/ovf/nagioslogserver-1.4.4-64.ova

1-download-vm-nagios-log-server

2. Abrir (importar) el OVA con VMware. (o VBox, etc)

2-open-vm-nagios-log-server

3. Iniciar la VM. Iniciar sesión en Nagios log server. root:nagiosls . Y configurar red.

3c-init-sesion

Si deseas cambiar la configuración de red, con lla utilidad system-config-network se hace de forma rápida y fácil.

 2a-system-config-network

Se puede acceder a la shell vía cliente ssh como root (root:nagiosls)

4 Instalamos Nagios Core desde la fuente.

Seguimos el doc de Nagios: Installing Nagios Core From Source.:

https://assets.nagios.com/downloads/nagioscore/docs/Installing_Nagios_Core_From_Source.pdf

 En lo que atañe a CentOS (la VM de Nagios log server viene en CentOS)

El guión de instalación:

# guión
# prerequisitos
yum install -y wget httpd php gcc glibc glibc-common gd gd-devel make net-snmp unzip
# download 
cd /tmp
wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.2.3.tar.gz
wget https://nagios-plugins.org/download/nagios-plugins-2.1.4.tar.gz
# usuarios
#useradd nagios
groupadd nagcmd
usermod -a -G nagcmd nagios
usermod -a -G nagios,nagcmd apache
# descomprimir
 tar zxvf nagios-4.2.3.tar.gz
tar zxvf nagios-plugins-2.1.4.tar.gz
# install
cd nagios-4.2.3
./configure --with-command-group=nagcmd 

make all
make install
make install-init
make install-config
make install-commandmode
make install-webconf
cp -R contrib/eventhandlers/ /usr/local/nagios/libexec/
chown -R nagios:nagios /usr/local/nagios/libexec/eventhandlers
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

# start
/etc/init.d/nagios start
/etc/init.d/httpd start

# add usr for web gui and password
htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

# install plugins
cd /tmp/nagios-plugins-2.1.2
./configure --with-nagios-user=nagios --with-nagios-group=nagios
make
make install

# nagios  services at boot
chkconfig --add nagios
chkconfig --level 35 nagios on
chkconfig --add httpd
chkconfig --level 35 httpd on

Abrimos un navegador con la ip de nagios http://<nagios-ip>, para terminar la instalación del Nagios Log Server (si tienes licencia es el momento de indicarla)

 2b-finish-nagios-log-server-install

Y ya se puede acceder a Nagios Core:

http://<your.nagios.server.ip>/nagios

2c-access-to-nagios

Ya tenemos Nagios Log Server y Nagios Core en la misma máquina virtual (eso sí, el Log server con licencia trial de 60 días 🙂 , pero para practicar, más que suficiente 🙂

Proximamente, cómo monitorizar un pfSense con Nagios Core/Log Server y definir nuestros comandos y scripts personalizados para monitorizar pfSense vía SNMP, etc …

Y  voila 🙂

(Visited 168 times, 1 visits today)

Update 04/12/16: Script: wol-dhcpleases.sh


pfSense – WOL – Wake On Lan

Hacer un WOL (Wake On Lan) es simplemente enviar a traves de una red local (LAN) un “magic packet” a una dirección mac (de capa 2) de una NIC de un equipo para que se inicie (“se encienda” o power on).

Esta utilidad está restringida al dominio de broadcast (no trasciende dispositivos de capa 3: routers/firewall), es decir, a las redes localmente conectadas al pfSense.

La condición necesaria es que el equipo a encenderse, tenga configurada en su BIOS, la opción WOL habilitada (enable).

 

20161124_102318

Desde la GUI del pfSense, en Services > Wake-on-LAN: Elegimos la interfaz por donde enviar el “magic packet” e indicamos la mac de la tarjeta de red del equipo a encender

 

pfsense-wake-on-lan

Clikamos en enviar (send) y si está todo correcto, el equipo deberá iniciar su encendido (power on).

Lo acabo de testear con un pfSense 2.3.2_1 y un portatil Toshiba, y todo OK.

¿Su utilidad?. Imagina que das soporte a una red remota, y puedes acceder a la administración del pfsense vía VPN, pero el equipo remoto al que quieres dar soporte esta apagado y no hay nadie que pueda encenderlo … pues si lo tienes ese equipo con la opción en BIOS de WOL habilitada (y conoces su mac) … pues coser y cantar 🙂


Para los que usen scripting:

La utilidad que envía el magic packet, en pfSense es: /usr/local/bin/wol

# /usr/local/bin/wol --help
Usage: /usr/local/bin/wol [OPTION] ... MAC-ADDRESS ...
Wake On LAN client - wakes up magic packet compliant machines.

    --help          display this help and exit
-V, --version       output version information and exit
-v, --verbose       verbose output
-w, --wait=NUM      wait NUM millisecs after sending
-h, --host=HOST     broadcast to this IP address or hostname
-i, --ipaddr=HOST   same as --host
-p, --port=NUM      broadcast to this UDP port
-f, --file=FILE     read addresses from file FILE ("-" reads from stdin)
    --passwd[=PASS] send SecureON password PASS (if no PASS is given, you
                    will be prompted for the password)

Each MAC-ADDRESS is written as x:x:x:x:x:x, where x is a hexadecimal number
between 0 and ff which represents one byte of the address, which is in
network byte order (big endian).

PASS is written as x-x-x-x-x-x, where x is a hexadecimal number between 0
and ff which represents one byte of the password.

Report bugs to <krennwallner@aon.at>

Por ejemplo para envíar un wol a la mac 00:50:56:00:01:02 en la red local (LAN), siendo la IP de la interfaz LAN del pfSense 192.168.0.254/24, ergo la IP de broadcast 192.168.0.255


 /usr/local/bin/wol -i 192.168.0.255 00:50:56:00:01:02
Waking up 00:50:56:00:01:02...

Y voila 🙂

(Visited 23 times, 1 visits today)