Limpiando nuestro sistema - dpkg --purge

Eliminando e instalando paquetes en el sistema comenzamos a generar una serie de componentes (mucha de esas simples configuraciones) en nuestro sistema que nunca jamas volvemos a utilizar, para saber que esta instalado y no usamos podemos realizar el siguiente comando:

debian:~# dpkg -l | grep -v ^ii | awk '{print $2}' | sed '1,5d'

y si el resultado lo queremos eliminar bastaria enviando la salida a un dpkg --purge

debian:~# dpkg -l | grep -v ^ii | awk '{print $2}' | sed '1,5d'|xargs dpkg --purge

Espero sea de utilidad.

El uso de demoras en Exim4 para combatir SPAM

Recientemente hice una modificación pequeña a la configuración de Exim4 para eliminar ataques de diccionario. La modificación fue tan exitosa que la publiqué en el Blog,

http://www.debianchile.org/?q=node/135

La configuración descrita impone una demora de dos minutos si el IP intenta repartir más de un correo a un receptor inexistente, dentro de ese lapso. En un periodo menor a una semana habían cesado todos los ataques de diccionario.

Quedé sorprendido que una simple demora de dos minutos hiciera desistir a spameros de atacar mi sitio. Esta demora debe ser costosa. ¿Por que? Este es mi razonamiento: Los spameros basan su éxito en la teoría de probabilidades. Si bien la probabilidad de éxito (lograr que un SPAM pase todos los escrutinios de Exim y Spamassassin) es bastante baja, la cantidad de pruebas, número bien grande, hace que al fin se cuelen uno que otro SPAM. En eso consiste el éxito de un spamero. El número importante es entonces el máximo de conexiones posible que el servidor del spamero puede establecer. Ese número es grande, pero no infinito. Si Exim mantiene por dos minutos la conexión abierta, a la espera, para después responder que deniega la conexión, el costo de la demora se torna inaceptable para el spamero si dentro de esos dos minutos puede en vez hacer miles de otros intentos. Ese es el motivo por el cual una pequeña demora se torna tan costosa.

He encontrado varios puntos en la configuración de Exim en donde insertar una leve demora hace desistir otros ataques recurrentes, o al menos disminuirlos.

Edita el archivo /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt y modifica según descrito.

  1. DNSBL

    # DNS blacklist
    drop
       log_message = listed by $dnslist_domain
       dnslists = bl.spamcop.net : b.barracudacentral.org : zen.spamhaus.org : dnsbl.sorbs.net
       delay = 2m

    Esta modificación impone una demora de dos minutos si el sitio ya está marcado por una lista negra DNS y puede aplicarse en cualquier punto a partir de aceptar una conexión autenticada,

    accept
       authenticated = *
       control = submission/sender_retain

    Aplicarla antes de la autenticación puede bloquear a usuarios locales que envían correo desde redes dinámicas (que generalmente están todas en listas negras DNS).

  2. Intentos de relay.

    Modifica,

    require
       message = relay not permitted
       domains = +local_domains : +relay_to_domains

    por,

    drop
       message = relay not permitted
       !domains = +local_domains : +relay_to_domains
       delay = 2m

    Es en el fondo la misma regla, excepto a que bota inmediatamente el mensaje, imponiéndole la demora a quien intente usarnos ilegalmente como relay.

  3. Verificación de dirección.

    # .ifdef CHECK_RCPT_VERIFY_SENDER
       deny
         message = Sender verification failed
         !acl = acl_local_deny_exceptions
         !verify = sender
         delay = 2m
    # .endif

    Eficiente para aquellos intentos que usan emisor con dominio falso, inexistente o inventado.

  4. Receptor verificable.

    Modifica,

    require
       verify = recipient

    por,

    drop
       !verify = recipient
       delay = 2m

    Es en el fondo la misma regla, excepto a que bota inmediatamente el mensaje si el receptor no existe, imponiéndole además la demora.

Todas estas modificaciones hay que usarlas con cuidado, porque Exim tiene un máximo de 25 conexiones simultaneas. Si el sitio es atacado a una tasa alta, las demoras pueden fácilmente agotar las conexiones y botar no solo SPAM, sino también correo legítimo. Una buena práctica es ir insertando las modificaciones una a la vez e ir monitoriando el efecto, porque la tasa de ataques irá disminuyendo con cada una de ellas, pero a medida que transcurra el tiempo.

Hecha cualquier modificación, actualiza la configuración y reinicia el servidor,

# update-exim4.conf
# /etc/init.d/exim4 restart

Nuevo depósito Debian Unofficial

Un nuevo depósito ha surgido a partir del otrora Debian Unofficial. Este nuevo depósito, llamado "Unofficial Maintainers", distribuye como antes paquetes no oficiales que, por motivo de licencia o restricciones varias, no se encuentran en el depósito oficial de Debian. Incluye software como,

lame
libdvdcss
xvidcore
mplayer-codecs
ttf-microsoft
flash-player
opera
skype

entre otros. Muchos de estos son también parte de Debian Multimedia, aunque no todos.

La manera de usarlo es como de costumbre. Inserta en /etc/apt/sources.list,

deb http://unofficial.debian-maintainers.org/ lenny main contrib non-free restricted

También se puede usar la versión sid o unstable. Está anunciada una estructura para Squeeze (testing), pero ésta vendrá más adelante.

Cual es mi IP?

Escenario: tengo un servidor remoto con conexion PPP? cambio la IP? = perdi conectividad para controlar el servidor, que hacemos?

Creemos un script que nos diga cual es la nueva ip :)

#!/bin/bash

set -e -u

MAILTO='sysadmin@dominio.cl'
IPADDR=`ifconfig | egrep -A 1 '^ppp[0-9]' | grep 'inet addr:' | awk '{print $2}' | sed -e 's/.*://'`

echo "[${IPADDR}]" > /etc/mailname
postfix reload

mail -s "`date`: Servidor PEPITO cambio de direccion IP!" ${MAILTO} < El servidor PEPITO (VPN) tiene la direccion IP: ${IPADDR}

EOF

Firewall iptables avanzado v1

Scrip que a traves de MASQUERADE envia trafico de una Pequeña LAN a la LAN principal, esto se podria realizar con VPN (ipsec, openvpn, openswan, etc).

#!/bin/bash

modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

iptables -F
iptables -F -t nat
iptables -F -t mangle

iptables -X
iptables -X -t nat
iptables -X -t mangle

case "$1" in
start|"")
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -d 192.168.1.255 -j DROP #Eliminamos broadcast de la LAN
iptables -A INPUT -d 255.255.255.255 -j DROP
iptables -A INPUT -p tcp --dport 135 -j DROP #Eliminamos a M$ :)
iptables -A INPUT -p udp --dport 137 -j DROP
iptables -A INPUT -p udp --dport 138 -j DROP
iptables -A INPUT -p tcp --dport 139 -j DROP
iptables -A INPUT -p tcp --dport 445 -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -m state --state NEW -j ACCEPT
iptables -A INPUT -i icmp -j ACCEPT
iptables -A INPUT -j LOG --log-prefix 'REJECT INPUT: '
iptables -A INPUT -j REJECT

iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state NEW -j ACCEPT
iptables -A OUTPUT -j LOG --log-prefix 'REJECT OUTPUT: '
iptables -A OUTPUT -j REJECT

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state NEW -j ACCEPT
iptables -A FORWARD -j LOG --log-prefix 'REJECT FORWARD: '
iptables -A FORWARD -j REJECT

iptables -t nat -A POSTROUTING -o ppp+ -s 192.168.1.1 \
-d ! 172.16.32.0/24 -j MASQUERADE #Enviamos a nuestra LAN Principal
;;
stop)
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
;;
esac

100FullDuplex?

1.- De forma Dinamica:

# mii-tool eth0 -F 100baseTx-FD

2.- De forma estatica:

Editar archivo /etc/network/interfaces

up /sbin/mii-tool eth1 -F 100baseTx-FD

Ejemplo:

auto eth0
iface eth0 inet static
address 10.0.0.2
netmask 255.0.0.0
gateway 10.0.0.1
dns-nameservers 10.30.20.1
dns-search dominio.cl
up /sbin/mii-tool eth0 -F 100baseTx-FD

Saludos espero les sirva.

Autenticacion Centralizada LDAP+SSH

Unas de las tareas de un sysadmin es controlar el acceso a los equipos de nuestra red, cuando la suma de estos es grande se deben crear politicas, y una de esas politicas debe ser la centralizacion de usuarios, a continuacion les mostrare como se puede realizar esto con un ejemplo del servidor y los clientes.

apt-get install slapd libnss-ldap libpam-ldap

Una vez instalado los paquetes necesarios editamos slapd.conf dentro de /etc/ldap

# Schema y ObjectClass
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema

# Definicion Basica
pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
loglevel 0
modulepath /usr/lib/ldap
moduleload back_bdb
sizelimit 500
tool-threads 1
backend bdb
checkpoint 512 30
database bdb

# Definicion del Directorio
suffix “dc=dominio,dc=cl”

# DB
directory “/var/lib/ldap”

# Definicion de dbconfig
dbconfig set_cachesize 0 2097152 0
dbconfig set_lk_max_objects 1500
dbconfig set_lk_max_locks 1500
dbconfig set_lk_max_lockers 1500
index objectClass eq
lastmod on

# Definicion de acceso a la DB
access to attrs=userPassword,shadowLastChange
by dn=”cn=admin,dc=dominio,dc=cl” write
by anonymous auth
by self write
by * none

access to dn.base=”" by * read

access to *
by dn=”cn=admin,dc=dominio,dc=cl” write
by * read

Una vez realizada la configuracion de slapd.conf, se debe editar /etc/nsswitch.conf

passwd: compat ldap
group: compat ldap
shadow: compat ldap

Debemos editar ademas el archivo pam_ldap.conf dentro de /etc

host 127.0.0.1
base dc=dominio,dc=cl
ldap_version 3
rootbinddn cn=admin,dc=dominio,dc=cl
pam_check_host_attr yes

Ahora reiniciamos el servidor slapd

invoke-rc.d slapd restart

Ahora editamos el archivo ldap.conf de los clientes este puede estar en /etc/ldap.conf

# Por defecto
host 200.0.0.1 # server ldap
base dc=dominio,dc=cl
ldap_version 3
rootbinddn cn=admin,dc=dominio,dc=cl
timelimit 120
bind_timelimit 120
idle_timelimit 3600

# Control de acceso por host
pam_check_host_attr yes
pam_filter &(objectClass=posixAccount)(host=mail)

A continuacion editamos /etc/nsswitch.conf

passwd: files ldap
shadow: files ldap
group: files ldap

Ahora editamos el archivo para la conexion del cliente /etc/openldap/ldap.conf

BASE dc=dominio,dc=cl
URI ldap://200.0.0.1/ # server ldap

Esta configuracion es para cualquier cliente este archivo puede ser un archivo unico o separados.

# Esta definicion permite al root entrar sin pasar por servidor LDAP, en el caso si el servidor de autenticacion esta down.

auth [success=1 default=ignore] pam_unix.so
auth required pam_ldap.so use_first_pass
auth required pam_permit.so

account [success=1 default=ignore] pam_unix.so
account [success=ok new_authtok_reqd=ok ignore=ignore default=bad perm_denied=bad] pam_ldap.so
account required pam_permit.so

password sufficient pam_ldap.so
password required pam_unix.so nullok obscure min=4 max=8 md5

session required pam_unix.so
session optional pam_ldap.so
session required pam_mkhomedir.so umask=0066 skel=/etc/skel

Ahora solo nos falta cargar los ldif para armar nuestro directorio LDAP. 2 Ejemplo de host y usuarios.

ldapadd -x -D “cn=admin,dc=dominio,dc=cl” -W -f hosts.ldif

dn: cn=mail,ou=hosts,ou=ssh,ou=service,dc=dominio,dc=cl
objectClass: ipHost
objectClass: device
objectClass: extensibleObject
ipHostNumber: 200.0.0.3
cn: mail.dominio.cl
cn: mail

dn: cn=dns,ou=hosts,ou=ssh,ou=service,dc=dominio,dc=cl
objectClass: ipHost
objectClass: device
objectClass: extensibleObject
ipHostNumber: 200.0.0.4
cn: dns.dominio.cl
cn: dns

dn: cn=web,ou=hosts,ou=ssh,ou=service,dc=dominio,dc=cl
objectClass: ipHost
objectClass: device
objectClass: extensibleObject
ipHostNumber: 200.0.0.5
cn: web.dominio.cl
cn: web

ldapadd -x -D “cn=admin,dc=dominio,dc=cl” -W -f usuario.ldif

dn: uid=operador,ou=users,ou=ssh,ou=service,dc=dominio,dc=cl
uid: test
cn: Test
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
uidNumber: 786
gidNumber: 100
homeDirectory: /home/test
userPassword: {crypt}GoYLwzMD6cuZE
host: mail,dns

Se crean 3 hosts en el directorio LDAP y un usuario con solo acceso a mail y dns, si se requiere que el usuario test entre ademas a web, bastaria con modificar la linea host: mail,dns,web

Configuracion DHCPD

Bueno a continuación un muestra de un servidor DHCPD para un segmento.

apt-get install dhcpd

una vez instalado el paquete editamos el dhcpd.conf en /etc

option domain-name “dominio.cl”;
option domain-name-servers dhcp.dominio.cl;
option subnet-mask 255.255.255.224;
default-lease-time 600;
max-lease-time 7200;

subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.100 192.168.0.254;
option domain-name-servers ip-dns;
option domain-name “dominio.cl”;
option routers 192.168.0.2;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.0.255;
default-lease-time 600;
max-lease-time 7200;
}

Reiniciamos el servicio

invoke-rc.d dhcpd restart

Y listo tenemos un servidor dhcpd en nuestra LAN.

* Podemos decidir por que interfaz asignar el servicio de DHCP editando /etc/default/dhcp

Firewall Workstation con iptables

Bueno a continuación les muestro como hacer un pequeño firewall para un workstation, el cual puede ser mejorado según los servicios que disponen en su sistema y el nivel de seguridad que deseen.

Les recomiendo crear el script en /etc/init.d/ con el nombre de firewall y asignar permisos de ejecución.

touch /etc/init.d/firewall

chmod 755 /etc/init.d/firewall

Luego agregar el script en los distintos run levels en los cuales podria iniciar el sistema.

update-rc.d firewall start 00 2 3 4 5 .

Una vez realizada estas acciones podemos modificar el script firewall, a continuacion un ejemplo de un sistema el cual tiene un servidor web y ssh, en el cual como politica realizaremos DROP de toda el INPUT y FORWARD, en el cual solo permitiremos acceder al puerto 22 desde $Internet y desde la LAN a nuestro servidor Web. la salida “OUTPUT” es por política ACCEPT.

#!/bin/bash

modprobe ip_nat_ftp
modprobe ip_conntrack_ftp

# Definición de Variables

iptables=’/sbin/iptables’
internet=’0/0′
lan=’200.1.2.0/24′
dev=’eth0′

$iptables -F
$iptables -F -t nat
$iptables -F -t mangle

$iptables -X
$iptables -X -t nat
$iptables -X -t mangle

# Definición de Políticas

$iptables -P INPUT DROP
$iptables -P OUTPUT ACCEPT
$iptables -P FORWARD DROP

# Definición de Cadena lan_to_host

$iptables -N lan_to_host
$iptables -A lan_to_host -p tcp –dport 80 -j ACCEPT

# Definición de INPUT

$iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p icmp -j ACCEPT
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A INPUT -p tcp –dport 22 -j ACCEPT
$iptables -A INPUT -i $dev -s $lan -j lan_to_host
$iptables -A INPUT -j LOG –log-prefix ‘REJECT INPUT: ‘
$iptables -A INPUT -j REJECT

GLPI

Buscando en la red algun sistema de inventario me encontre con GLPI http://www.glpi-project.org/spip.php?lang=en , se necesita Apache, PHP y MySQL, cuenta con bastante documentacion y una comunidad bastante activa. En este sistema se puede inventariar servidores, desktop, software, equipos de comunicacion, impresoras e insumos, ademas se pueden registrar contratos y relacionarlos contra sistemas implementados, es de gran utilidad, ya que tambien posee una plataforma de gestion de tu inventario, donde puedes sacar valores futuros, depreciaciones, amortizacion y manejo de garantias.

La instalacion del sistema la realize y es muy sencilla, existe un documento en la wiki de GLPI, el manual lo puedes ver en el mismo sitio web, cualquier duda en la instalacion del sistema, apache o mysql, estare atento a sus comentarios.
Aca puedes ver el demo del sistema web http://www.glpi-project.org/spip.php?article47.

* Otro sistema util para inventario y que se encuentra en repositorios debian es IRM, para mas informacion “apt-get install irm” y leer su documentacion :D . Una de sus cualidades que puedes crear usuarios LDAP para la autenticacion.