miércoles, 16 de junio de 2010

Centos 5x: Samba 3.3.x+LDAP Windows 7

Aqui de nuevo, ya para Agosto 2010 MS tiene planeado dejar de vender licencias de Windows XP, entonces tenemos que nosotros tambien actualizar nuestros PDC a una version compatible con Windows 7 porque van a empezar a llegar computadoras con este OS.

Que a mi punto de vista es mucho mejor que Windows Vista.

Bien Red Hat por no quedarse atras, decidio tener una version compatible con Windos 7 de Samba, la version 6 de Red Hat ya viene lista para ello, mientras tenemos solo 1 camino, migrar todo a samba 3.3.8 que viene por default o buscar una version mas reciente.

Para saber que dice el equipo de samba aqui tiene el link samba-windows7

Estamos usando la ultima version de Centos, ya que ellos dependen 100% de Red Hat, asi que estamos hablando de la 5.5 Release.

Todo esta hecho dentro de maquinas virtuales, todo corriendo bajo Ubuntu 9.10, para virtualizar tenemos VirtualBox.

Bien vamos suponiendo que ya tenemos nuestro Centos operando y actualizado. Algo que me gustaria aclarar es que ldap no tiene nada que ver con los problemas de samba y windows 7, asi que ldap sigue su operacion normal.

Pero vamos hacer todo desde 0 para no usar otros links y hacerlo muy tedioso.

Empiezo.

NOTA: Por el momento no vamos a usar DNS.

1; Centos actualizado con IP fija y hostname:

IP: 172.16.5.152
Hostname: pdc-srv.pinole.com

2; Modificar el archivo /etc/hosts:

[root@pdc-srv home]# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
172.16.5.152 pdc-srv.pinole.com pdc-srv

3; Instalar los siguientes repos.

Ver siguiente link repos

Una vez instalados correr:

yum update, actualizar y reinciar.

4; Instalar los siguientes paquetes:

samba3x.
samba3x-client
samba3x-common
samba3x-doc
samba3x-winbind
openldap-servers
openldap-clients

Estamos manejando la version 3.3.8 de samba.

5; Configurar ldap.

Nombre del dominio: pinole.com

a) creamos un folder llamado pinole en /var/lib/ldap/

mkdir /var/lib/ldap/pinole

b) Copeamos el archivo de nombre DB_CONFIG.example en el folder creado eliminando la extension.

cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/pinole/DB_CONFIG

c) Cambiamos el permiso de ese folder hacia el usuario ldap:
chown ldap:ldap /var/lib/ldap/pinole

d) Sacamos el password para el usuario de la BD en ldap:
[root@pdc-srv home]# slappasswd
New password:
Re-enter new password:
{SSHA}garabatosdecaracteres

e) editamos el archivo del servidor de ldap, llamado slapd.conf y lo dejamos asi:
NOTA: Muchos parametros los voy a eliminar para hacer la informacion mas digerible.

include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/samba.schema

pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args

database bdb
suffix "dc=pinole,dc=com"
rootdn "cn=Manager,dc=pinole,dc=com"
rootpw {SSHA}garabatosdecaracteres

directory /var/lib/ldap/pinole
loglevel 256

# Indices to maintain for this database
index objectClass,uidNumber,gidNumber eq
index cn,sn,uid,displayName pres,sub,eq
index memberUid,mail,givenname eq,subinitial
index sambaSID,sambaPrimaryGroupSID,sambaDomainName eq

f) Como estamos habilitando el log de ldap tenemos que actualizar syslog para que se encargue de el:

touch /var/log/ldap.log

Agregar esta linea a /etc/syslog.conf
local4.* /var/log/ldap.log

Salvar y reiniciar a syslog.

service syslog restart

g) Iniciamos el servicio de ldap.

[root@pdc-srv home]# service ldap start
Checking configuration files for slapd: config file testing succeeded
[ OK ]
Starting slapd: [ OK ]

h) Probamos que el servicio este operando:

[root@pdc-srv home]# service ldap status
slapd (pid 29680) is running...

6; Hasta aqui tenemos ya a ldap operable, ahora sigue configurar samba. Para ello tenemos dejar el archivo general(/etc/samba/smb.conf) como sigue:

[global]
workgroup = PINOLE
server string = PDC Domain
netbios name = PDC-SRV
hosts allow = 172.16.5. 127.
interfaces = eth0
bind interfaces only = Yes
hosts deny = 0.0.0.0

# passwd backend
encrypt passwords = yes
passdb backend = ldapsam:ldap://172.16.5.152/
enable privileges = yes
pam password change= Yes
passwd program = /usr/bin/passwd %u
passwd chat = *New*UNIX*password* %nn *ReType*new*UNIX*password* %nn * passwd:*all*authentication*tokens*updated*successfully*
unix password sync = Yes

# Log options
log level = 1
log file = /var/log/samba/%m.log
max log size = 500
syslog = 1

# Name resolution
name resolve order = wins hosts bcast lmhost

# misc
timeserver = No
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
use sendfile = yes

# Dos-Attribute
map hidden = No
map system = No
map archive = No
map read only = No
store dos attributes = Yes

# printers - configured to use CUPS and automatically load them
load printers = No
printcap name =
# printing =
cups options =
show add printer wizard = No
add user script = /usr/sbin/smbldap-useradd -m %u
delete user script = /usr/sbin/smbldap-userdel %u
add group script = /usr/sbin/smbldap-groupadd -p %g
delete group script = /usr/sbin/smbldap-groupdel %g
add user to group script = /usr/sbin/smbldap-groupmod -m %u %g
delete user from group script = /usr/sbin/smbldap-groupmod -x %u %g
set primary group script = /usr/sbin/smbldap-usermod -g %g %u
add machine script = /usr/sbin/smbldap-useradd -w %u

# LDAP-iConfiguration
#ldap delete dn = Yes
ldap ssl = off
ldap passwd sync = Yes
ldap suffix = dc=pinole,dc=com
ldap machine suffix = ou=Computers
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap idmap suffix = ou=Idmap
ldap admin dn = cn=Manager,dc=pinole,dc=com
idmap backend = ldap:ldap://172.16.5.152
idmap uid = 10000-20000
idmap gid = 10000-20000

# logon options
logon script =
logon path =
logon path =
logon home =
logon drive =

# setting up as domain controller
username map = /etc/samba/usermap
preferred master = Yes
wins support = Yes
domain logons = Yes
domain master = Yes
local master = Yes
os level = 64
map acl inherit = Yes
unix charset = UTF8
password level = 6

#Si tiene clientes windows98 debene habilitar estos parametros (solo para samba 3.3.x+, #samba 3.0.x los tiene por default habilitados.
#lanman auth = Yes
#client lanman auth = Yes

[netlogon]
comment = Network Logon Service
path = /home/samba/netlogon
Locking = no

[homes]
comment = Home Directories
valid users = %S
read only = No
browseable = No

[Public]
comment = Public Folder
path = /opt/public
available = Yes
browseable = Yes
public = Yes
read only = No
guest ok = Yes
writeable = yes
create mode = 0775
directory mode = 0775
admin users = root

[Share]
comment = Private Share
path = /opt/share
valid users = @it
write list = @PINOLE\it
force group = @PINOLE\it
read only = No
force create mode = 0770
directory mask = 0770

*Salvamos y salimos.

7; Debemos crear algunos foder ahi dados de alta:

mkdir /home/samba
mkdir /home/samba/netlogon

8; Crear el archivo usermap y dejarlo asi:

touch /etc/samba/usermap

root = Manager administrator admin
nobody = guest pcguest smbguest

9; Grabar el password de ldap en samba.

[root@pdc-srv home]# smbpasswd -W
Setting stored password for "cn=Manager,dc=pinole,dc=com" in secrets.tdb
New SMB password:
Retype new SMB password:

Este password es el que usamos cuando ejecutamos "slappaswd".

10; Compilar e instalar smbldap-tools, no podemos usar la version que nos propociona centos desde sus repos, por que esa aun depende de samba 3.0.x y les va a decir que eliminen la version que tienen instalada y si lo hacen van a volver de nuevo a el pasado.

Para ello necesitamos nosotros mismos hacer nuestra propia version. Asi:

a) yum install rpm-build
b) wget http://packages.sw.be/smbldap-tools/smbldap-tools-0.9.5-1.rf.src.rpm
c) rpm -ihv smbldap-tools-0.9.5-1.rf.src.rpm
d) Nos movemos a el folder /usr/src/redhat/SPECS
e) abrimos este archivo(smbldap-tools.spec ) y dejamos la siguiente linea asi:
Requires: perl >= 5.6, openldap, openldap-clients, samba3x
f) creamos el rpm:
rpmbuild -bb ./smbldap-tools.spec
g) nos movemos a el siguiente folder
cd /usr/src/redhat/RPMS/noarch
h) Instalamos el rpm
yum --nogpgcheck --enablerepo=rpmforge install smbldap-tools-0.9.5-1.rf.noarch.rpm

Esto nos va a instalar todo lo que necesita smbldap-tools.

11; Ahora necesitamos saber el SID del dominio, se saca asi:

[root@pdc-srv samba]# net getlocalsid
SID for domain PDC-SRV is: S-1-5-21-1790762827-2518552153-1965868529

Esta informacion debemos tenerla a la mano.

12; Configurar smbldap-tools.

a) abrir archivo /etc/smbldap-tools/smbldap.conf y dejarlo asi:

SID="S-1-5-21-1790762827-2518552153-1965868529"
sambaDomain="PINOLE"
slaveLDAP="127.0.0.1"
slavePort="389"
masterLDAP="127.0.0.1"
masterPort="389"
ldapTLS="0"
verify="require"
cafile="/etc/smbldap-tools/ca.pem"
clientcert="/etc/smbldap-tools/smbldap-tools.iallanis.info.pem"
clientkey="/etc/smbldap-tools/smbldap-tools.iallanis.info.key"
suffix="dc=pinole,dc=com"
usersdn="ou=Users,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
scope="sub"
hash_encrypt="SSHA"
crypt_salt_format="%s"
userLoginShell="/sbin/nologin"
userHome="/home/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
defaultMaxPasswordAge="999"
userSmbHome="\\PDC-SRV\%U"
userProfile=""
userHomeDrive="W:"
userScript=""
mailDomain="pinole.com"
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"

NOTA: No voy a manejar profiles en la red.

b) Sigue el archivo /etc/smbldap-tools/smbldap_bind.conf

slaveDN="cn=Manager,dc=pinole,dc=com"
slavePw="supassword"
masterDN="cn=Manager,dc=pinole,dc=com"
masterPw="supassword"

13; Crear los grupos y usuarios del dominio:

smbldap-populate -l 99

Al final nos va a pedir el password de ldap, se lo damos y listo.

14; Configuramos centos para que haga uso de ldap para su autentificacion, necesitamos editar 2 archivos, /etc/ldap.conf /etc/openldap/ldap.con, vamos empezando con el primero, que da asi:

host 127.0.0.1
base dc=pinole,dc=com
ldap_version 3
timelimit 120
bind_timelimit 120
bind_policy soft
idle_timelimit 3600
nss_initgroups_ignoreusers root,ldap,named,avahi,haldaemon,dbus,radvd,tomcat,radiusd,news,mailman,nscd,gdm
ssl no
tls_cacertdir /etc/openldap/cacerts
pam_password md5

Ahora /etc/openldap/ldap.conf

HOST 127.0.0.1
URI ldap://127.0.0.1/
BASE dc=pinole,dc=com
TLS_CACERTDIR /etc/openldap/cacerts

15; Configurar Centos para que haga uso de los usuarios de ldap, tenemos una utileria en la consola, se llama authconfig-tui, la ejecutamos y seleccionamos ldap en ambos lados, lo que hace este programa es leer los dos archivos del punto 14 y de saca la informacion de como contactar a ldap.



16; Ldap esta operando, ahora vamos a probar si la estructura de nuestro dominio esta correcta.

[root@pdc-srv samba]# net groupmap list
Domain Admins (S-1-5-21-1790762827-2518552153-1965868529-512) -> Domain Admins
Domain Users (S-1-5-21-1790762827-2518552153-1965868529-513) -> Domain Users
Domain Guests (S-1-5-21-1790762827-2518552153-1965868529-514) -> Domain Guests
Domain Computers (S-1-5-21-1790762827-2518552153-1965868529-515) -> Domain Computers
Administrators (S-1-5-32-544) -> Administrators
Account Operators (S-1-5-32-548) -> Account Operators
Print Operators (S-1-5-32-550) -> Print Operators
Backup Operators (S-1-5-32-551) -> Backup Operators
Replicators (S-1-5-32-552) -> Replicators

Ahora los usuarios

[root@pdc-srv samba]# getent passwd | grep Domain
root:x:0:0:Netbios Domain Administrator:/home/root:/bin/false

17; Ejecutando a samba, ya sigue la parte mas importante de todo esto, con esta version de samba, ya divieron el demonio smb y nmb asi que tenemos que iniciar a cada por su cuenta:

[root@pdc-srv samba]# service smb start
Starting SMB services: [ OK ]
[root@pdc-srv samba]# service nmb start
Starting NMB services: [ OK ]
[root@pdc-srv samba]# service winbind start
Starting Winbind services: [ OK ]

Winbind sigue siendo independiente.

18; Agrendo usuarios a el dominio:

[root@pdc-srv samba]# smbldap-useradd -a -m test6
[root@pdc-srv samba]# smbldap-passwd test6
Changing UNIX and samba passwords for test6
New password:
Retype new password:

Debemos tener un folder en /home de este usuario:

[root@pdc-srv samba]# ll /home/
total 32
drwx------ 2 notelaacabas Domain Users 4096 Jun 16 10:19 notelaacabas
drwxr-xr-x 3 root root 4096 Jun 16 09:48 samba
drwx------ 2 test1 Domain Users 4096 Jun 16 10:07 test1
drwx------ 2 test2 Domain Users 4096 Jun 16 10:07 test2
drwx------ 2 test3 Domain Users 4096 Jun 16 10:07 test3
drwx------ 2 test4 Domain Users 4096 Jun 16 10:08 test4
drwx------ 2 test5 Domain Users 4096 Jun 16 10:06 test5
drwx------ 2 test6 Domain Users 4096 Jun 16 13:05 test6

Yo ya tengo varios.

Vamos viendo la informacion de este usuario:

[root@pdc-srv samba]# pdbedit -Lv test6
Unix username: test6
NT username: test6
Account Flags: [U ]
User SID: S-1-5-21-1790762827-2518552153-1965868529-3024
Primary Group SID: S-1-5-21-1790762827-2518552153-1965868529-513
Full Name: test6
Home Directory: \\PDC-SRV\test6
HomeDir Drive: W:
Logon Script:
Profile Path:
Domain: PINOLE
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Mon, 18 Jan 2038 19:14:07 PST
Kickoff time: Mon, 18 Jan 2038 19:14:07 PST
Password last set: Wed, 16 Jun 2010 13:05:30 PDT
Password can change: Wed, 16 Jun 2010 13:05:30 PDT
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

[root@pdc-srv samba]# smbldap-usershow test6
dn: uid=test6,ou=Users,dc=pinole,dc=com
objectClass: top,person,organizationalPerson,inetOrgPerson,posixAccount,shadowAccount,sambaSamAccount
cn: test6
sn: test6
givenName: test6
uid: test6
uidNumber: 1012
gidNumber: 513
homeDirectory: /home/test6
loginShell: /sbin/nologin
gecos: System User
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
displayName: test6
sambaSID: S-1-5-21-1790762827-2518552153-1965868529-3024
sambaPrimaryGroupSID: S-1-5-21-1790762827-2518552153-1965868529-513
sambaHomePath: \\PDC-SRV\test6
sambaHomeDrive: W:
sambaLMPassword: F5CF000C05721947AAD3B435B51404EE
sambaAcctFlags: [U]
sambaNTPassword: 059D9B5115D7554D006DD6E6B3403B6C
sambaPwdLastSet: 1276718730
sambaPwdMustChange: 1363032330
userPassword: {SSHA}xcHbH7IIFXLNrpL9S4kbFD+r+ol0ZTUv
shadowLastChange: 14776
shadowMax: 999

Hasta aqui todo va bien.

19; Revisando si samba ya tomo el control del dominio, para esto tenemos que leer el archivo log de nmb:

[root@pdc-srv samba]# tail log.nmbd

Samba server PDC-SRV is now a domain master browser for workgroup PINOLE on subnet 172.16.5.152

*****
[2010/06/16 13:02:33, 0] nmbd/nmbd_become_lmb.c:become_local_master_stage2(395)
*****

Samba name server PDC-SRV is now a local master browser for workgroup PINOLE on subnet 172.16.5.152

*****

Perfecto.

20; Probando los accesos de los usuarios a cada uno de sus directorios personales:
[root@pdc-srv samba]# smbclient \\\\pdc-srv\\test6 -U test6
Enter test6's password:
Domain=[PINOLE] OS=[Unix] Server=[Samba 3.3.8-0.51.el5]
smb: \> mkdir seis
smb: \> quit
[root@pdc-srv samba]#

Listo no marco error de acceso, para que vean si funciona, vamos tratando hacer lo mismo, pero usando otro usuario:
[root@pdc-srv samba]# smbclient \\\\pdc-srv\\test6 -U test1
Enter test1's password:
Domain=[PINOLE] OS=[Unix] Server=[Samba 3.3.8-0.51.el5]
tree connect failed: NT_STATUS_ACCESS_DENIED

Correcto acceso denegado.

Bien, hasta aqui samba esta listo para recibir a sus clientes, ustedes ya saben como agregar sus equipos con Windows XP a el dominio, es casi el mismo proceso en windows 7, nomas que deben llevar a cabo unos cambios en el register, el principio del blog les puse el link donde dice como hacer esto.

LDAP Slave Server

Ya tenemos un servidor PDC con samba y LDAP, todo funciona correctamente, nuestros clientes se estan conectando, todo mundo esta trabajando sin problemas. Pero resulta que la empresa crecio y ahora los logeos estan un poco lentos.

Samba+LDAP segun la documentacion dice que por cada 50 usuarios debemos tener un BDC para que ayude a los logeos asi el PDC no se sature y alente la red.

La ventaja de LDAP es que tiene la opcion de replica hacia otro LDAP en tiempo real, no es necesario apagar el servicio y hacer rsync o cp o tar para llevar la BD de un servidor a otro.

LDAP tiene muchas maneras de llevar a cabo esto, cual es la mas eficiente no se, solo he trabajado con una muy estable y no estamos cambiando a cada rato los settings del PDC asi que para mi es mas que suficiente.

Esto funciona a grandes razgos asi, el PDC tiene el servidor LDAP maestro, necesitamos un BDC con un servidor LDAP esclavo. Cuando se hace algun cambio en la BD del PDC, el LDAP maestro envia los cambios a el LDAP esclavo que se esta ejecutando en el BDC, asi de simple.

Con esto tendremos redundancia de servidores de logeo, si cae uno el otro hara la chamba, lo unico malo que si el PDC cae y alguien quisiera hacer un cambio en su cuenta va a estar dificil por que el PDC manda, nada es perfecto, nunca me ha tocado esto.

Hacer esto no es nada dificil, lo unico que tenemos que hacer es o siguiente:

1; Datos del BDC:

IP: 172.16.5.153
Hostname: bdc-srv.pinole.com

2; Aqui estamos usando ya PFSENSE, asi que doy de alta los datos de mis equipos en el DNS asi me olvido de editar el /etc/hosts.

3; Software a instalar. Vamos a seguir del PDC los pasos del #4 a el 5-C.

4; Configurando el LDAP esclavo:

Aqui vamos a agregar a el final del archivo slapd.conf esto:

updatedn "cn=Manager,dc=pinole,dc=com"
updateref ldap://pdc-srv.pinole.com:389/

5; Seguir los pasos #14 y #15 para que nuestro BDC accese los usuarios del PDC via LDAP, probar.

6; Copear la BD de LDAP maestro a el esclavo y enviarla a el LDAP esclavo, cargar el LDAP esclavo con el respaldo traido desde el maestro.

a)Maestro.
slapcat -l pinole.ldif
b) Enviar este archivo a el esclavo, aqui yo use ssh para esto con llave publica.
c) slapadd -l pinole.ldif
NOTA: aqui necesitamos cambiar los permisos del directorio /var/lib/ldap/pinole de nuevo:
chown -R ldap:ldap /var/lib/ldap/pinole

7; Seguir paso #5-f.

8; Iniciar el LDAP esclavo.

9; En el LDAP maestro necesitamos apagarlo y agregar lo siguiente a el final del archivo slapd.conf:

#Replicas of this database
replogfile /var/lib/ldap/pinole/replog
replica host=bdc-srv.pinole.com:389
binddn="cn=Manager,dc=pinole,dc=com"
credentials=ldap-password
bindmethod=simple

10; Crear el archivo replog y poner los permisos de ldap:

touch /var/lib/ldap/pinole/replog
chown -R ldap:ldap /var/lib/ldap/pinole/

11; Reiniciar el servicio de ldap:

service ldap restart

Aqui ya tenemos nuestros dos servicios arriba, necesitamos saber si funcionan. Para esto, tanto el PDC como el BDC deben tener dados de alta ambos en el archivo ldap.conf, asi si uno no responde sabran usar el otro.

Asi quedaria el /etc/ldap.conf en ambos, solo se le agrega un parametro solemente:

host 127.0.0.1 bdc-srv.pinole.com

Como podran ver solo agregamos el bdc.

El /etc/openldap/ldap.conf lo mismo:

HOST 127.0.0.1 bdc-srv.pinole.com
URI ldap://127.0.0.1/ ldap://bdc-srv.pinole.com/
BASE dc=pinole,dc=com
TLS_CACERTDIR /etc/openldap/cacerts

Si quieren probar esto apaguen el LDAP maestro y pidan la informacion del algun usuario del dominio, debe arrojarselas aunque el LDAP maestro este apagado.

Ahora de nuevo prendan el LDAP maestro, agreguen un usuario o cambien el password de uno usuario, la replica la hace rapido. Apaguen el LDAP maestro y traten de pedir info del usuario creado, van a ver que en cualquiera de los 2 servidores les mostrara la informacion, lo que significa que funciona.

BDC, ahora seguimos con el BDC, aqui es donde entra Samba. La configuracion es parecida a el PDC, solo unas cosillas cambian, aqui les muestro el smb.conf del BDC.

#Global parameters
[global]
workgroup = PINOLE
server string = BDC Domain
netbios name = BDC-SRV
hosts allow = 172.16.5. 127.
interfaces = eth0, lo
bind interfaces only = Yes
remote announce = 172.16.5.255
hosts deny = 0.0.0.0
smb ports = 139 445

# passwd backend
encrypt passwords = yes
passdb backend = ldapsam:"ldap://172.16.5.152/ ldap://172.16.5.153/"
enable privileges = yes

# Log options
log level = 1
log file = /var/log/samba/%m.log
max log size = 500
syslog = 1

# Name resolution
name resolve order = wins hosts bcast lmhost

# misc
timeserver = No
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
use sendfile = yes

# Dos-Attribute
map hidden = No
map system = No
map archive = No
map read only = No
store dos attributes = Yes

# printers - configured to use CUPS and automatically load them
load printers = No
printcap name =
cups options =
show add printer wizard = No

# LDAP-Configuration
ldap ssl = off
ldap passwd sync = Yes
ldap suffix = dc=pinole,dc=com
ldap machine suffix = ou=Computers
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap idmap suffix = ou=Idmap
ldap admin dn = cn=Manager,dc=pinole,dc=com
idmap backend = ldap:ldap://172.16.5.152 ldap://172.16.5.153
idmap uid = 10000-20000
idmap gid = 10000-20000

# logon options
logon script =
logon path =
logon path =
logon home =
logon drive =

# setting up as domain controller
username map = /etc/samba/usermap
preferred master = Yes
wins support = No
wins server = 172.16.5.152
domain logons = Yes
domain master = No
local master = Yes
os level = 64
map acl inherit = Yes
unix charset = UTF8
password level = 6
map to guest = Bad User

Vamos a crear el archivo /etc/samba/usermap y agregar los datos al igual que el PDC.

touch /etc/samba/usermap
root = Manager administrator admin
nobody = guest pcguest smbguest

Guardar el passwd del ldap master:

[root@bdc-srv samba]# smbpasswd -W
Setting stored password for "cn=Manager,dc=pinole,dc=com" in secrets.tdb
New SMB password:
Retype new SMB password:

Guardar el SID del PDC.
[root@bdc-srv samba]# net rpc getsid PINOLE
Storing SID S-1-5-21-1790762827-1111111111-111111111 for Domain PINOLE in secrets.tdb

Unir a el dominio:

[root@bdc-srv samba]# net rpc join -U root
Enter root's password:
Joined domain PINOLE.

o

[root@bdc-srv samba]# net rpc join
Enter root's password:
Joined domain PINOLE.

Vean cual les funciona, la 1ra en otro dominio de prueba marco este error:

net rpc join -U root
Enter root's password:
[2010/06/21 22:50:14, 0] libsmb/clientgen.c:cli_receive_smb(165)
Receiving SMB: Server stopped responding
Could not connect to server SMBPDC
Connection failed: NT_STATUS_IO_TIMEOUT

Usando la 2da version funciono.

Verificamos en el PDC si la cuenta fue creada:
[root@pdc-srv pinole]# smbldap-groupmod -m test7 inv
adding user test7 to group inv
[root@pdc-srv pinole]# pdbedit -Lv bdc-srv$
Unix username: bdc-srv$
NT username: bdc-srv$
Account Flags: [S ]
User SID: S-1-5-21-1790762827-2518552153-1965868529-1003
Primary Group SID: S-1-5-21-1790762827-2518552153-1965868529-515
Full Name: Computer
Home Directory:
HomeDir Drive:
Logon Script:
Profile Path:
Domain: PINOLE
Account desc: Computer
Workstations:
Munged dial:
Logon time: 0
Logoff time: never
Kickoff time: never
Password last set: Mon, 21 Jun 2010 06:17:10 PDT
Password can change: Mon, 21 Jun 2010 06:17:10 PDT
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Ya solo hechamos a volar el samba y a probar.

smbclient -L \\bdc-srv -U root

sábado, 29 de mayo de 2010

Centos 5x: Instalar Samba 3.4

Tomamos la version que gusten de la rama 3.4 de aqui.

http://ftp.sernet.com/pub/samba/old/centos/5/i386/3.4.7-42/

Lo bajan a su centos 5, ahi tienen para i386 y x64 bits.

wget http://rutadelrpm

Aqui necesitamos instalar asi los paquetes:

rpm -i nombredelpaquete

Este es el orden de instalacion:

1; libwbclient0-3.4.7-42.el5.i386.rpm
2; samba3-client-3.4.7-42.el5.i386.rpm
3; samba3-3.4.7-42.el5.i386.rpm
4; samba3-winbind-3.4.7-42.el5.i386.rpm
5; smbldap-tools *
6; samba3-doc-3.4.7-42.el5.i386.rpm

*Si desean instalar samba-docs deben instalar smbldap-tools, por que este paquete instala librerias perl que samba-doc requiere.

Listo!!!

sábado, 22 de mayo de 2010

FreeBSD 7/8: Apache 2x Update con LDAP

Bueno ya tenemos que actualizar apache22. Pero sale esto en el UPDATING

AFFECTS: users of devel/apr0, devel/apr1, www/apache20, www/apache22
AUTHOR: pgollucci@FreeBSD.org

devel/apr has been renamed to devel/apr1

WITH_APR_FROM_PORTS=yes for www/apache22 has been dissolved and
may be removed from your configs. devel/apr1 is always used now.

Please manually delete apache-2.\* if installed _before_ updating using either
portmaster or portupgrade.

# pkg_delete -f apache-2.\*

If you use portmaster:

portmaster -o devel/apr1 devel/apr

If you use portupgrade:

portupgrade -f -o devel/apr1 devel/apr

Finally re-install apache if you deleted it earlier and update ports as usual.
(where XX is either 20 or 22)

portinstall www/apacheXX
Pero no dice nada hacerca de LDAP?

Cuando seguimos los pasos, y llegamos a la parte donde reinstalamos apache como sugieren en el UPDATING, no mencionan que apache va a tronar con un error que dice que uno de sus modulos debe ser compilado con soporte para LDAP, que resulta ser devel/apr1.

Por lo tanto debemos regresarnos y reinstalar devel/apr1 y agregar esta opcion.

[X] LDAP Enable LDAP support in apr-util

Una vez hecho esto, ahora si nos regresamos a www/apache22 y lo resinstalamos, ya no va a tronar, se ve instalar sin problemas, nomas recordar que antes de hacer esto respaldar el directorio actual de apache /usr/local/etc/apache22/ por que al momento de instarlo de nuevo va a sobre-escribir nuestra configuracion, asi cuando termine la instalacion solo regresamos los archivos de nosotros a su ubicacion original y ya solo reiniciamos apache y listo.

Animo!!!

viernes, 30 de abril de 2010

FreeBSD 8.X: Spam Gateway



Bueno, ya vieron como levantar un servidor de correo con Dovecot + Postfix. Ahora lo que sigue es proteger a nuestro servidor de spam, virus, etc.

Aqui vamos hacer algo sencillo, lo que le llaman un spam gateway, que su funcion principal es protegernos de los spammers y correos con bichos.

Internet->Postfix->amavisd->clamd->spamassassin->pasa || no pasa

La operacion con mas detalles es que todos los correos de entrada seran recibidos por este servidor, es el que se va a llevar la friega, por que tiene que estar desempaquetando, empaquetando, consultando el DNS y mas cuando hay archivos anexos.

La 1ra operacion o filtro lo hara Postfix, ya que el mismo tiene funciones o filtros que les aplica a cada correo, y es un proceso que se lleva a cabo entre smtp vs smtp, y aqui mucho correo de entrada queda descartado.

Enseguida vamos a ir por una aplicacion que hace algo tan sencillo y tambien bloquea otro monton de spam su nombre es postfix-policyd-weight, existen varias aplicaciones con la misma funcion, pero ya cada quien decide cual usar.

Luego sigue el checado de antivirus con clamavis, seguido de spamassassin ambas operaciones son administradas por amavisd, ya de regreso entran las listas BL y con esto vamos a tener un filtro casi al 100%, ya solo es cuestion de mantener a el dia el servidor y sobre todo spamassassin.

Bien, las aplicaciones que vamos a trabajar son las siguientes:

postfix
postfix-policyd-weight
spamassassin
clamavis
amavisd-new

Mas o menos asi vamos trabar conforme la lista.

Postfix

Vamos viendo la version que estamos trabajando y sobre todo FreeBSD:

OS: 8.2 I386.
Postfix: postfix-2.8.2,1

Otro detalle que me gustaria aclarar es que ambos servidores corren bajo Jails de FreeBSD, osea que estan virtualizados y ninguno posee la loopback interface y tienen un arreglo de disco Raid-1 con Satas.

La configuracion de mi src.conf es la siguiente tanto para el spam como el mail:

WITHOUT_ACCT="yes"
WITHOUT_ACPI="yes"
WITHOUT_AMD="yes"
WITHOUT_APM="yes"
WITHOUT_ASSERT_DEBUG="yes"
WITHOUT_ATM="yes"
WITHOUT_AUDIT="yes"
WITHOUT_AUTHPF="yes"
WITHOUT_BIND="YES"
WITHOUT_BLUETOOTH="yes"
WITHOUT_BOOT="yes"
WITHOUT_CALENDAR="yes"
WITHOUT_CDDL="yes"
WITHOUT_CTM="yes"
WITHOUT_CVS="yes"
WITHOUT_DICT="yes"
WITHOUT_EXAMPLES="yes"
WITHOUT_FLOPPY="YES"
WITHOUT_FORTH="yes"
WITHOUT_FREEBSD_UPDATE="yes"
WITHOUT_GAMES="yes"
WITHOUT_GDB="YES"
WITHOUT_GPIB="yes"
WITHOUT_HTML="yes"
WITHOUT_INET6="yes"
WITHOUT_IPFILTER="yes"
WITHOUT_IPFW="yes"
WITHOUT_IPX="yes"
WITHOUT_JAIL="yes"
WITHOUT_KVM="yes"
WITHOUT_LOCALES="yes"
WITHOUT_LOCATE="yes"
WITHOUT_LPR="yes"
WITHOUT_NCP="yes"
WITHOUT_NDIS="yes"
WITHOUT_NETGRAPH="yes"
WITHOUT_NLS="yes"
WITHOUT_NLS_CATALOGS="yes"
WITHOUT_NS_CACHING="yes"
WITHOUT_PF="yes"
WITHOUT_PMC="yes"
WITHOUT_PPP="yes"
WITHOUT_PROFILE="yes"
WITHOUT_QUOTAS="yes"
WITHOUT_RCMDS="yes"
WITHOUT_RCS="yes"
WITHOUT_RESCUE="yes"
WITHOUT_ROUTED="yes"
WITHOUT_SHAREDOCS="yes"
WITHOUT_SSP="yes"
WITHOUT_SYSINSTALL="yes"
WITHOUT_USB="yes"
WITHOUT_WIRELESS="yes"
WITHOUT_WPA_SUPPLICANT_EAPOL="yes"

Cuando se instala Postfix nos pregunta si deseamos colocar la configuración en /etc, yo no lo acepto en este servidor, si fuera el "mail server" si. Por lo tanto la instalacion se va a:


/usr/local/etc/postfix

Ahora algo que debemos saber es que configuracion nos da Postfix por default? Se supone que casi casi nos da una segura y no un "open-relay" que luego lo vamos a explicar.

Asi esta el archivo main.cf:

postconf -n

command_directory = /usr/local/sbin
config_directory = /usr/local/etc/postfix
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
debug_peer_level = 2
html_directory =
mail_owner = postfix
mailq_path =
manpage_directory =
newaliases_path =
queue_directory = /var/spool/postfix
readme_directory =
sample_directory =
sendmail_path =
setgid_group =
unknown_local_recipient_reject_code = 550

Ahora si desean ver toda la configuracion completa:

postconf

Pero aqui no lo puedo poner porque esta extensa la salida, ustedes en su maquina pueden hacerlo.

Como tenemos 2 servidores:
  • mail-server 192.168.40.2 Correo Saliente
  • spam-server 192.168.40.3 Correo Entrante
Vamos a usar el dominio: example punto com para seguir la tradicion.

Mi DNS apunta a mi spam-server, ya di de alta el registro PTR de mi IP publico a el nombre de mi spam-server, ya que el es quien recibe todo el correo entrante y envia el correo si pasa todos los filtros a el mail-server, si no tiene el PTR muchos servidores de correo no envian ni reciben correo de servidores que no cumplen esta norma.

---------------------------------------------------------------------------------
NOTA:Aqui ya tengo mi servidor de correo operando sin problemas, solo voy a configurar el spam server.
---------------------------------------------------------------------------------

Vamos a empezar con la 1ra configuracion, habran el archivo main.cf de postfix su corazon:

1; Nombre del hostname:

myhostname = spam.example.com

2; Dominio que voy a proporcionar el servicio.

mydomain = example.com

3;Mi origen.

myorigin = $mydomain

5; Las interfaces que el servidor va a usar para recibir la comunicacion: Por lo regular es en todas las que tengamos.

inet_interfaces = all

6; Destinos:

mydestination =

¿Por que en blanco?, como queremos tanta seguridad como sea posible, vamos a deshabilitar el envio local, por ello no damos de alta nuestro dominio aqui, pero vamos a ver mas adelante como habilitar el envio local para recibir mensajes del root del spam-server.

Para habilitar el envio local del root y cuentas de administradores como:
  • postmaster
  • abuse
Deshabilitamos el parametro dejandolo en blanco:

local_recipient_maps =

Ahora si deseo que ciertos usuarios locales puedan recibir correos como los anteriores, vamos hacer uso del parametro este:

virtual_alias_maps = hash:/usr/local/etc/postfix/virtual_alias_maps

Como parametro le damos el archivo en formato binario que se lo indicamos usando la palabra "hash", ahora vamos a crear ese archivo y le agregamos la informacion asi:

postmaster postmaster@example.com
abuse abuse@example.com

Salvamos el archivo en la ruta indicada arriba y crea el formato que nos pide postfix con el comando postmap, asi:

postmap hash:/usr/local/etc/postfix/virtual_alias_maps

Si revisan su directorio van a ver los 2 archivos:

-rw-r--r-- 1 root wheel 141 Apr 14 12:24 virtual_alias_maps
-rw-r--r-- 1 root wheel 65536 Apr 14 12:24 virtual_alias_maps.db

El que tiene extension "db" es el creado con el comand anterior y es el que usa postfix, todos estos archivos son creados usando BDB para esta funcion son excelentes y es mas veloces su acceso que si hicieramos uso de una DB como mysql, por ello se opto por este formato.

Cuando alguien fuera del dominio busque enviar correos a cuentas locales podemos personalizar el mensaje con el parametro:

local_transport

Por default tiene un texto asi:

local_transport = error:local mail delivery not available

Pero pueden poner el texto que gusten como:

local_transport = error:No molestar envio local esta deshabilitado

Con esto el servidor podra enviar correos a las cuentas arriba dadas de alta de lo contrario ni eso podria ser posible.

Ya para rematar debemos eliminar el envio demonio que se encarga de los envios locales, abran el archivo de nombre master.cf y deshabiliten la linea

#local unix - n n - - local

Poniendo un "#" para convertirla a comentario.

7; Datos de nuestra red.

mynetworks = 192.168.40.2/32

Aqui colocamos el IP de nuestro mail-server interno, solo a el vamos a servir, ya que si colocamos nuestro rango de red, ejemplo 192.168.40.0/24 cualquier usuario interno podra usar este servidor como relay y hacer maldades, con este dato descartamos esta posibilidad.

8; Domino que podemos habilitar el relay.

relay_domains = example.com

9; Usuarios validos que pueden recibir correo externo.

relay_recipient_maps = hash:/usr/local/etc/postfix/relay_recipients

Este parametro es una pieza clave que deberan mantener al dia, ya que aqui le indicamos que usuarios del dominio pueden recibir correo, antes de que el spam-server envie el correo a el mail-server revisa este parametro y si la cuenta o "recipient" no esta aqui, rechaza el correo, aqui vamos a eliminar mucho spam, ya que los spammers tienen programas que generan cuentas de usuario aleatoriamente, ya con eso les paramos su kalabaza.

Por lo tanto, como ven de nuevo necesitamos crear ese archivo con los usuarios validos, en mi caso tengo solo 3 y el archivo tiene este formato:

usuario1@example.com OK
usuario2@example.com OK
usuario3@example.com OK

Creamos el archivo en formato BDB:

postmap hash:/usr/local/etc/postfix/relay_recipients

10; Alias

alias_maps = hash:/usr/local/etc/postfix/aliases

De nuevo necesitan crear el archivo con postmap, ya no se los voy a repetir, el archivo esta en blanco aun no hemos hecho uso de el.

11; Alias Databases

alias_database = hash:/usr/local/etc/postfix/aliases

Igual en blanco ya que no hemos hecho uso de el, pero si deben crear el archivo en formato BDB.

12; Banner

smtpd_banner = $myhostname ESMTP $mail_name

Cuando nuestro servidor de correo necesite comunicarse con otro smtp, el RFC pide que nos presentemos usando el HELO y nuestro nombre, este parametro hace eso.

13; Rutas.

sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = /usr/local/share/doc/postfix

14; Habiltando el envio de correo a el mail-server.

transport_maps = hash:/usr/local/etc/postfix/transport

Como pueden observar, necesitamos crear ese archivo con los datos de nuestro mail-server, como sigue:

example.com smtp:[mail.example.com]

Creamos el BDB.

Este ultimo paso es donde le indicamos a nuestro spam-server que envie todos los correos aceptados a este hostname, si no tienen un DNS operable pueden poner el IP si gustan, en mi caso mi DNS esta funcionando sin problemas.

15; Revisamos el sintaxis de postfix.

postix check

Si no hay problema, ya pueden iniciar su servicio y primero que nada buscar sitios publicos donde probar si nuestro servidor no es un "open-relay" que significa que nadie de fuera puede usarlo para enviar correos.

http://www.abuse.net/relay.html

Le dan su IP o nombre del spam-server tal cual lo tiene dado de alta en su DNS y esperen los resultados, van a ver muchas pruebas que le hacen y a el final obtendran un mensaje como este:

Relay test result
All tests performed, no relays accepted.

Pero hagan mas pruebas, existen varios sitios publicos que nos proporcionan este servicio publico.

Tambien revisen su log para que vean lo que postfix logea cuando quieren penetrarlo para openrelay:

May 6 00:09:29 spam postfix/smtpd[3333]: NOQUEUE: reject: RCPT from verify.abuse.net[64.57.183.77]: 554 5.7.1 : Relay access denied; from= to= proto=SMTP helo=
May 6 00:09:32 spam postfix/smtpd[3333]: NOQUEUE: reject: RCPT from verify.abuse.net[64.57.183.77]: 554 5.7.1 : Relay access denied; from= to= proto=SMTP helo=
May 6 00:09:35 spam postfix/smtpd[3333]: NOQUEUE: reject: RCPT from verify.abuse.net[64.57.183.77]: 554 5.7.1 : Relay access denied; from= to= proto=SMTP helo=
May 6 00:09:38 spam postfix/smtpd[3333]: NOQUEUE: reject: RCPT from verify.abuse.net[64.57.183.77]: 554 5.7.1 : Relay access denied; from= to= proto=SMTP helo=

Esto es solo una parte de los logs, familiaricense con ellos, son importantisimos.

Vamos observando como nos queda la configuracion despues de estos primeros cambios:

postconf -n
alias_database = hash:/usr/local/etc/postfix/aliases
alias_maps = hash:/usr/local/etc/postfix/aliases
command_directory = /usr/local/sbin
config_directory = /usr/local/etc/postfix
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
debug_peer_level = 2
html_directory = /usr/local/share/doc/postfix
inet_interfaces = all
local_recipient_maps =
mail_owner = postfix
mailq_path = /usr/local/bin/mailq
manpage_directory = /usr/local/man
mydestination =
mydomain = example.com
myhostname = spam.example.com
mynetworks = 192.168.40.2/32
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = /usr/local/share/doc/postfix
relay_domains = example.com
relay_recipient_maps = hash:/usr/local/etc/postfix/relay_recipients
sample_directory = /usr/local/etc/postfix
sendmail_path = /usr/local/sbin/sendmail
setgid_group = maildrop
smtpd_banner = $myhostname ESMTP $mail_name
transport_maps = hash:/usr/local/etc/postfix/transport
unknown_local_recipient_reject_code = 550

Pueden compararla con la primera que mostramos y notaran la diferencia.

Restricciones
1; Helo.

Podemos por regla solicitar a el otro smtp que siempre que trate de entablar comunicacion con nosotros, se presente haciendo uso de su nombre, para ello usamos el parametro:

smtpd_helo_required = yes

Con esto le pedimos que nos mande su hostname, asi dicen los RFC.

Por default postfix no lo pide, pero nosotros si, muchos spammers no les gusta esto y mucho menos obedecer reglas, si asi nos gusta a nosotros ni modo asi va a hacer.

Ahora vean lo que pasa cuando otro smtpd se conecta y es irrespetuoso, vamos a usar un equipo externo para hacer las pruebas, para ver la info en los logs de postfix que en mi caso estan en:

/var/log/maillog

Necesito prender el log de postfix abriendo el archivo de nombre:

master.cf

Y busca la siguiente linea y le agrego el parametro -v, asi quedaria:

smtp inet n - n - - smtpd -v

En este caso es la 1ra.

Aqui si reinicio el servicio.

Ahora, me conecto del otro cliente e intento mandar un correo sin mandar el HELO:

telnet example.com 25
Trying XXX.YYY.ZZZ.WWW...
Connected to example.com (IP-Publica).
Escape character is '^]'.
220 spam.example.com ESMTP Postfix
mail from:
503 5.5.1 Error: send HELO/EHLO first

Esto aparece de lado del otros smtp, ahora vemos los logs de postfix, si va a logear mucho pero aqui estamos aprediendo y no hay como saber leer los logs de cada uno de nuestros servidores de los contrario no somos buenos administradores:

May 9 22:50:53 spam postfix/smtpd[68766]: > mail.example2.com[IP-Publica]: 220 spam.example.com ESMTP Postfix
May 9 22:51:16 spam postfix/smtpd[68766]: < mail.example2.com[IP-Publica]: mail from:
May 9 22:51:16 spam postfix/smtpd[68766]: > mail.example2.com[IP-Publica]: 503 5.5.1 Error: send HELO/EHLO first

Ahi esta nuestra primer restriccion trabajando, asi que funciona.

Panorama de la comunicacion de un correo y lugar donde aplica cada tipo de restriccion, ver siguiente figura:

Figura 1. Ubicacion de restricciones de un correo en postfix.

En base a la figura 1, vamos a seguir este tutorial.

warn_if_reject

Este parametro se creo con el fin de debugear las restricciones, se ponen 1ro que la restriccion y solo nos logea un mensaje como este:

connect from mail.example2.com[IP-publica]
May 9 23:27:29 spam postfix/smtpd[69200]: NOQUEUE: reject_warning:
RCPT from mail.example2.com[IP-publica]: 554 5.7.1
: Client host rejected: Access denied; from=
to= proto=ESMTP helo=

Este pequeño parametro es de gran utilidad, ya que nos avisa si la regla funciona y si la pocision es adecuada y sobre todo que no rechaza el correo es simple informacion en los logs.

warn_if_reject restriccion_deseada

2; Client Restrictions.

Restricciones del cliente, que opciones por default tiene postfix, vamos revisandola:

postconf -d smtpd_client_restrictions
smtpd_client_restrictions =

Ninguna, entonces vamos empezando a ver que nos sirve, aunque aqui se manejan muchas, no todas vamos usar ya que muchas no tiene aplicacion para mi aun.

check_client_access

smtpd_client_restrictions=
warn_if_reject check_client_access hash:/usr/local/etc/postfix/access_clients
permit

Creamos el archivo con un dominio que no deseo aceptar, ejemplo

hotmail.com REJECT

Ya saben es hash, ya saben que tienen que hacer.

reload a postfix, mandamos un correo desde una cuenta de hotmail y vemos log.

connect from snt0-omc3-s32.snt0.hotmail.com[65.55.90.171]
May 9 23:45:21 spam postfix/smtpd[69404]: NOQUEUE: reject:
RCPT from snt0-omc3-s32.snt0.hotmail.com[65.55.90.171]:
554 5.7.1 :
Client host rejected: Access denied;
from= to=
proto=ESMTP helo=
May 9 23:45:21 spam postfix/smtpd[69404]: disconnect
from snt0-omc3-s32.snt0.hotmail.com[65.55.90.171]

Dentro de hotmail recibiran un correo con el subject:

Delivery Status Notification (Failure)‏

Y con el body:

This is an automatically generated Delivery Status Notification.
Delivery to the following recipients failed.
usera-texample.com

Ahora si tiene una cuenta de correo que no sea hotmail, prueben:

connect from mail.otrodominio.com[ippublica]
May 9 23:53:27 spam postfix/smtpd[69410]: 1D55BC16786: client=mail.otrodominio.com[ippublica]
May 9 23:53:27 spam postfix/cleanup[69413]: 1D55BC16786:
message-id=<6101993aafcd9f28f8b610475feca52b.squirrela-twww.otrodominio.com>
May 9 23:53:27 spam postfix/qmgr[69390]: 1D55BC16786:
from=, size=946, nrcpt=1 (queue active)
May 9 23:53:27 spam postfix/smtpd[69410]: disconnect
from mail.otrodominio.com[ippublica]
May 9 23:53:27 spam postfix/smtp[69414]: 1D55BC16786:
to=, relay=mail.example.com[192.168.40.4]:25,
delay=0.09, delays=0.02/0.01/0.02/0.04, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 2DA714E0015)
May 9 23:53:27 spam postfix/qmgr[69390]: 1D55BC16786: removed

Como podran ver rechazo un dominio que es basura desde el 1er filtro segun la figura 1, ahora porque si facebook esta prohibido en su empresa no bloquearlo para no aceptar ninguna invitacion por correo, ya vieron como hacerlo...

NOTA: De los logs voy a quitar "@" y lo voy a remplazar por la palabra a-t, muchos sabran por que.


Ahora veo como queda mi 1er restriccion:

postconf -h smtpd_client_restrictions
check_client_access hash:/usr/local/etc/postfix/access_clients permit

El parametro permit le indica a postfix que si el cliente pasa las reglas anteriores pueden seguir su camino con las demas restricciones si hay.

3; smtpd_recipient_restrictions.

Aqui es donde la mayor parte de las restricciones entran, ya que si revisan la figura 1 en cada nivel postfix tiene filtros, pero segun los expertos aqui es donde van la mayoria. Ahora que es lo hace postfix por default para que nuestro smtpd no sea un "open relay"?,

Vamos primero revisando viendo los parametros por default que nos da esta restriccion:

postconf -d smtpd_recipient_restrictions
smtpd_recipient_restrictions =
permit_mynetworks, reject_unauth_destination

Como podran ver solo existen 2, postfix divide sus restricciones en 2 capas:

nombre_de_restriccion =
----Restricciones que aplica tanto a clientes internos como externos.
permit_mynetworks
----
Restricciones que aplica solo a clientes externos.
permit

Por ello coloca esta restriccion:

reject_unauth_destination

Enseguida de:

permit_mynetworks

Estos dos parametros hacen que nuestro smtp no sea un openrelay y asi viene por default postfix.

El parametro reject_unauth_destination se encarga de eso, verificando que tanto el RCPT TO: su dominio o destinatarios sean de nuestro dominio, de lo contrario son rechazados.

Entonces vamos armando nuestro siguiente filtro y quedaria asi:

smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
permit

Pongan lo anterior en el archivo main.cf.

4; Exigir que a otros smtp que sigan las reglas del RFC y cuando manden su nombre en el HELO/EHLO venga en forma FQDN.

mail.example.com

De lo contrario sera rechazado, nosotros ponemos las reglas, el parametro usado es:

reject_non_fqdn_hostname

Quedaria asi:

smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_hostname
permit

Reload y probamos.

connect from mail.example2.com[pub-ip]
May 12 22:03:33 spam postfix/smtpd[8895]: NOQUEUE: reject_warning:
RCPT from mail.example2.com[pub-ip]:
504 5.5.2 : Helo command rejected: need fully-qualified hostname;
from= to= proto=SMTP helo=
May 12 22:03:33 spam postfix/smtpd[8895]: 4EC1BC16786:
client=mail.example2.com[pub-ip]

5; Ahora vamos a pedirles a otros smtp que usen nombres validos en el hostname usando este parametro:

reject_invalid_hostname

Es parecido a el #4 y util.

Reload y probamos.

6; Hasta aqui hemos atacado el smtp, pero ahora sigue el sender o el "from:", asi como le pedimos a los smtp externos que tengan nombres en forma FQDN, tambien se lo vamos a exigir a los remitentes usando este parametro:

reject_non_fqdn_sender

Y lo vamos a colocar arriba de permit_mynetworks, para que sea a todos, tanto los externos como internos, por si por alguna razon postfix falle no me vaya a causar problemas por error de dedo o de aplicacion, mejor se lo aplico a todos.

Quedaria asi:

smtpd_recipient_restrictions =
reject_non_fqdn_sender
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload y probamos.

connect from mail.example2.com[ip-pub]
May 12 22:31:50 spam postfix/smtpd[9269]: NOQUEUE:
RCPT from mail.example2.com[ip-pub]: 504 5.5.2 :
Sender address rejected: need fully-qualified
address; from= to=
proto=SMTP helo=
May 12 22:31:50 spam postfix/smtpd[9269]:
96E4DC16786: client=mail.example2.com[ip-pub]
May 12 22:31:56 spam postfix/smtpd[9269]:
lost connection after UNKNOWN from mail.example2.com[ip-pub]
May 12 22:31:56 spam postfix/smtpd[9269]:
disconnect from mail.example2.com[ip-pub]

7; Ahora vamos a validar la existencia de los dominios de los otros smtp`s. Con este parametro:

smtpd_recipient_restrictions =
reject_non_fqdn_sender
reject_unknown_sender_domain
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload y probamos.

connect from mail.exmaple2.com[pub-ip]
May 13 06:44:14 spam postfix/smtpd[15311]: NOQUEUE: reject:
RCPT from mail.exmaple2.com[pub-ip]: 450 4.1.8
: Sender address rejected:
Domain not found; from=
to=
proto=SMTP helo=
May 13 06:44:19 spam postfix/smtpd[15311]:
lost connection after RCPT from mail.exmaple2.com[pub-ip]
May 13 06:44:19 spam postfix/smtpd[15311]:
disconnect from mail.exmaple2.com[pub-ip]

Claro que aqui postfix necesita hacer unos queries a el DNS pero no importa vale la pena.

8; Ahora vamos a verficar que el dominio de los destinos existan, ya se que sabemos que no va a pasar, pero para que dejar que la comunicacion sigan procesandose si puede pararla antes mejor, asi me ahorro CPU/memoria/tiempo.

Quedaria asi:

smtpd_recipient_restrictions =
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload y revisamos logs, les aparecera algo asi:

user@dominio.malo.com>: Recipient address rejected: Domain not found

Hasta aqui hemos creado un grupo de restriciones, las cuales creanme van a bloquar parte de los spammers, pero este es solo la 1er barrera, vamos a seguirle.

10; Validando remitentes.

Ahora vamos a pedirle a postfix que antes de aceptar un correo para un usuario de nuestro dominio lo verifique, para ello tenemos 2 formas, usuarios locales y usuarios del dominio, anteriormente hablamos de los 1eros y configuramos a nuestro smtp para que no acepte nada a cuentas locales, asi que aqui me enfocare a los usuarios del dominio.

El parametro:

relay_recipient_maps = hash:/usr/local/etc/postfix/relay_recipients

Le estamos dando un archivo donde tenemos las cuentas que pueden realmente recibir correos, aqui esta un ejemplo:

user1@example.com OK
user2@example.com OK

Ya saben como deben crear el archivo que requiere postfix, reload y prueban.

connect from mail.example2.com[ip-pub]
May 14 15:35:01 spam postfix/smtpd[32991]: NOQUEUE: reject: RCPT from
mail.example2.com[ip-pub]: 550 5.1.1 :
Recipient address rejected: User unknown in relay
recipient table; from=
to= proto=SMTP helo=
May 14 15:35:08 spam postfix/smtpd[32991]:
lost connection after RCPT from mail.example2.com[ip-pub]
May 14 15:35:08 spam postfix/smtpd[32991]:
disconnect from mail.example2.com[ip-pub]

Se preguntaran, como podre sacar mi lista de usuarios? bueno aqui cada debe saber como tenerla a el dia.

11;Vamos a agregar otros parametros y al ver su nombre ustedes van a saber lo que hacen:

smtpd_recipient_restrictions =
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload y prueban.

12; Envio a multiples destinatarios.

Dice el RFC que uno nunca debe de bloquear el correo de remitentes en esta forma:

<>

Ya que este correo lo usan los mismos smtp para comunicarse, pero muchos spammers abusan y tratan de usarlo para aprovecharse de este atributo y ademas trataran de usarlo para enviar correos a multiples destinatarios, por ello existe este parametro:

reject_multi_recipient_bounce

Su funcion es esa y nuestra configuracion seria asi:

smtpd_recipient_restrictions =
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
reject_unauth_destination
reject_multi_recipient_bounce
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload y prueban.

connect from mail.example2.com[pub-ip]
May 15 22:01:11 spam postfix/smtpd[64455]: 3D706C16E22:
client=mail.example2.com[pub-ip]
May 15 22:01:23 spam postfix/smtpd[64455]:
3D706C16E22: reject: RCPT from mail.example2.com[pub-ip]:
550 5.5.3 : Recipient address rejected:
Multi-recipient bounce; from=<> to=
proto=SMTP helo=
May 15 22:01:28 spam postfix/smtpd[64455]:
lost connection after RCPT from mail.example2.com[pub-ip]
May 15 22:01:28 spam postfix/smtpd[64455]:
disconnect from mail.example2.com[pub-ip]

13; Helo Checks.

Muchos spammers trataran de pasarse de listos y quedran enviar en el HELO/EHLO el nombre de nuestro smtp, por lo tanto vamos deteniendo este detalle creando un archivo con los siguientes caracteres raros:

/^spam\.example\.com$/ REJECT You are not in the server room

# Somebody HELO'ing with our IP address?
/^W\.X\.Y\.Z$/ REJECT You are not my IP
/^\[W.X.Y\.Z\]$/ REJECT You are not my IP
/^[0-9.]+$/ REJECT U are not RFC2821 compliant

Donde W.X.Y.Z es el ip publico de mi spam server, no el interno.

Y dentro de postfix usamos el parametro:

check_helo_access

Asi:

smtpd_recipient_restrictions =
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
reject_unauth_destination
reject_multi_recipient_bounce
check_helo_access pcre:/usr/local/etc/postfix/helo_checks
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload.

Si se dan cuenta, postfix genera un archivo con la extension .pcre de helo_checks.

Ahora revisamos el log:

connect from mail.example2.com[pub-ip]
May 15 22:45:43 spam postfix/smtpd[59312]: NOQUEUE: reject:
RCPT from mail.example2.com[pub-ip]:
554 5.7.1 :
Helo command rejected: You are not in the server room;
from=
to=
proto=SMTP helo=

14; Listras negras de DNS.

Postfix nos permite a nosotros hacer uso de sitios externos para saber si el smtp externo que desea tener comunicacion con nuestro smtp no esta en alguna lista negra. Hay varios parametros y lista de este tipo existen varias, yo en lo particular estoy usando:

http://www.spamhaus.org/index.lasso

Me ha servido mucho y es mucho el spam que me bloquean y no he tenido problemas con ninguno de nuestros clientes en el sentido que este filtro los este bloqueando.

Bien, esta funcion es desgastante en tiempo pero vale la pena, y me refiero a esto porque nuestro smtp tendra que hacer algunos queries a el dns, asi que si ven lentitud vayan pensando en levantar un cache DNS.

Como quedaria my configuracion:

smtpd_recipient_restrictions =
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
reject_unauth_destination
reject_multi_recipient_bounce
check_helo_access pcre:/usr/local/etc/postfix/helo_checks
reject_non_fqdn_hostname
reject_invalid_hostname
reject_rbl_client zen.spamhaus.org
permit

En mi caso quiero que sea la ultima que se lleve a cabo por lo mismo del tiempo precioso que necesita que son segundos, pero cuando tienes 20 conexiones x segundo ya pesa.

Reload y voy a mostrar un log de cuando este operacion entra en juego:

May 15 23:01:39 spam postfix/smtpd[2968]:
NOQUEUE: reject: RCPT from unknown[PUB-IP]:
554 5.7.1 Service unavailable; Client host
[PUB-IP] blocked using zen.spamhaus.org;
http://www.spamhaus.org/query/bl?ip=PUB-IP;
from= to=
proto=SMTP helo=<456.subnet24-432-789.speedy.telkom.net.id>

15; No permitir usar mi dominio a el remitente.

Ahora vamos a verificar que los smtp no traten de usar mi dominio en sus remitentes, para ello vamos a crear un archivo con estos datos:

example.com 554 No usar mi dominio en tu remitente

Y nuestro configuracion seria asi:

smtpd_recipient_restrictions =
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
check_sender_access hash:/usr/local/etc/postfix/no_usar_mi_dominio
reject_unauth_destination
reject_multi_recipient_bounce
check_helo_access pcre:/usr/local/etc/postfix/helo_checks
reject_non_fqdn_hostname
reject_invalid_hostname
reject_rbl_client zen.spamhaus.org
permit

Por que ahi? Bien yo quiero que si alguien quiere usar mi dominio en su remitente, no deseo investigar mas ya que ese smtp ha tratado de fingir ser "yo" por lo tanto lo rechazo antes de seguir gastando mi precioso tiempo, CPU, memoria por ello le doy prioridad a esta regla.

Reload y vamos a ver que dice el log:

connect from mail.example2.com[pub-ip]
May 15 23:44:39 spam postfix/smtpd[64295]:
NOQUEUE: reject: RCPT from mail.example2.com[pub-ip]:
554 5.7.1 :
Sender address rejected: No usar mi dominio en tu remitente;
from=
to=
proto=SMTP helo=


16;
Filtros Externos

Ahora vamos hacer uso de programas externos y deseo darles una tecnica que a muchos les parece algo exagerada pero a mi punto de vista la veo muy util, la cual se basa en un funcion de los smtp, la cual funciona asi.

Cuando un smtp se comunica con otro, y este otro esta muy saturado, este ultimo le puede responder a el 1er smtp diciendole que esta muy cargado que espero un poco de tiempo. El rfc tiene contemplado esto.

Asi de simple, pero a que viene esto?

Muchos spaammers les pagan por enviar correos, mientras mas envien mas les pagan o llegan a su cuota, por ello muchos crean su programas para que no obedezcan los RFC de lo contrario serian ejecutables muy grandes y rapidamente detectados.

Y ademas, ellos reciben su paga por enviar y no por confirmar si llego o no, en las palabras anteriores esta la clave.

Para llevar a cabo esta tecnica vamos hacer uso de un programa llamado: Postgrey de este sitio.

http://postgrey.schweikert.ch/

Por ello postfix nos da este parametro:

check_policy_service

Aqui es donde le decimos que haga uso de algo externo.

Lo que hace postgrey es lo siguiente. Cuando un remitente externo(otro smtp) trata de enviarnos por primera vez correos a un destinatario de nuestro dominio, una vez pasado por todas las reglas y llegado a el check_policy_service, postgrey en su bd verifica que haya un par de parametros:

remitente destinatario

Si no hay ninguno, este le retorna el mensaje a el otro smtp que debe esperar, por default postgrey tienen una poliza de 5 minutos, asi que si el otro smtp trata de hacerlo antes postgrey ya lo tiene en su lista de espera y lo vuelve a rechazar hasta que haya pasado ese periodo de gracia.

Una vez que el otro smtp lo intenta en el tiempo especificado ya postgrey le permite el paso por que ya tiene un par de llaves en su bd.

Asi de simple, como les comente anteriormente los spammers no les interesa saber si si correo llego o no, muchos menos detenerse para volver enviar el correo, por ello esta tecnica tambien les va a bloquear un bloque de spam.

Su unico incoveniente es que la 1ra vez que su amigo les envie el correo van a tardar 5 minutos en entrar, pero todos los smtp que siguen las reglas van a respetar nuestras reglas y volver a enviar el correo en el tiempo especificado asi que no van a tener problemas.

Ustedes son los que saben como operar su servidor y que es lo mejor para su compañia asi que si un empleado sale lloron solo tienen que convencer a su jefe la importancia para su compañia de este pequeño truco.

Para ponerlo a trabajar ya solo voy a rc.conf y lo doy de alta:

postgrey_enable="yes"

La bd de datos que usa es BDB, postgrey no es el unico que existen hay muchos, pero para este funcion yo lo elegi a el.

Lo hecho a volar.

Mi configuracion quedaria asi:

smtpd_recipient_restrictions =
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
check_sender_access hash:/usr/local/etc/postfix/no_usar_mi_dominio
reject_unauth_destination
check_helo_access pcre:/usr/local/etc/postfix/helo_checks
reject_multi_recipient_bounce
reject_non_fqdn_hostname
reject_invalid_hostname
check_policy_service inet:192.168.40.5:10023
reject_rbl_client zen.spamhaus.org
permit

Lo coloco antes del _rbl_client ya que prefiero que los queries externos sea lo ultimo que haga mi spam server.

Reload y van a ver logs como este:

connect from second3.fotuicatan.com[173.246.141.201]
May 16 07:07:39 spam postgrey[18480]: action=greylist, reason=new,
client_name=second3.fotuicatan.com,
client_address=173.246.141.201,
sender=dentalcarea-tfotuicatan.com,
recipient=usera-texample.com
May 16 07:07:40 spam postfix/smtpd[14371]:
NOQUEUE: reject: RCPT from second3.fotuicatan.com
[173.246.141.201]: 450 4.2.0 :
Recipient address rejected: Greylisted, see
http://postgrey.schweikert.ch/help/example.com.html;
from= to=
proto=ESMTP helo=

Clamavis

Ahora vamos a configurar el antivirus open source ClamAV, en este servidor estamos hablando de la version 0.97, y como todo usuario de FreeBSD siempre nos preguntamos y que opciones usamos cuando ejecutemos:

make install clean

Bien aqui pongo las que estoy usando:

Figura 2.

Bien una vez instalado vamos a la configuracion, la instalacion coloca 2 archivos por default en la ruta default: /usr/local/etc/, esto son:

-r--r--r-- 1 root wheel 13986 Mar 23 02:06 clamd.conf.default
-r--r--r-- 1 root wheel 7507 Mar 23 02:06 freshclam.conf.default

Solo compeanos cada a otro archivo sin la extension .default.

Freshclam

Clamav instala 2 servicios:

freshclam clamd.

El 1ro es el encargado de actualizar las firmas del antivirus, asi que este servidor cada cierto tiempo se estara conectado para bajar las firmas mas nuevas.

Su configuracion es la siguiente:

DatabaseDirectory /var/db/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogFileMaxSize 2M
LogTime yes
LogVerbose yes
LogSyslog yes
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups yes
DatabaseMirror db.us.clamav.net
DatabaseMirror database.clamav.net
MaxAttempts 5
NotifyClamd /usr/local/etc/clamd.conf

Crear el archivo log si no existe, los demas parametros y comentarios los deje tal cual estan.

El directorio donde se guardan los logs debe tener el siguiente permiso:

drwxr-xr-x 2 clamav clamav 1024 May 17 00:00 clamav

Ahora lo damos de alta en el rc.conf

clamav_freshclam_enable="YES"

Aqui ya lo tenemos listo para proibar.

Clamav

Este programa es el que se encarga de llevar la tarea sucia y revisar nuestros archivos de cosas malas.

Vamos mostrando la configuracion que estoy usando:

LogFile /var/log/clamav/clamd.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogVerbose yes
ExtendedDetectionInfo yes
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/db/clamav
LocalSocket /var/run/clamav/clamd.sock
FixStaleSocket yes
TCPAddr 192.168.40.5
StreamMaxLength 10M
MaxDirectoryRecursion 20
User clamav
AllowSupplementaryGroups yes
ScanMail yes

Todos los demas parametros los estoy dejando con sus valores por default, aqui solo muestro los que yo uso y eliminando comentarios, ademas tengo habilitado el verbose ya cuando termine de configurar todo lo voy a poner lo mas bajo posible.

FreeBSD crea el usuario y grupo de clamav, ya solo falta agregar el servicio a rc.conf:

clamav_clamd_enable="YES"

Ahora si vamos poniendo ambos en operacion, el1ro es el freshclam y lo ejecutamos a mano, este servicio usa el puerto 80 para bajar sus archivos, asi que su firewall debe permitirle salir por el puerto 80.

freshclam -v

freshclam -v
Current working dir is /var/db/clamav
Max retries == 5
ClamAV update process started at Tue May 17 22:51:02 2011
Using IPv6 aware code
Querying current.cvd.clamav.net
TTL: 422
Software version from DNS: 0.97
main.cvd version from DNS: 53
main.cvd is up to date (version: 53, sigs: 846214, f-level: 53, builder: sven)
daily.cvd version from DNS: 13086
daily.cld is up to date (version: 13086, sigs: 118614, f-level: 60, builder: guitar)
bytecode.cvd version from DNS: 143
bytecode.cld is up to date (version: 143, sigs: 40, f-level: 60, builder: edwin)

Ahora sigue clamd:

/usr/local/etc/rc.d/clamav-clamd start

Starting clamav_clamd.

Vemos el log:

Tue May 17 22:28:26 2011 -> +++ Started at Tue May 17 22:28:26 2011
Tue May 17 22:28:26 2011 -> clamd daemon 0.97 (OS: freebsd8.2, ARCH: i386, CPU: i386)
Tue May 17 22:28:26 2011 -> Running as user clamav (UID 106, GID 106)
Tue May 17 22:28:26 2011 -> Log file size limited to 2097152 bytes.
Tue May 17 22:28:26 2011 -> Reading databases from /var/db/clamav
Tue May 17 22:28:26 2011 -> Not loading PUA signatures.
Tue May 17 22:28:32 2011 -> Loaded 963507 signatures.
Tue May 17 22:28:34 2011 -> LOCAL: Unix socket file /var/run/clamav/clamd.sock
Tue May 17 22:28:34 2011 -> LOCAL: Setting connection queue length to 200
Tue May 17 22:28:34 2011 -> Limits: Global size limit set to 104857600 bytes.
Tue May 17 22:28:34 2011 -> Limits: File size limit set to 26214400 bytes.
Tue May 17 22:28:34 2011 -> Limits: Recursion level limit set to 16.
Tue May 17 22:28:34 2011 -> Limits: Files limit set to 10000.
Tue May 17 22:28:34 2011 -> Limits: Core-dump limit is 4294967295.
Tue May 17 22:28:34 2011 -> Archive support enabled.
Tue May 17 22:28:34 2011 -> Algorithmic detection enabled.
Tue May 17 22:28:34 2011 -> Portable Executable support enabled.
Tue May 17 22:28:34 2011 -> ELF support enabled.
Tue May 17 22:28:34 2011 -> Mail files support enabled.
Tue May 17 22:28:34 2011 -> OLE2 support enabled.
Tue May 17 22:28:34 2011 -> PDF support enabled.
Tue May 17 22:28:34 2011 -> HTML support enabled.
Tue May 17 22:28:34 2011 -> Self checking every 600 seconds.
Tue May 17 22:28:34 2011 -> Listening daemon: PID: 90556
Tue May 17 22:28:34 2011 -> MaxQueue set to: 100
Tue May 17 22:28:34 2011 -> Set stacksize to 1114112

Verificamos:

/usr/local/etc/rc.d/clamav-clamd status
clamav_clamd is running as pid 90556.

Vemos si esta el servicio arriba:

ps -ax | grep clam
90596 ?? IsJ 0:00.00 /usr/local/sbin/clamd

Probamos localmente:

clamscan /usr/local/etc/
/usr/local/etc/screenrc: OK
/usr/local/etc/pkgtools.status-pkg.sh: OK
/usr/local/etc/pkgtools.conf.sample: OK
/usr/local/etc/pkgtools.conf: OK
/usr/local/etc/rarfiles.lst: OK
/usr/local/etc/amavisd.conf-dist: OK
/usr/local/etc/amavisd.conf-sample: OK
/usr/local/etc/amavisd.conf-default: OK
/usr/local/etc/amavisd-custom.conf-dist: OK
/usr/local/etc/amavisd.conf: OK
/usr/local/etc/amavisd-custom.conf: OK
/usr/local/etc/clamd.conf.default: OK
/usr/local/etc/freshclam.conf.default: OK
/usr/local/etc/clamd.conf: OK
/usr/local/etc/freshclam.conf: OK
/usr/local/etc/policyd-weight.conf.sample: OK
/usr/local/etc/my.cnf: OK
/usr/local/etc/nss_ldap.conf.sample: OK
/usr/local/etc/nss_ldap.conf: OK
/usr/local/etc/ldap.conf.dist: OK
/usr/local/etc/policyd-weight.conf: OK
/usr/local/etc/ldap.conf: Symbolic link
/usr/local/etc/portaudit.conf.sample: OK

----------- SCAN SUMMARY -----------
Known viruses: 963507
Engine version: 0.97
Scanned directories: 1
Scanned files: 22
Infected files: 0
Data scanned: 0.59 MB
Data read: 0.33 MB (ratio 1.79:1)
Time: 8.726 sec (0 m 8 s)

Ahora si ejecutamos el demonio de freshclam:

/usr/local/etc/rc.d/clamav-freshclam restart
Starting clamav_freshclam.

Revisamos ambos servicios:

ps -ax | grep clam
90828 ?? IsJ 0:02.74 /usr/local/bin/freshclam --daemon -p /var/run/clamav/freshclam.pid
90850 ?? IsJ 0:00.00 /usr/local/sbin/clamd

Ahora los sockets:

sockstat -4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
clamav clamd 90850 3 tcp4 192.168.40.5:21989 192.168.40.4:389
clamav freshclam 90828 3 tcp4 192.168.40.5:31452 192.168.40.4:389

Como mi red depende de LDAP, aqui veo que ambos estan teniendo comunicacion eon mi servidor LDAP.

En la configuracion de freshclam viene una parte donde dice que una vez que actualice firmas debe informar a clamd sobre esto, sus logs van a mostrar algo asi:

Tue May 17 22:43:04 2011 -> Current working dir is /var/db/clamav
Tue May 17 22:43:04 2011 -> Max retries == 5
Tue May 17 22:43:04 2011 -> ClamAV update process started at Tue May 17 22:43:04 2011
Tue May 17 22:43:04 2011 -> Using IPv6 aware code
Tue May 17 22:43:04 2011 -> Querying current.cvd.clamav.net
Tue May 17 22:43:04 2011 -> TTL: 900
Tue May 17 22:43:04 2011 -> Software version from DNS: 0.97
Tue May 17 22:43:04 2011 -> main.cvd version from DNS: 53
Tue May 17 22:43:04 2011 -> main.cvd is up to date (version: 53, sigs: 846214, f-level: 53, builder: sven)
Tue May 17 22:43:04 2011 -> daily.cvd version from DNS: 13086
Tue May 17 22:43:04 2011 -> Retrieving http://db.us.clamav.net/daily-13086.cdiff
Tue May 17 22:43:04 2011 -> connect_error: getsockopt(SO_ERROR): fd=6 error=61: Connection refused
Tue May 17 22:43:04 2011 -> Can't connect to port 80 of host db.us.clamav.net (IP: 194.47.250.218)
Tue May 17 22:43:04 2011 -> Trying to download http://db.us.clamav.net/daily-13086.cdiff (IP: 168.143.19.95)
Tue May 17 22:43:04 2011 -> Downloading daily-13086.cdiff [100%]
Tue May 17 22:43:04 2011 -> cdiff_apply: Parsed 21 lines and executed 21 commands
Tue May 17 22:43:05 2011 -> Loading signatures from daily.cld
Tue May 17 22:43:05 2011 -> Properly loaded 118614 signatures from new daily.cld
Tue May 17 22:43:05 2011 -> daily.cld updated (version: 13086, sigs: 118614, f-level: 60, builder: guitar)
Tue May 17 22:43:05 2011 -> bytecode.cvd version from DNS: 143
Tue May 17 22:43:05 2011 -> bytecode.cld is up to date (version: 143, sigs: 40, f-level: 60, builder: edwin)
Tue May 17 22:43:08 2011 -> Database updated (964868 signatures) from db.us.clamav.net (IP: 168.143.19.95)
Tue May 17 22:43:08 2011 -> Clamd successfully notified about the update.

Y la configuracion tambien muestra cada cuanto se va a estar actualizando.

Parece que clamav esta listo para ser usado por amavisd.

SpamAssasin

Viene una pieza angular de este servidor, SA abreviado, es una aplicacion opensource que tiene mucho reconocimiento a nivel mundial, hasta empresas de renombre hacen uso de el.

Amavisd le llama a sa cuando empieza a recibir mensajes de Postfix, sa es un software de autoaprendizaje asi que conforme recibe mensajes va memorizando la comunicacion de cada usuario.

Su configuracion tiene varios achivos en:

/usr/local/etc/mail/spamassassin/

El principal es local.cf