Nagios + openldap auth + apache 2.4

Esta vez, vamos a integrar la authenticación de usuarios de nuestro nagios con nuestro openLDAP.

Primero de todo, habilitamos los módulos ldap / authnz_ldap

a2enmod authnz_ldap
a2enmod ldap

Modificamos el fichero de sites del nagios:

#nano /etc/apache2/sites-available/nagios.conf

Y lo dejamos tal que:

# SAMPLE CONFIG SNIPPETS FOR APACHE WEB SERVER
#
# This file contains examples of entries that need
# to be incorporated into your Apache web server
# configuration file. Customize the paths, etc. as
# needed to fit your system.

ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"


# SSLRequireSSL
Options ExecCGI
AllowOverride None
"<"IfVersion >= 2.3>

AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL "ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)"
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user


"<"IfVersion < 2.3>
Order allow,deny
Allow from all
AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user


Alias /nagios "/usr/local/nagios/share"


# SSLRequireSSL
Options None
AllowOverride None
"<"IfVersion >= 2.3>

AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user



"<"IfVersion < 2.3>
Order allow,deny
Allow from all
AuthType Basic
Require all granted
AuthName "Nagios Access"
AuthLDAPURL ldap://ldap.miserver.local/dc=miserver,dc=local?uid?sub?(objectClass=*)
AuthBasicprovider ldap
AuthUserFile /dev/null
Require valid-user



Ahora modificamos el nagios para que acepte los usuarios:

/
#nano /usr/local/nagios/etc/cgi.cfg

Y dejamos las siguientes líneas así:


authorized_for_system_information=*
authorized_for_configuration_information=*
authorized_for_system_commands=*
authorized_for_all_services=*
authorized_for_all_hosts=*
authorized_for_all_service_commands=*
authorized_for_all_host_commands=*

Reiniciamos apache + nagios y a probar !!!!!!!!

Error “Disallowed key characters in global data.” pnp4nagios

Esta vez, instalando el pnp4nagios en un debian 8, me encontré este error a la hora de visualizar las graficas del nagios:

“Disallowed key characters in global data.”

tras googlear un rato y mirar las coockies / buscar la función, encontré el error en el fichero:

/usr/local/pnp4nagios/lib/kohana/system/libraries/Input.php


public function clean_input_keys($str)
{
$chars = PCRE_UNICODE_PROPERTIES ? '\pL' : 'a-zA-Z';
if ( ! preg_match('#^['.$chars.'0-9:_.\-/@]++$#uD', $str))
{
exit('Disallowed key characters in global data.');
}

return $str;
}

Hemos de dejar la línea donde se mirar los carácteres especiales, tal cual.

Automatizar añadir varias máquinas debian al ldap

Esta vez, tenía que automatizar la entrada anterior y añadir varias máquinas al ldap para login.

Como no me hacía especial ilusión modificar todos los ficheros a mano, tenemos al amigo bash + sed.

al lío:


#!/bin/bash

# ########################
# ### by craem ###########
# ########################
# ########################

function instala_paquetes(){
echo "------------------------------------------------------------"
echo "aptitude -y install libnss-ldap libpam-ldap ldap-utils sudo "
aptitude -y install libnss-ldap libpam-ldap ldap-utils sudo
}

function modifica_ficheros(){
echo "--- modificamos fichero nsswitch.conf -----------------------"
sed -ie 's/compat/ldap compat/g' /etc/nsswitch.conf
echo "--- modificamos el fichero common-session -------------------"
echo "session required pam_mkhomedir.so skel=/etc/skel umask=0022" >> /etc/pam.d/common-session
echo "--- reiniciamos el servicio nscd ----------------------------"
/etc/init.d/nscd restart
echo "--- modificamos el sudoers ----------------------------------"
echo "%admin_users ALL=(ALL) ALL" >> /etc/sudoers
echo "--- modificamos el fichero common-auth ----------------------"
echo "auth required pam_access.so" >> /etc/pam.d/common-auth
echo "--- modificamos el access.conf ------------------------------"
echo "-:ALL EXCEPT root (admin_users):ALL EXCEPT LOCAL" >> /etc/security/access.conf
echo "--- modificamos el fichero ldap.conf ------------------------"
sed -ie 's/#BASE dc=example,dc=com/BASE dc=craem,dc=net/g' /etc/ldap/ldap.conf
echo "--- modificamos el ldap.conf --------------------------------"
echo "URI ldap://ldap.craem.net" >> /etc/ldap/ldap.conf
echo "--- fin del script ------------------------------------------"

}
instala_paquetes
modifica_ficheros

Kamailio 4.x Debian Jessie

Estos días estoy liado con el tema del sipproxy Kamailio….. un gran software y potente donde los haya.

Empezamos con que disponemos de un debian jessie limpito; instalamos las dependencias:


apt-get install git-core gcc flex bison libmysqlclient-dev make libssl-dev libcurl4-openssl-dev libxml2-dev libpcre3-dev mysql-server

Y ahora descargamos el source de kamailio:


root@sipproxy:/usr/src# wget -c http://www.kamailio.org/pub/kamailio/4.2.2/src/kamailio-4.4.4_src.tar.gz
root@sipproxy:/usr/src# tar -zxvf kamailio-4.4.4_src.tar.gz

Preparamos para compilar:

#make cfg

Editamos el fichero /usr/src/kamailio-4.4.4/modules.lst y modificamos:

.
.
# the list of extra modules to compile
include_modules=db_mysql
.
.

Guardamos y vamos a compilar:

#make install

Una vez compilado, tendremos los ficheros en /usr/local/etc/kamailio.

Creamos un usuario para el mysql / kamailio:

mysql> grant all privileges on kamailio.* to 'kamailio'@'%' identified by 'kamailio' with grant option;

Modificamos el kamctrlc para que use mysql (en mi caso) y lo dejamos tal que:


DBENGINE=MYSQL

## database host
DBHOST=localhost

## database name (for ORACLE this is TNS name)
DBNAME=kamailio

# database path used by dbtext, db_berkeley or sqlite
# DB_PATH="/usr/local/etc/kamailio/dbtext"

## database read/write user
DBRWUSER="kamailio"

## password for database read/write user
DBRWPW="kamailio"

## database read only user
DBROUSER="kamailio"

## password for database read only user
DBROPW="kamailio"

ahora creamos las bbdd:

root@monaca:/usr/local/etc/kamailio# /usr/local/sbin/kamdbctl create
MySQL password for root:
INFO: test server charset
INFO: creating database kamailio ...
INFO: granting privileges to database kamailio ...
INFO: creating standard tables into kamailio ...
INFO: Core Kamailio tables succesfully created.
Install presence related tables? (y/n): y
INFO: creating presence tables into kamailio ...
INFO: Presence tables succesfully created.
Install tables for imc cpl siptrace domainpolicy carrierroute
userblacklist htable purple uac pipelimit mtree sca mohqueue
rtpproxy? (y/n): y
INFO: creating extra tables into kamailio ...
INFO: Extra tables succesfully created.
Install tables for uid_auth_db uid_avp_db uid_domain uid_gflags
uid_uri_db? (y/n): y
INFO: creating uid tables into kamailio ...
INFO: UID tables succesfully created.
root@monaca:/usr/local/etc/kamailio#

preparamos el kamailio para que arranque y crearemos el init.d

root@monaca:/usr/src/kamailio-4.4.4/pkg/kamailio/deb/precise# cp kamailio.init /etc/init.d/kamailio


root@monaca:/usr/src/kamailio-4.4.4/pkg/kamailio/deb/precise# cp kamailio.default /etc/default/kamailio

Editamos el fichero /etc/default/kamailio

#
# Kamailio startup options
#

# Set to yes to enable kamailio, once configured properly.
RUN_KAMAILIO=yes

# User to run as
USER=kamailio

# Group to run as
GROUP=kamailio

# Amount of shared and private memory to allocate
# for the running Kamailio server (in Mb)
#SHM_MEMORY=64
#PKG_MEMORY=8

# Config file
CFGFILE=/usr/local/etc/kamailio/kamailio.cfg

# Enable the server to leave a core file when it crashes.
# Set this to 'yes' to enable Kamailio to leave a core file when it crashes
# or 'no' to disable this feature. This option is case sensitive and only
# accepts 'yes' and 'no' and only in lowercase letters.
# On some systems it is necessary to specify a directory for the core files
# to get a dump. Look into the kamailio init file for an example configuration.
#DUMP_CORE=yes

Creamos el fichero pid, usuarios:

adduser --quiet --system --group --disabled-password --shell /bin/false --gecos "kamailio" --home /var/run/kamailio kamailio

Copiamos el init.d

cp /usr/src/kamailio-4.4.4/pkg/kamailio/deb/precise/kamailio.init /etc/init.d/kamailio
mkdir -p /var/run/kamailio
chmod 755 /etc/init.d/kamailio
chown kamailio:kamailio /var/run/kamailio

y ahora para que arranque con el systcl, añadimos el siguiente fichero /etc/systemd/system/kamailio.service


[Unit]
Description=Kamailio SIP Server

[Service]
Type=forking
PIDFile=/var/run/kamailio.pid
ExecStart=/usr/local/sbin/kamctl start
ExecRestart=/usr/local/sbin/kamctl restart
ExecStop=/usr/local/sbin/kamctl stop

[Install]
WantedBy=multi-user.target

Enjoy your kamailio server 😉

Servidor syslog centralizado debian jessie

Desde hace tiempo, me gusta centralizar los logs en una sola máquina…. por ejemplo, donde tengo el nagios.

la máquina base es una debian jessie pelada y instalamos el syslog-ng:

apt-get install syslog-ng

Y ahora modificamos el fichero /etc/syslog-ng/syslog-ng.conf

options { chain_hostnames(yes); flush_lines(0); use_dns(no); use_fqdn(no);
owner("root"); group("adm"); perm(0640); stats_freq(0);
create_dirs(yes); bad_hostname("^gconfd$");
};

########################
# Sources
########################
# This is the default behavior of sysklogd package
# Logs may come from unix stream, but not from another machine.
#
source s_src {
system();
internal();
};

# If you wish to get logs from remote machine you should uncomment
# this and comment the above source line.
#
#source s_net { tcp(ip(127.0.0.1) port(1000)); };

source syslog_udp {
udp(port(514));
};

.
.
.
.
.
# Debian only
destination d_ppp { file("/var/log/ppp.log"); };

# Destí logs Mikrotiks
destination clientslogs {
file("/var/log/logscraem/$YEAR$MONTH$DAY/$HOST.auth");
};

.
.
.
.
log {
source(syslog_udp);
destination(clientslogs);
};

Nos crearemos un directorio por día y un fichero por dispositivo.

Reiniciamos el syslog-ng y listo.

Upgrade zarafa 7.2.x a 7.2.4.29

Otra entrada que es un apunte.

Hace dos años aprox, actualicé mi server de correo zarafa a a 7.2 Beta, por unos problemas con la 7.2.1 y allí se quedó.

Hace unos meses, decidí volver a actualizar el server… prefiero actualizar el zarafa, ya que instalar de nuevo y migrar el sql / certificado, es muy pesado.

Primero de todo, descargamos la última versión disponible:

cd /usr/src

wget -c https://download.zarafa.com/community/final/7.2/7.2.4.29/zcp-7.2.4.29-debian-7.0-x86_64-opensource.tar.gz

Y extraemos los archivos:

# tar -zxvf zcp-7.2.4.29-debian-7.0-x86_64-opensource.tar.gz
# cd zcp-7.2.4.29-debian-7.0-x86_64-opensource

Ahora empieza el follón……

Primero de todo, nos hacemos una copia de todos los ficheros situados en:

/etc/zarafa
/usr/share/zarafa-webaccess/

Y ahora vamos a actualizar de la siguiente manera:

dpkg --auto-deconfigure -i *.deb

Dará bastantes errores, pero seguimos adelante cuando acabe el dpkg y corregimos los errores de dependencias:

#apt-get -f install
#dpkg --auto-deconfigure -i *.deb

Ahora reestablecemos los ficheros de la copia de seguridad en /usr/share/zarafa-webaccess y modificamos el seguiente fichero:

root@zeus:/etc/zarafa# nano dagent.cfg

Y cambiamos las siguientes líneas:

server_socket = file:///var/run/zarafa

Y ahora en server.cfg

root@zeus:/etc/zarafa# nano server.cfg

Y cambiamos la línea:

local_admin_users = root vmail zarafa

Reiniciamos los servicios de zarafa/apache y listo.

Protegiendo nuestro gateway sip, parte 2

Como ya he comentado en otras ocasiones, la mayoría de ataques a pbx SIP abiertas a internet, están realizados por software tipo sipVicious y similares.

Si tenemos la posibilidad de usar un firewall con inspección a layer 7, podemos filtrar los User-Agent, tal y como expliqué en la entrada anterior.

Ahora, supongamos que tenemos un mikrotik, con RouterOS 6.x…


/ip firewall layer7-protocol
add name=sip regexp="^.+(sundayddr).*\$"
add name=sip1 regexp="^.+(sipsak).*\$"
add name=sip2 regexp="^.+(sipvicious).*\$"
add name=sip3 regexp="^.+(friendly-scanner).*\$"
add name=sip4 regexp="^.+(iWar).*\$"
add name=sip5 regexp="^.+(sip-scan).*\$"
add name=sip6 regexp="^.+(Ozeki).*\$"
add name=sip8 regexp="^.+(sip-cli).*\$"
add name=sip7 regexp="^.+(VaxSIPUserAgent).*\$"
add name=sip9 regexp="^.+(sipcli).*\$"

/ip firewall filter
add action=fasttrack-connection chain=forward connection-state=established,related
add chain=forward connection-state=established,related
add action=drop chain=forward connection-state=invalid
add action=drop chain=forward comment=voip_sundayddr_deny dst-address-list=AUTH layer7-protocol=sip
add action=drop chain=forward comment=voip_sipsak_deny dst-address-list=AUTH layer7-protocol=sip1
add action=drop chain=forward comment=voip_sipvicious_deny dst-address-list=AUTH layer7-protocol=sip2
add action=drop chain=forward comment=voip_friendly-scanner_deny dst-address-list=AUTH layer7-protocol=sip3
add action=drop chain=forward comment=voip_iWar_deny dst-address-list=AUTH layer7-protocol=sip4
add action=drop chain=forward comment=voip_sip-scan_deny dst-address-list=AUTH layer7-protocol=sip5
add action=drop chain=forward comment=voip_Ozeki_deny dst-address-list=AUTH layer7-protocol=sip6
add action=drop chain=forward comment=voip_VaxSIPUserAgent_deny dst-address-list=AUTH layer7-protocol=sip7
add action=drop chain=forward comment=voip_sip-cli_deny dst-address-list=AUTH layer7-protocol=sip8
add action=drop chain=forward comment=voip_sipcli_deny dst-address-list=AUTH layer7-protocol=sip9

hay que tener activado el connection Tracking activado.

enjoy 😉

Añadir schema zarafa a openLdap

Otra entrada que es un apunte.

Recientemente he tenido que volver a instalar otro zarafa y necesitaba añadir el esquema en el openLdap.

Tras intentar importar el schema con zcat:

zcat /usr/share/doc/zarafa/zarafa.ldif.gz | ldapadd -H ldapi:/// -Y EXTERNAL

Y ver los múltiples errores con las comillas, atributos y demás gaitas, googleando he visto este post:


http://www.linuxquestions.org/questions/linux-server-73/how-to-add-a-new-schema-to-openldap-2-4-11-a-700452/

Resumiendo……. para poder importar el schema de manera correcta, los pasos:

1º) Generamos el fichero schema_convert.conf con el siguiente contenido:

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/collective.schema
include /etc/ldap/schema/corba.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/duaconf.schema
include /etc/ldap/schema/dyngroup.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/java.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/openldap.schema
include /etc/ldap/schema/pmi.schema
include /etc/ldap/schema/ppolicy.schema
include /etc/ldap/schema/zarafa.schema

2º) Creamos el directorio temporal

# mkdir /tmp/ldif_output

3º) Generamos los ldif

# slaptest -f schema_convert.conf -F /tmp/ldif_output

4º) Nos vamos al directorio donde hemos generado los ficheros

cd tmp/ldif_output/cn=config/cn=schema

Y creamos el fichero fixit.sed con el siguiente contenido:

s~dn: cn=\{([0-9]+)\}(.*)$~dn: cn=\2,cn=schema,cn=config~g
s~cn: \{([0-9]+)\}(.*)$~cn: \2~g
s~^(structuralObjectClass|entryUUID|creatorsName|createTimestamp|entryCSN|modifiersName|modifyTimestamp):.*$~~g

5º) Una vez creado el fichero, creamos el directorio fixed y ejecutamos el siguiente script:

for f in *ldif; do sed -rf fixit.sed "$f" > fixed/$f; done

Llegados aquí, en el directorio fixed, tendremos los directorios:

root@radius:/tmp/ldif_output/cn=config/cn=schema/fixed# ls -l
total 96
-rw-r--r-- 1 root root 15267 Aug 24 10:39 cn={0}core.ldif
-rw-r--r-- 1 root root 1091 Aug 24 10:39 cn={10}openldap.ldif
-rw-r--r-- 1 root root 6212 Aug 24 10:39 cn={11}pmi.ldif
-rw-r--r-- 1 root root 3073 Aug 24 10:39 cn={12}ppolicy.ldif
-rw-r--r-- 1 root root 11121 Aug 24 10:39 cn={13}zarafa.ldif
-rw-r--r-- 1 root root 1289 Aug 24 10:39 cn={1}collective.ldif
-rw-r--r-- 1 root root 1051 Aug 24 10:39 cn={2}corba.ldif
-rw-r--r-- 1 root root 11129 Aug 24 10:39 cn={3}cosine.ldif
-rw-r--r-- 1 root root 4253 Aug 24 10:39 cn={4}duaconf.ldif
-rw-r--r-- 1 root root 1461 Aug 24 10:39 cn={5}dyngroup.ldif
-rw-r--r-- 1 root root 2623 Aug 24 10:39 cn={6}inetorgperson.ldif
-rw-r--r-- 1 root root 2357 Aug 24 10:39 cn={7}java.ldif
-rw-r--r-- 1 root root 1280 Aug 24 10:39 cn={8}misc.ldif
-rw-r--r-- 1 root root 6259 Aug 24 10:39 cn={9}nis.ldif

6º) Importamos el ldif de zarafa:

# ldapadd -Y EXTERNAL -H ldapi:/// -f cn\=\{13\}zarafa.ldif

Esto se puede aplicar, como me ha pasado a mi, con el schema de freeradius o otros schemas.

enjoy 🙂

Freeradius stop on logger rotate

Otra entrada que es un apunte.

Cuando instalas el freeradius y lo dejas tal cual configurado, cuando hace el log rotate, se queda parado….. aquí explican el bug:

Freeradius stop

Para impedir que se quede parado, tras hacer el logrotate, hemos de modificar el siguiente fichero:


# nano /etc/logrotate.d/freeradius

Y ha de quedar tal que:

/var/log/freeradius/*.log {
weekly
rotate 52
compress
delaycompress
notifempty
missingok
postrotate
/etc/init.d/freeradius restart > /dev/null
endscript
}

Hemos de cambiar la línea

/etc/init.d/freeradius reload > /dev/null

a

/etc/init.d/freeradius restart > /dev/null

enjoy 😉

VoIP movistar fibra y asterisk

Esta vez, configuraremos la voip de movistar en nuestro asterisk.

Movistar, con la fibra, nos ofrece un servicio VoIP vía la ONT….. si nos conformamos con usarlo tal cual, pues perfecto, pero si tenemos en la oficina o en casa un asterisk, la mejor manera de aprovecharlo, es configurar la voIP en nuestra PBX sin necesidad de usar conversores.

Partimos que tenemos la vlan 3 configurada en nuestro router y obtenemos la IP por DHCP (una 10.x.x.x)

usuario : NúmeroDeTeléfono
password: NúmeroDeTeléfono
proxy : 10.31.255.134
puerto : 5070

los datos del proxy, si googleamos un poco se pueden obtener, pero la configuración no…..

Primero de todo, necesitamos la cadena del register para el sip.conf


register => 9xxxxxxxx@telefonica.net:9xxxxxxxx@10.31.255.134:5070/9xxxxxxxx

Y ahora la definición del peer:

[VOMISTAR]
type =peer
fromuser=9XXXXXXXX
secret =9XXXXXXXX
fromdomain=telefonica.net
host =telefonica.net
callerid = "" <9XXXXXXXX>
outboundproxy=10.31.255.134:5070
port =5070
nat =force_rport,comedia
insecure=port,invite
dtmfmode=auto
disallow=all
allow =ulaw
allow =alaw
context =llamadas_entrantes

Una vez hecho ésto y con el correspondiente reload……. al hacer un sip show registry:


processpbx*CLI> sip show registry
Host dnsmgr Username Refresh State Reg.Time
10.31.255.134:5070 N 9xxxxxxxx@te 55 Registered Wed, 24 Jun 2015 23:09:28
1 SIP registrations.

A partir de aquí, ya es cosa nuestra con el diaplan !!!! enjoy your fiber 🙂