Usando Linux para muchas cosas y disfrutando de videojuegos, en dispositivos moviles, consolas y pc. Using Linux for many things and enjoying video games, mobile devices, consoles and pc

Mostrando entradas con la etiqueta clamav. Mostrar todas las entradas
Mostrando entradas con la etiqueta clamav. Mostrar todas las entradas

Como instalar Clamav y usarlo en Linux paso a paso

DriveMeca instalando ClamAV y usandolo en Linux paso a paso
Nunca tendremos la certeza de si un archivo tiene o no virus y mas hoy en el día en que Internet, la red de redes, juega un papel importante en las comunicaciones diarias de todos. Uso Linux me dirás, muy bien, te felicito, pero aun nuestro OS favorito puede sufrir un ataque por un virus, troyano, etc y es en ese momento que tenemos que estar preparados para poder salir del problema sin inconvenientes. Como?, sencillo, usando Clamav, un popular antivirus multiplataforma (ya dije que es opensource?) el cual hoy te mostrare paso a paso como instalarlo y configurarlo en varias distribuciones Linux populares del momento. Para este tutorial en español he escogido Centos / RedHat y Ubuntu desktop / Ubuntu Server (para mis, las mas usadas en el ámbito empresarial) pero esto no quiere decir que la configuracion en otras no sea algo parecida.


Requerimientos para instalar Clamav

  • Linux Ubuntu Desktop o Linux Ubuntu server
  • Linux Centos 7.x o Linux RedHat 7.x
  • Conectividad a internet


Todos los comandos se ejecutaran desde una consola y debemos tener acceso a la cuenta root o privilegios de root independientemente de la distro que usemos

Instalamos Clamav en Centos / RedHat

-Instalamos el repositorio Epel
yum install epel-release

-Instalamos Clamav
yum install clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd

-Creeríamos que si están los rpms, clamav debería funcionar al instalarlo. No es asi, debemos hacer unos cambios. Primero copiamos el conf de clamd.conf a /etc/clamd.d (donde normalmente lo busca el daemon)
cp /usr/share/clamav/template/clamd.conf /etc/clamd.d/clamd.conf


Configuramos Clamd y Freshclam en Linux Ubuntu

-Editamos el conf, normalmente los valores por default son suficientes pero listare los importantes. Es buena practica verificarlos todos y si necesitamos habilitar o deshabilitar alguno, lo hagamos documentando que hicimos para mas adelante poder ver donde hay un posible error
vi /etc/clamd.d/clamd.conf
#Comentamos esta linea para poder ejecutarlo
#Example

LogFile /var/log/clamd
LogFileMaxSize 2M
LogTime yes
LogRotate yes
ExtendedDetectionInfo yes
#Usuario que ejecutara clamav
User clamscan
#Donde se creara el socket
LocalSocket /var/run/clamd.scan/clamd.sock
FixStaleSocket yes
SelfCheck 600

-Editamos el conf de freshclam, el servicio encargado de descargar las firmas de virus actualizadas para el uso de clamav
vi /etc/freshclam.conf
#
#Example
DatabaseDirectory /var/lib/clamav
UpdateLogFile /var/log/freshclam.log
LogFileMaxSize 2M
LogTime yes
LogRotate yes
DatabaseOwner clamupdate

-Cambiamos el dueño y grupo (owner y group) del conf para que pueda ser leído por el servicio
chown clamscan.clamscan /etc/freshclam.conf

-Verificamos que el archivo para ejecutar el servicio exista y tenga el siguiente contenido
vi /usr/lib/systemd/system/clam-freshclam.service
[Unit]
Description = freshclam scanner
After = network.target
[Service]
Type = forking
ExecStart = /usr/bin/freshclam -d -c 4
Restart = on-failure
PrivateTmp = true
[Install]
WantedBy=multi-user.target

-Activamos el servicio de freshclam (clam-freshclam) y lo iniciamos. Apenas se ejecuta, descargara las firmas de virus actualizadas a /var/lib/clamav
systemctl enable clam-freshclam
systemctl start clam-freshclam

-Verificamos el servicio este ejecutándose correctamente
systemctl status clam-freshclam
● clam-freshclam.service - freshclam scanner
   Loaded: loaded (/usr/lib/systemd/system/clam-freshclam.service; enabled; vendor preset: disabled)
   Active: active (running) since sáb 2016-07-30 19:33:41 COT; 43s ago
  Process: 17245 ExecStart=/usr/bin/freshclam -d -c 4 (code=exited, status=0/SUCCESS)
 Main PID: 17246 (freshclam)
   CGroup: /system.slice/clam-freshclam.service
           └─17246 /usr/bin/freshclam -d -c 4

jul 30 19:33:41 cen7.test.com systemd[1]: Starting freshclam scanner...
jul 30 19:33:41 cen7.test.com freshclam[17246]: freshclam daemon 0.99.2 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)
jul 30 19:33:41 cen7.test.com freshclam[17246]: ClamAV update process started at Sat Jul 30 19:33:41 2016
jul 30 19:33:41 cen7.test.com systemd[1]: Started freshclam scanner.
jul 30 19:33:41 cen7.test.com freshclam[17246]: main.cvd is up to date (version: 57, sigs: 4218790, f-level: 60, builder: amishhammer)
jul 30 19:34:09 cen7.test.com freshclam[17246]: getfile: daily-21724.cdiff not found on database.clamav.net (IP: 128.199.133.36)
jul 30 19:34:09 cen7.test.com freshclam[17246]: getpatch: Can't download daily-21724.cdiff from database.clamav.net

-Corregimos el archivo de ejecución del servicio clamd. En el rpm viene con .@ y no lo encontrara sino lo arreglamos
mv /usr/lib/systemd/system/clamd@.service /usr/lib/systemd/system/clamd.service

-Verificamos el archivo de ejecusion del servicio de clamd, debe contener lo siguiente
vi /usr/lib/systemd/system/clamd.service
[Unit]
Description = clamd scanner (%i) daemon
After = syslog.target nss-lookup.target network.target

[Service]
Type = simple
ExecStart = /usr/sbin/clamd -c /etc/clamd.d/clamd.conf --foreground=yes
Restart = on-failure
PrivateTmp = true

[Install]
WantedBy=multi-user.target

-Creamos un archivo para los logs de clamd y le damos permisos de clamscan (owner y group)
touch /var/log/clamd
chown clamscan.clamscan /var/log/clamd

-Activamos el servicio clamd y lo ejecutamos
systemctl enable clamd
systemctl start clamd

-Verificamos este ejecutandose correctamente
systemctl status clamd
● clamd.service - clamd scanner () daemon
   Loaded: loaded (/usr/lib/systemd/system/clamd.service; enabled; vendor preset: disabled)
   Active: active (running) since sáb 2016-07-30 19:51:45 COT; 4s ago
 Main PID: 17408 (clamd)
   CGroup: /system.slice/clamd.service
           └─17408 /usr/sbin/clamd -c /etc/clamd.d/clamd.conf --foreground=yes

jul 30 19:51:45 cen7.test.com systemd[1]: Started clamd scanner () daemon.
jul 30 19:51:45 cen7.test.com systemd[1]: Starting clamd scanner () daemon...
jul 30 19:51:45 cen7.test.com clamd[17408]: Received 0 file descriptor(s) from systemd.
jul 30 19:51:45 cen7.test.com clamd[17408]: clamd daemon 0.99.2 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)
jul 30 19:51:45 cen7.test.com clamd[17408]: Running as user clamscan (UID 995, GID 993)
jul 30 19:51:45 cen7.test.com clamd[17408]: Log file size limited to 2097152 bytes.
jul 30 19:51:45 cen7.test.com clamd[17408]: Reading databases from /var/lib/clamav
jul 30 19:51:45 cen7.test.com clamd[17408]: Not loading PUA signatures.
jul 30 19:51:45 cen7.test.com clamd[17408]: Bytecode: Security mode set to "TrustSigned".

-Es buena politica verificar logs para certificar que todo este ejecutandose correctamente. Comenzamos mirando el log de freshclam para estar seguros de que se descargaron las firmas de virus
cat /var/log/freshclam.log
Sat Jul 30 19:33:41 2016 -> --------------------------------------
Sat Jul 30 19:33:41 2016 -> freshclam daemon 0.99.2 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)
Sat Jul 30 19:33:41 2016 -> ClamAV update process started at Sat Jul 30 19:33:41 2016
Sat Jul 30 19:33:41 2016 -> main.cvd is up to date (version: 57, sigs: 4218790, f-level: 60, builder: amishhammer)
Sat Jul 30 19:34:09 2016 -> WARNING: getfile: daily-21724.cdiff not found on database.clamav.net (IP: 128.199.133.36)
Sat Jul 30 19:34:09 2016 -> WARNING: getpatch: Can't download daily-21724.cdiff from database.clamav.net
Sat Jul 30 19:34:40 2016 -> nonblock_connect: connect timing out (30 secs)
Sat Jul 30 19:34:40 2016 -> Can't connect to port 80 of host database.clamav.net (IP: 104.131.196.175)
Sat Jul 30 19:34:40 2016 -> Trying host database.clamav.net (69.12.162.28)...
Sat Jul 30 19:34:40 2016 -> WARNING: getfile: daily-21724.cdiff not found on database.clamav.net (IP: 69.12.162.28)
Sat Jul 30 19:34:40 2016 -> WARNING: getpatch: Can't download daily-21724.cdiff from database.clamav.net
Sat Jul 30 19:34:40 2016 -> Trying host database.clamav.net (64.22.33.90)...
Sat Jul 30 19:34:41 2016 -> WARNING: getfile: daily-21724.cdiff not found on database.clamav.net (IP: 64.22.33.90)
Sat Jul 30 19:34:41 2016 -> WARNING: getpatch: Can't download daily-21724.cdiff from database.clamav.net
Sat Jul 30 19:34:41 2016 -> WARNING: Incremental update failed, trying to download daily.cvd
Sat Jul 30 19:34:59 2016 -> Downloading daily.cvd [100%]
Sat Jul 30 19:35:00 2016 -> daily.cvd updated (version: 21999, sigs: 468291, f-level: 63, builder: neo)
Sat Jul 30 19:35:01 2016 -> Downloading bytecode-279.cdiff [100%]
Sat Jul 30 19:35:01 2016 -> Downloading bytecode-280.cdiff [100%]
Sat Jul 30 19:35:02 2016 -> Downloading bytecode-281.cdiff [100%]
Sat Jul 30 19:35:02 201apt-get install clamav-daemon6 -> Downloading bytecode-282.cdiff [100%]
Sat Jul 30 19:35:03 2016 -> Downloading bytecode-283.cdiff [100%]
Sat Jul 30 19:35:03 2016 -> bytecode.cld updated (version: 283, sigs: 53, f-level: 63, builder: neo)
Sat Jul 30 19:35:07 2016 -> Database updated (4687134 signatures) from database.clamav.net (IP: 194.8.197.22)
Sat Jul 30 19:35:07 2016 -> --------------------------------------

-Miramos el contenido del log de clamd
cat /var/log/clamd 
Sat Jul 30 19:53:34 2016 -> +++ Started at Sat Jul 30 19:53:34 2016
Sat Jul 30 19:53:34 2016 -> Received 0 file descriptor(s) from systemd.
Sat Jul 30 19:53:34 2016 -> clamd daemon 0.99.2 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)
Sat Jul 30 19:53:34 2016 -> Running as user clamscan (UID 995, GID 993)
Sat Jul 30 19:53:34 2016 -> Log file size limited to 2097152 bytes.
Sat Jul 30 19:53:34 2016 -> Reading databases from /var/lib/clamav
Sat Jul 30 19:53:34 2016 -> Not loading PUA signatures.
Sat Jul 30 19:53:34 2016 -> Bytecode: Security mode set to "TrustSigned".


Instalamos Clamav en Linux Ubuntu server o Linux Ubuntu Desktop

-Abrimos una consola e instalamos clamav
sudo apt install clamav-daemon


Instalamos Clamav en Linux Ubuntu

-Verificamos la configuracion de freshclam. Los defaults por lo general funcionaran muy bien
sudo vi /etc/clamav/freshclam.conf

-Descargamos por primera vez las firmas de virus usadas por clamav. Sin las firmas, clamav no ejecutara y mostrara un error comentandolo
sudo freshclam
ClamAV update process started at Mon Aug  1 12:42:01 2016
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.99 Recommended version: 0.99.2
DON'T PANIC! Read http://www.clamav.net/support/faq
Downloading main.cvd [100%]
main.cvd updated (version: 57, sigs: 4218790, f-level: 60, builder: amishhammer)
Downloading daily.cvd [100%]
daily.cvd updated (version: 22009, sigs: 473001, f-level: 63, builder: neo)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 283, sigs: 53, f-level: 63, builder: neo)
Database updated (4691844 signatures) from db.local.clamav.net (IP: 200.236.31.1)
WARNING: Clamd was NOT notified: Can't connect to clamd through /var/run/clamav/clamd.ctl: No such file or directory

-Verificamos ya tengamos las firmas de virus descargadas
ls -la /var/lib/clamav/
total 117696
drwxr-xr-x  2 clamav clamav      4096 ago  1 12:45 .
drwxr-xr-x 41 root   root        4096 ago  1 11:48 ..
-rw-r--r--  1 clamav clamav     86357 ago  1 12:45 bytecode.cvd
-rw-r--r--  1 clamav clamav  11265457 ago  1 12:44 daily.cvd
-rw-r--r--  1 clamav clamav 109143933 ago  1 12:44 main.cvd
-rw-------  1 clamav clamav       260 ago  1 12:45 mirrors.dat

-Activamos el servicio de freshclam (clamav-freshclam) y lo ejecutamos
sudo systemctl enable clamav-freshclam
sudo systemctl start clamav-freshclam

-Verificamos se este ejecutando servicio de freshclam
sudo systemctl status clamav-freshclam
● clamav-freshclam.service - ClamAV virus database updater
   Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled; vendor
   Active: active (running) since lun 2016-08-01 12:23:05 COT; 16s ago
     Docs: man:freshclam(1)
           man:freshclam.conf(5)
           http://www.clamav.net/lang/en/doc/
 Main PID: 4424 (freshclam)
    Tasks: 1
   Memory: 4.7M
      CPU: 246ms
   CGroup: /system.slice/clamav-freshclam.service
           └─4424 /usr/bin/freshclam -d --foreground=true

ago 01 12:23:05 ubuser systemd[1]: Started ClamAV virus database updater.
ago 01 12:23:05 ubuser freshclam[4424]: ClamAV update process started at Mon Aug
ago 01 12:23:05 ubuser freshclam[4424]: WARNING: Your ClamAV installation is OUT
ago 01 12:23:05 ubuser freshclam[4424]: WARNING: Local version: 0.99 Recommended
ago 01 12:23:05 ubuser freshclam[4424]: DON'T PANIC! Read http://www.clamav.net/

-Activamos y ejecutamos el servicio de clamav (clamav-daemon)
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon

-Verificamos se este ejecutandose el servicio
sudo systemctl status clamav-daemon
● clamav-daemon.service - Clam AntiVirus userspace daemon
   Loaded: loaded (/lib/systemd/system/clamav-daemon.service; enabled; vendor pr
   Active: active (running) since lun 2016-08-01 12:46:38 COT; 4s ago
     Docs: man:clamd(8)
           man:clamd.conf(5)
           http://www.clamav.net/lang/en/doc/
 Main PID: 4630 (clamd)
    Tasks: 1
   Memory: 244.2M
      CPU: 4.400s
   CGroup: /system.slice/clamav-daemon.service
           └─4630 /usr/sbin/clamd --foreground=true

ago 01 12:46:38 ubuser systemd[1]: Started Clam AntiVirus userspace daemon.

-Como buena politica miramos logs, en este caso el de clamav para verificar si hay errores o no se pudo cargar algun modulo
cat /var/log/clamav/clamav.log
Mon Aug  1 12:46:39 2016 -> +++ Started at Mon Aug  1 12:46:39 2016
Mon Aug  1 12:46:39 2016 -> Received 1 file descriptor(s) from systemd.
Mon Aug  1 12:46:39 2016 -> clamd daemon 0.99 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)
Mon Aug  1 12:46:39 2016 -> Running as user clamav (UID 111, GID 117)
Mon Aug  1 12:46:39 2016 -> Log file size limited to 4294967295bytes.
Mon Aug  1 12:46:39 2016 -> Reading databases from /var/lib/clamav
Mon Aug  1 12:46:39 2016 -> Not loading PUA signatures.
Mon Aug  1 12:46:39 2016 -> Bytecode: Security mode set to "TrustSigned".
Mon Aug  1 12:46:45 2016 -> Loaded 4686446 signatures.
Mon Aug  1 12:46:47 2016 -> TCP: No tcp AF_INET/AF_INET6 SOCK_STREAM socket received from systemd.
Mon Aug  1 12:46:47 2016 -> LOCAL: Received AF_UNIX SOCK_STREAM socket from systemd.
Mon Aug  1 12:46:47 2016 -> Limits: Global size limit set to 104857600 bytes.
Mon Aug  1 12:46:47 2016 -> Limits: File size limit set to 26214400 bytes.
Mon Aug  1 12:46:47 2016 -> Limits: Recursion level limit set to 16.
Mon Aug  1 12:46:47 2016 -> Limits: Files limit set to 10000.
Mon Aug  1 12:46:47 2016 -> Limits: MaxEmbeddedPE limit set to 10485760 bytes.
Mon Aug  1 12:46:47 2016 -> Limits: MaxHTMLNormalize limit set to 10485760 bytes.
Mon Aug  1 12:46:47 2016 -> Limits: MaxHTMLNoTags limit set to 2097152 bytes.
Mon Aug  1 12:46:47 2016 -> Limits: MaxScriptNormalize limit set to 5242880 bytes.
Mon Aug  1 12:46:47 2016 -> Limits: MaxZipTypeRcg limit set to 1048576 bytes.
Mon Aug  1 12:46:47 2016 -> Limits: MaxPartitions limit set to 50.
Mon Aug  1 12:46:47 2016 -> Limits: MaxIconsPE limit set to 100.
Mon Aug  1 12:46:47 2016 -> Limits: PCREMatchLimit limit set to 10000.
Mon Aug  1 12:46:47 2016 -> Limits: PCRERecMatchLimit limit set to 5000.
Mon Aug  1 12:46:47 2016 -> Limits: PCREMaxFileSize limit set to 26214400.
Mon Aug  1 12:46:47 2016 -> Archive support enabled.
Mon Aug  1 12:46:47 2016 -> Algorithmic detection enabled.
Mon Aug  1 12:46:47 2016 -> Portable Executable support enabled.
Mon Aug  1 12:46:47 2016 -> ELF support enabled.
Mon Aug  1 12:46:47 2016 -> Mail files support enabled.
Mon Aug  1 12:46:47 2016 -> OLE2 support enabled.
Mon Aug  1 12:46:47 2016 -> PDF support enabled.
Mon Aug  1 12:46:47 2016 -> SWF support enabled.
Mon Aug  1 12:46:47 2016 -> HTML support enabled.
Mon Aug  1 12:46:47 2016 -> Self checking every 3600 seconds.


Usando Clamav en Linux Ubuntu de forma gráfica

-Aunque en la mayoría de los casos usaremos clamav desde linea de comandos, hay ocasiones en que lo instalaremos en nuestra estación de trabajo o en un Linux Ubuntu Server con interfaz gráfica. Para estas oportunidades es que podemos usar clamtk. Lo instalamos desde linea de comandos
sudo apt install clamtk clamtk-nautilus

-Después de instalado podemos ejecutarlo, ya sea desde linea de comandos (sudo clamtk), Unity o desde el menú de MATE como en la siguiente imagen podrás ver
DriveMeca instalando ClamAV y usandolo en Linux paso a paso

-La ventana principal de Clamtk muestra todas las opciones (o inicio de opciones) en un único lugar. Lo primero que debemos hacer es verificar su configuracion dando click al botón Configuración
DriveMeca instalando ClamAV y usandolo en Linux paso a paso

-En Configuración veremos varias opciones, unas con valores por default y otras que podemos activar. Regresamos a la ventana principal dando click al botón Back
DriveMeca instalando ClamAV y usandolo en Linux paso a paso

-En la parte inferior de la ventana principal veremos en la sección Análisis los botones para hacer una búsqueda de virus. En este ejemplo doy click al botón Analizar una carpeta, elegimos y se ejecuta. Al final debe salir una ventana diciéndonos que termino y no se encontraron amenazas (virus)
DriveMeca instalando ClamAV y usandolo en Linux paso a paso


Usando Clamav desde linea de comandos en Linux (cualquier distribución)

-A veces necesitamos un rápido chequeo y no esperar a que nuestro servicio detecte un problema. Para esto podemos ejecutar desde linea de comandos clamscan y pasarle el directorio a verificar como parámetro. Una forma rápida y conveniente de verificar archivos en una carpeta Linux
clamscan -v Documentos/
..
..
Scanning Documentos/Guane.docx
Documentos/Guane.docx: OK

----------- SCAN SUMMARY -----------
Known viruses: 4686446
Engine version: 0.99
Scanned directories: 1
Scanned files: 55
Infected files: 0
Data scanned: 306.31 MB
Data read: 527.63 MB (ratio 0.58:1)
Time: 31.175 sec (0 m 31 s)

Verificando versión de Clamav

-Abrimos una consola y ejecutamos
clamscan -V
ClamAV 0.99/22010/Mon Aug  1 14:12:44 2016

Artículos recomendadosVerificando si una ip publica esta reportada por spam
                                            Como bloquear una ip o email en postfix
                                            Como instalar Linux Centos 7 paso a paso
                                            Configurando servicios en Linux Centos / RedHat
                                            Como instalar y configurar Ubuntu Server 16.04 LTS paso a paso
                                            Como instalar interfaz grafica en Ubuntu server paso a paso


Ahora ya estas mas protegido de virus, troyanos y otras amenazas en Linux Ubuntu / Linux Ubuntu Server / Linux Centos 7.x y Linux RedHat 7.x con este tutorial de ClamAV español. Te gusto el articulo? hazme un favor, compártelo en tus redes sociales (compartir es sexy). Escríbeme en los comentarios aquí debajo y pasa la voz compartiendo el tweet.

Sígueme en twitter google+facebook o email y podrás estar enterado de todas mis publicaciones.
Disfrútenlo.

Share/Bookmark

Fortalece tu servidor de email Linux con Amavisd-new

El email ha pasado a ser el reemplazo del fax y muchas comunicaciones entre nosotros. Nos sirve para envió de trabajos, comunicarnos con la familia, etc. Para que esto funcione debe haber una serie de servidores haciendo tareas, uno de ellos que es vital es el servidor de email manejando mínimo 2 protocolos que son SMTP y POP3. Hoy veremos una forma relativamente sencilla de instalar y configurar paso a paso Amavisd-new, una aplicación que actúa en forma de filtro entre el MTA y los antivirus/antispam, en un servidor Linux Centos 7.

-Instalamos dependencias
yum -y install wget perl-CPAN gcc gcc-c++ make perl-Time-HiRes perl-Mail-SPF perl-Net-LibIDN openssl-devel gzip bzip2 pax cpio lzop mariadb mariadb-server mailx

-Iniciamos MariaDB y lo activamos para que ejecute cuando hagamos boot
systemctl start  mariadb.service
systemctl enable mariadb.service

-Aseguramos su configuracion
mysql_secure_installation

-Descargamos la ultima version disponible de amavisd
wget -c http://www.ijs.si/software/amavisd/amavisd-new-2.10.1.tar.xz

-Instalamos los siguientes módulos de perl. No tienes perl instalado. En este articulo te enseño como.
Archive::Zip
Compress::Zlib
Compress::Raw::Zlib
MIME::Base64
MIME::Parser
Mail::Internet
Net::Server
Digest::MD5
Time::HiRes
Unix::Syslog
Crypt::OpenSSL::RSA
Mail::DKIM
HTML::Parser
NetAddr::IP
Digest::SHA1
DB_File
Mail::SPF::Test
Geo::IP
Mail::SpamAssassin::Plugin::Razor2
IO::Socket::IP
IO::Socket::INET6
IO::Socket::SSL
DBI
LWP::UserAgent
Encode::Detect
Net::Patricia
Mail::SpamAssassin
DBD::mysql
IO::Stringy
Convert::BinHex
BerkeleyDB
Unix::Getrusage
Razor2::Client::Agent
Image::Info
Image::Info::GIF
Image::Info::JPEG
Image::Info::PNG
Image::Info::BMP
Image::Info::TIFF
Sys::Syslog

-Instalamos Clamav y lo activamos como explico en este articulo

-Creamos el directorio home de Amavis al crear su cuenta y grupo
adduser -b /var -m amavis

-Creamos el arbol de directorios de amavis y activamos sus permisos
mkdir /var/amavis/tmp /var/amavis/var /var/amavis/db /var/amavis/home
chown -R amavis:amavis /var/amavis
chmod -R 770 /var/amavis

-Descomprimimos el archivo de amavis y entramos al directorio
tar xf amavisd-new-2.10.1.tar.xz
cd amavisd-new-2.10.1

-Copiamos el script de amavis y cambiamos sus permisos
cp amavisd /usr/local/sbin/
chown root /usr/local/sbin/amavisd
chmod 755  /usr/local/sbin/amavisd

-Copiamos la configuracion a etc y cambiamos sus permisos
cp amavisd.conf /etc/
chown root:amavis /etc/amavisd.conf
chmod 640 /etc/amavisd.conf

-Creamos un directorio para los mails con virus que clamd vaya encontrando y activamos sus permisos
mkdir /var/virusmails
chown amavis:amavis /var/virusmails
chmod 750 /var/virusmails

-Modificamos la configuración de amavis. Por la gran cantidad de opciones, solo mostrare las que deberíamos cambiar. Las demás pueden quedar con sus valores por default
vi /etc/amavisd.conf
$daemon_user  = 'amavis';
$daemon_group = 'amavis';
$mydomain = 'example.com';
$MYHOME = '/var/amavis';
$TEMPBASE = "$MYHOME/tmp";
$QUARANTINEDIR = '/var/virusmails';
$db_home   = "$MYHOME/db";
$helpers_home = "$MYHOME/var";
$lock_file = "$MYHOME/var/amavisd.lock";
$pid_file  = "$MYHOME/var/amavisd.pid";
$myhostname = 'servidor.test.com';

$inet_socket_port = 10024;

$log_level = 5; #Mientras hacemos pruebas de que todo esta ok, después cambiar a valor 0

$sa_tag_level_deflt  = 2.0;
$sa_tag2_level_deflt = 6.2;
$sa_kill_level_deflt = 6.9;
$sa_dsn_cutoff_level = 10;
$sa_crediblefrom_dsn_cutoff_level = 18;

$sa_mail_body_size_limit = 400*1024;
$sa_spam_subject_tag = '***Spam*** ';

$notify_method  = 'smtp:[127.0.0.1]:10025';
$forward_method = 'smtp:[127.0.0.1]:10025';

@av_scanners = (
['ClamAV-clamd',
   \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.sock"],
   qr/\bOK$/m, qr/\bFOUND$/m,
   qr/^.*?: (?!Infected Archive)(.*) FOUND$/m ],
);

-Agregamos amavis al grupo clamav
usermod -a -G clamav amavis

-Editamos la configuracion de clamav y permitimos grupos suplementarios, así puede interactuar con amavis
vi /etc/clamd.conf
..
..
AllowSupplementaryGroups yes

-Verificamos
id clamav
uid=997(clamav) gid=995(clamav) groups=995(clamav),1001(amavis)

Spamassassin

-Instalamos spamassassin
yum install spamassassin

-Modificamos su configuración. Un puntaje mayor de 5 sera marcado spam
vi /etc/mail/spamassassin/local.cf
rewrite_header Subject *****SPAM*****
report_safe 0
required_score 5.0

-Nos creamos una cuenta y grupo para spamd. Activamos sus permisos
groupadd spamd
useradd -g spamd -s /bin/false -d /var/log/spamassassin spamd
chown spamd:spamd /var/log/spamassassin

-Actualizamos las reglas de spamassassin
/usr/local/bin/sa-update

-Ejecutamos amavis en modo debug buscando algún modulo que nos falte o error que debamos corregir antes de entrar en producción
/usr/local/sbin/amavisd debug

Postfix

-Instalamos Postfix. No sabes como configurarlo? En este articulo te muestro como

-Agregamos a main.cf de postfix
vi /etc/postfix/main.cf
strict_rfc821_envelopes = yes
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

-Ejecutamos. Apenas todo este funcionando correctamente, debemos devolverlo a no
postconf -e "soft_bounce = yes"
systemctl reload  postfix.service

-Modificamos
vi /etc/postfix/master.cf
amavisfeed unix    -       -       n        -      2     lmtp
     -o lmtp_data_done_timeout=1200
     -o lmtp_send_xforward_command=yes
     -o lmtp_tls_note_starttls_offer=no

127.0.0.1:10025 inet n    -       n       -       -     smtpd
     -o content_filter=
     -o smtpd_delay_reject=no
     -o smtpd_client_restrictions=permit_mynetworks,reject
     -o smtpd_helo_restrictions=
     -o smtpd_sender_restrictions=
     -o smtpd_recipient_restrictions=permit_mynetworks,reject
     -o smtpd_data_restrictions=reject_unauth_pipelining
     -o smtpd_end_of_data_restrictions=
     -o smtpd_restriction_classes=
     -o mynetworks=127.0.0.0/8
     -o smtpd_error_sleep_time=0
     -o smtpd_soft_error_limit=1001
     -o smtpd_hard_error_limit=1000
     -o smtpd_client_connection_count_limit=0
     -o smtpd_client_connection_rate_limit=0
     -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
     -o local_header_rewrite_clients=
     -o smtpd_milters=
     -o local_recipient_maps=
     -o relay_recipient_maps=

-Reiniciamos postfix y verificamos no de error. Aun no se esta filtrando
systemctl reload  postfix.service
less /var/log/maillog

Pruebas de configuración

-Hacemos tres pruebas. Primera: Verificamos amavis
/usr/local/sbin/amavisd debug

telnet localhost 10024
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 [::1] ESMTP amavisd-new service ready
EHLO localhost
250-[::1]
250-VRFY
250-PIPELINING
250-SIZE
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-SMTPUTF8
250-DSN
250 XFORWARD NAME ADDR PORT PROTO HELO IDENT SOURCE
quit
221 2.0.0 [::1] amavisd-new closing transmission channel
Connection closed by foreign host.

Funciono como el ejemplo arriba?, No? verifica si el daemon de amavis esta ejecutandose? El puerto es el correcto?

-Segunda prueba: Verificamos postfix
telnet 127.0.0.1 10025
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 veser7.mecatienda.com ESMTP Postfix
EHLO localhost
250-veser7.mecatienda.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.

Fallo la prueba? Verifica que postfix se este ejecutando. Mira los logs en maillog. La ip y el port son los correctos? Tienes el firewall activo y esta bloqueando esta conexión?

-Tercera prueba: Verificamos el transporte, es decir, amavis filtra un email, lo verifica y se lo pasa a postfix para su entrega final. Usaremos el mail de ejemplo test-messages/sample-nonspam.txt dentro del directorio de amavis. Primero descomprimimos los mails de prueba
cd /root/amavisd-new-2.10.1/test-messages
perl -pe 's/./chr(ord($&)^255)/sge' <sample.tar.gz.compl | zcat | tar xvf -

-Ejecutamos
telnet localhost 10024
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 [::1] ESMTP amavisd-new service ready
HELO localhost
250 [::1]
MAIL FROM: <>
250 2.1.0 Sender <> OK
RCPT TO: <postmaster>
250 2.1.5 Recipient <postmaster> OK
DATA
354 End data with <CR><LF>.<CR><LF>
From: virus-tester
 To: undisclosed-recipients:;
 Subject: amavisd test - simple - no spam test pattern

 This is a simple test message from the amavisd-new test-messages.
.
250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 466C3CD319
quit
221 2.0.0 [::1] amavisd-new closing transmission channel

Fallo la prueba? Verifica logs en maillog y en los msg que arroja amavis en modo debug

-Si todo esta ok, agregamos a postfix
vi /etc/postfix/main.cf
strict_rfc821_envelopes = yes
soft_bounce = no
content_filter=amavisfeed:[127.0.0.1]:10024

-Modificamos amavisd.conf dejando logs a su nivel mínimo
vi /etc/amavisd.conf
$log_level = 0;

-Optimizacion: En la medida que nuestro servidor aumente su carga de emails pro procesar podemos ir aumentando la cantidad de procesos a ejecutar. No existe un numero mágico, es cuestión de observar la carga y así mismo decidir si aumentar los procesos o dejarlos como están. Recuerda, muchos procesos no quiere decir que así de rápido funcionara todo, mas bien si se acaban los recursos y colocas mas procesos harás que el servidor aumente su carga volviéndose mas lento.

-Copiamos el script de inicio al directorio init.d y modificamos la ruta donde debe ejecutarlo
cp /root/amavisd-new-2.10.1/amavisd_init.sh /etc/init.d/amavisd
vi /etc/init.d/amavisd
prog="/usr/local/sbin/amavisd"

-Cambiamos sus permisos, reiniciamos los servicios de amavisd y postfix y los activamos para ejecución al hacer boot
chmod 755 /etc/init.d/amavisd
systemctl restart  amavisd.service
systemctl enable amavisd.service

systemctl restart  postfix.service
systemctl enable postfix.service

Bien, con estos últimos pasos ya tenemos un servidor de email protegido contra virus y spam el cual puede ir creciendo con nuestros requerimientos, por ejemplo, ser multidominio, lo cual dejamos para otro articulo.
Conocías Amavisd-new? Lo usas, que tal te ha parecido? Usas otra alternativa parecida, cual?
Si te resulto útil este articulo, se social, haz un tweet, compártelo con otros por medio de los botones o sígueme en twitter google+facebook o email y podrás estar enterado de todas mis publicaciones.
Disfrútenlo.

Share/Bookmark

Como instalar Clamav en Linux Centos paso a paso

Usas Linux y crees que no estas expuesto a virus? En cierta forma no es verdad, aunque nada que ver con las escandalosas cifras de cantidad de virus para Microsoft Windows para Linux también existen virus. Estos virus siguiendo unas políticas de seguridad como por ejemplo no trabajar desde la cuenta root todo el tiempo, en lo posible usar sudo cuando necesitemos privilegios o usar un antivirus como Clamav. Como ya habras adivinado, el articulo de hoy es como instalar paso a paso Clamav en un servidor Linux Centos 7 (el mismo procedimiento serviría para un Linux RedHat 7).
Clamav es un antivirus opensource que lleva años en su misión de eliminar virus, troyanos, gusanos, etc. de una forma optima y que ademas de en Linux también lo puedes usar en Microsoft Windows aunque eso se sale de nuestro tema. Comencemos entonces.

Requerimientos



-Creamos un archivo de configuración de repositorio
vi /etc/yum.repos.d/dag.repo
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag/
gpgcheck=1
gpgkey=http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
enabled=1

-Instalamos clamd
yum install clamd

-Aceptamos la llave cuando se nos pregunte
Retrieving key from http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
Importing GPG key 0x6B8D79E6:
 Userid     : "Dag Wieers (Dag Apt Repository v1.0) <dag@wieers.com>"
 Fingerprint: ebc6 e12c 62b1 c734 026b 2122 a20e 5214 6b8d 79e6
 From       : http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
Is this ok [y/N]: y

-Para evitar problemas después de un boot del servidor
mkdir /var/run/clamav/
chown -R clamav:clamav /var/run/clamav/

-Iniciamos el servicio y lo activamos para su ejecución cada vez que hagamos boot
systemctl start  clamd.service
systemctl enable clamd.service

-Actualizamos firmas de virus
freshclam

Y con esto ya tenemos nuestro antivirus en un servidor Linux Centos 7. En próximos artículos lo integraremos con otras soluciones. Usas antivirus en Linux? Cual? No lo usas, porque?
Si te resulto útil este articulo, se social, haz un tweet, compártelo con otros por medio de los botones o sígueme en twitter google+facebook o email y podrás estar enterado de todas mis publicaciones.
Disfrútenlo.

Share/Bookmark

Como actualizar clamav en tu email server

Si te guiaste por mis anteriores artículos de instalar un servidor de email, versión 1 y versión 2, (esta ultima, basada en un cluster MySQL para soportar un mayor flujo de emails y poder consultar MailWatch independientemente el tamaño de la db rápidamente) debes tener como antivirus clamav. Hoy les mostrare como actualizar la versión a la mas moderna al día hoy.

-Descargamos la ultima version disponible. Continuamos la politica de los anteriores articulos, los paquetes a instalar los dejamos en el directorio downloads

cd /home/vmail/downloads
mv install-Clam-SA-latest.tar.gz install-Clam-0.96-SA-3.3.0.tar.gz
wget -c http://mailscanner.info/files/4/install-Clam-SA-latest.tar.gz

-Actualizamos. Tener especial cuidado en no dejar de colocar el . (punto) antes del script install

tar xzvf install-Clam-SA-latest.tar.gz
cd  install-Clam-0.96.5-SA-3.3.1
./install.sh

-Al terminar verificamos versiones.
clamscan -V
ClamAV 0.96.5/13513/Tue Aug 30 14:02:20 2011

rpm -q spamassassin
spamassassin-3.2.5-1.el5

Con esto quedamos actualizados de antivirus y antispam. No esta de mas verificar que todo este funcionando como debe ser

tail -f /var/log/maillog

Share/Bookmark

Email server, ver 2.0

En estos días requiero de un par de nuevos servidores de email para colocarlos en cluster pasivo-activo, por ello recupero mi anterior articulo y hoy haré una versión 2 actualizada y con la db en cluster.
Para esto utilizaremos Centos 5.4 actualizado y todos los comandos se realizaran desde la cuenta root. En mi caso utilizare servidores virtuales Openvz con Centos 5.4

MTA postfix
PostfixAdmin 2.3
MailScanner 4.80.1-1
MailWatch 1.0.5
Antivirus clamav 0.95
spamassassin 3.3.0
MySQL 5.0 Cluster

email server: 192.168.0.18
MySQL Cluster SQL: 192.168.0.22

-Instalamos webmin

cd /root
wget -c http://downloads.sourceforge.net/project/webadmin/webmin/1.510/webmin-1.510-1.noarch.rpm


rpm -vi webmin-1.510-1.noarch.rpm

-Instalamos herramientas para modificar y actualizar su zona horaria y fecha

yum install system-config-date mingetty ethtool
-Verificamos que el firewall este deshabilitado por el momento

iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

-Deshabilitamos SELinux

vi /etc/selinux/config

SELINUX=disabled

-Salvamos los cambios y salimos. Instalamos software que nos hará falta mas tarde

yum install fetchmail wget bzip2 unzip zip nmap openssl lynx fileutils gcc gcc-c++ bind-utils

-Descargamos e instalamos ncftp

wget -c ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/ncftp-3.2.1-1.el5.kb.i386.rpm

rpm -vi ncftp-3.2.1-1.el5.kb.i386.rpm

-Mas software necesitado

yum install rpm-build pcre-devel

-Instalamos Cyrus para la encriptacion en la autenticacion

yum install cyrus-sasl-sql cyrus-sasl-devel

-Eliminamos un paquete de Cyrus que no necesitaremos

yum remove cyrus-sasl-gssapi

-Agregamos el repositorio dag para contar con paquetes que no están en los de centos. Desabilitado para que no se actualice algo que no queremos

vi /etc/yum.repos.d/dag.repo

[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
enabled=0

-Descargamos postfix con soporte para mysql. Podemos buscar la ultima versión en http://rpm.pbone.net/ y descargar la versión dependiendo de nuestra versión de centos

wget -c ftp://mirror.switch.ch/pool/3/mirror/centos/5.4/centosplus/i386/RPMS/postfix-2.3.3-2.el5.centos.mysql_pgsql.i386.rpm


-Instalamos postgresql debido a dependencia con el rpm de postfix

yum install postgresql
rpm -vi postfix-2.3.3-2.el5.centos.mysql_pgsql.i386.rpm

-Instalamos libtool por dependencia con courier

yum install libtool-ltdl-devel

-Creamos un usuario y grupo bajo el cual ejecutara Courier

groupadd vmail -g 1001
useradd vmail -u 1001 -g 1001

-Agregamos este usuario al file sudoers. Entre columnas damos un TAB

visudo
vmail     ALL=(ALL)       NOPASSWD: ALL


apache  ALL=(ALL)       NOPASSWD: ALL


-Comentamos la siguiente linea

Defaults requiretty

-Agregamos apache al grupo vmail

usermod -G vmail apache

-Le colocamos password a la cuenta vmail

passwd vmail

-Cambiamos a esta cuenta para instalar unos paquetes desde ella. El password que nos pide es el de la cuenta vmail, al tratar de instalar con el sudo

su vmail
sudo yum install libtool postgresql-devel gdbm-devel pam-devel expect openldap-devel redhat-rpm-config libidn-devel

-Creamos un árbol de directorios para compilar algunos rpm que necesitaremos

mkdir $HOME/rpm
mkdir $HOME/rpm/SOURCES
mkdir $HOME/rpm/SPECS
mkdir $HOME/rpm/BUILD
mkdir $HOME/rpm/SRPMS
mkdir $HOME/rpm/RPMS
mkdir $HOME/rpm/RPMS/i386
echo "%_topdir $HOME/rpm" >> $HOME/.rpmmacros

-Creamos un directorio para las descargas

mkdir $HOME/downloads; cd $HOME/downloads

-Descargamos los paquetes de Courier

wget -c http://downloads.sourceforge.net/project/courier/authlib/0.63.0/courier-authlib-0.63.0.tar.bz2
wget -c http://downloads.sourceforge.net/project/courier/imap/4.7.0/courier-imap-4.7.0.tar.bz2
wget -c http://downloads.sourceforge.net/project/courier/maildrop/2.4.3/maildrop-2.4.3.tar.bz2

-Courier nos permite validar conexiones por postgresql, mysql, LDAP, etc antes que solo /etc/passwd. Pasamos a compilarlo

sudo rpmbuild -ta courier-authlib-0.63.0.tar.bz2

-Instalamos los siguientes rpm generados

cd $HOME/rpm/RPMS/i386/
sudo rpm --install courier-authlib-0.63.0-1.i386.rpm
sudo rpm --install courier-authlib-devel-0.63.0-1.i386.rpm
sudo rpm --install courier-authlib-mysql-0.63.0-1.i386.rpm


-Colocamos acceso total a los directorios bajo rpm para compilar courier-imap server

sudo chmod -R 777 $HOME/rpm/RPMS/
cd $HOME/downloads
rpmbuild -ta courier-imap-4.7.0.tar.bz2
cd $HOME/rpm/RPMS/i386/
sudo rpm --install courier-imap-4.7.0-1.i386.rpm

-Compilamos maildrop que nos permitirá filtrar mails entrantes y salientes a los directorios correctos

cd $HOME/downloads
sudo rpmbuild -ta maildrop-2.4.3.tar.bz2
cd $HOME/rpm/RPMS/i386
sudo rpm --install maildrop-2.4.3-1.i386.rpm

-Salimos de la cuenta vmail a root y verificamos que seamos root

exit
whoami
root

-Creamos el file para logs de maildrop

touch /var/log/maildroprc.log
chmod 777 /var/log/maildroprc.log

-Generamos los certificados usados por Postfix (para SMTPS y TLS), Courier (para IMAPS y POP3S) y Apache (para HTTPS)

mkdir /usr/local/ssl; cd /usr/local/ssl

-La llave sera sin password evitando que cuando iniciemos postfix, courier o apache pida el password

openssl genrsa -out mail.yourdomain.com.key 1024
Generating RSA private key, 1024 bit long modulus
......++++++
...................................................++++++
e is 65537 (0x10001)

chmod 600 mail.yourdomain.com.key

-Generamos la solicitud de certificado

openssl req -new -key mail.yourdomain.com.key -out mail.yourdomain.com.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:CO
State or Province Name (full name) [Berkshire]:Cundinamarca
Locality Name (eg, city) [Newbury]:Bogota
Organization Name (eg, company) [My Company Ltd]:Cabrera ltda
Organizational Unit Name (eg, section) []:Soporte Sistemas
Common Name (eg, your name or your server's hostname) []:mail.yourdomain.com
Email Address []:postmaster@yourdomain.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:

-El fichero generado es el necesario para que nos creen un certificado real las Certificate Authority como Verisign o Thawte, en nuestro caso, lo firmaremos nosotros mismos

openssl genrsa -des3 -out ca.key 1024
Generating RSA private key, 1024 bit long modulus
........................................................++++++
...............++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:

-Restringimos sus permisos

chmod 600 ca.key

-Generamos un certificado auto firmado

openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Enter pass phrase for ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:CO
State or Province Name (full name) [Berkshire]:Cundinamarca
Locality Name (eg, city) [Newbury]:Bogota
Organization Name (eg, company) [My Company Ltd]:Cabrera ltda
Organizational Unit Name (eg, section) []:Sistemas Soporte
Common Name (eg, your name or your server's hostname) []:mail.yourdomain.com
Email Address []:postmaster@yourdomain.com

-Usamos este CA certificado para firmar nuestro certificado

openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -in mail.yourdomain.com.csr -out mail.yourdomain.com.crt
Signature ok
subject=/C=CO/ST=Bogota/L=Cundinamarca/O=Cabrera ltda/OU=Sistemas Soporte/CN=mail.yourdomain.com/emailAddress=postmaster@yourdomain.com
Getting CA Private Key
Enter pass phrase for ca.key:

-Combinamos el server key y el certificado en un unico fichero. Postfix y Apache pueden manejar 2 ficheros pero Courier necesita solo uno. Asi que crearemos un fichero unico para todo. Crearemos el pem en el formato esperado por Courier (key y cert en un unico fichero)

cat mail.yourdomain.com.key mail.yourdomain.com.crt > mail.yourdomain.com.pem
chmod 600 mail.yourdomain.com.pem

-Si todo va bien, debe tener algo parecido

ls -la
total 32
drwxr-xr-x  2 root root 4096 Apr 15 15:46 .
drwxr-xr-x 12 root root 4096 Apr 15 14:43 ..
-rw-r--r--  1 root root 1415 Apr 15 15:35 ca.crt
-rw-------  1 root root  963 Apr 15 15:27 ca.key
-rw-r--r--  1 root root 1021 Apr 15 15:42 mail.yourdomain.com.crt
-rw-r--r--  1 root root  777 Apr 15 15:40 mail.yourdomain.com.csr
-rw-------  1 root root  887 Apr 15 15:01 mail.yourdomain.com.key
-rw-------  1 root root 1908 Apr 15 15:46 mail.yourdomain.com.pem

-Instalamos y configuramos postfixadmin

cd /var/www/html
yum install subversion
svn co https://postfixadmin.svn.sourceforge.net/svnroot/postfixadmin/trunk postfixadmin
cd postfixadmin
chmod 640 *.php
cd admin
chmod 640 *.php
cd ../images/
chmod 640 *.png
chmod 640 calendar/*.png
chmod 640 calendar/*.gif
cd ../languages/
chmod 640 *.lang
cd ../templates/
chmod 640 *.php
chmod 640 *.tpl
chmod 640 *.txt
cd ../users/
chmod 640 *.php
chmod 640 images/calendar/*.gif
chmod 640 images/calendar/*.png
cd ..

-Creamos la db en el Cluster MySQL segun el INSTALL.TXT. En el server SQL

mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.41-ndb-7.0.13-cluster-gpl MySQL Cluster Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE postfix;
Query OK, 1 row affected (0.04 sec)

mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'choose_a_password';
Query OK, 0 rows affected (0.16 sec)

mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE USER 'postfix'@'192.168.0.18' IDENTIFIED BY 'choose_a_password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'192.168.0.18';
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;

mysql> exit;
Bye

-Configuramos postfixadmin

cd /var/www/html/postfixadmin
yum install php-cli php-ldap php-mysql php-gd php php-pear php-pdo php-common php-devel php-mbstring.i386

yum install php-imap php-odbc php-xml php-xmlrpc curl curl-devel perl-libwww-perl ImageMagick libxml2 libxml2-devel dovecot

vi config.inc.php

$CONF['configured'] = true;
$CONF['setup_password'] = 'cambiame';
$CONF['postfix_admin_url'] = 'http://192.168.0.18/postfixadmin';
$CONF['postfix_admin_path'] = dirname(__FILE__);
$CONF['default_language'] = 'en';
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = '192.168.0.22';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'password';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';

$CONF['database_tables'] = array (
    'admin' => 'admin',
    'alias' => 'alias',
    'alias_domain' => 'alias_domain',
    'config' => 'config',
    'domain' => 'domain',
    'domain_admins' => 'domain_admins',
    'fetchmail' => 'fetchmail',
    'log' => 'log',
    'mailbox' => 'mailbox',
    'vacation' => 'vacation',
    'vacation_notification' => 'vacation_notification',
    'quota' => 'quota',
        'quota2' => 'quota2',
);
$CONF['admin_email'] = 'postmaster@yourdomain.com';
$CONF['smtp_server'] = 'localhost';
$CONF['smtp_port'] = '25';
$CONF['encrypt'] = 'md5crypt';
$CONF['authlib_default_flavor'] = 'md5raw';
$CONF['dovecotpw'] = "/usr/sbin/dovecotpw";
$CONF['min_password_length'] = 8;
$CONF['generate_password'] = 'NO';
$CONF['show_password'] = 'YES';
$CONF['page_size'] = '200';
$CONF['default_aliases'] = array (
    'abuse' => 'abuse@change-this-to-your.domain.tld',
    'hostmaster' => 'hostmaster@change-this-to-your.domain.tld',
    'postmaster' => 'postmaster@change-this-to-your.domain.tld',
    'webmaster' => 'webmaster@change-this-to-your.domain.tld'
);
$CONF['domain_path'] = 'NO';
$CONF['domain_in_mailbox'] = 'YES';
$CONF['maildir_name_hook'] = 'NO';
$CONF['aliases'] = '10';
$CONF['mailboxes'] = '10';
$CONF['maxquota'] = '100';
$CONF['quota'] = 'YES';
$CONF['quota_multiplier'] = '1024000';
$CONF['transport'] = 'NO';
$CONF['transport_options'] = array (
    'virtual',  // for virtual accounts
    'local',    // for system accounts
    'relay'     // for backup mx
);
$CONF['transport_default'] = 'virtual';
$CONF['vacation'] = 'YES';
$CONF['vacation_domain'] = 'autoreply.yourdomain.com';
$CONF['vacation_control'] ='YES';
$CONF['vacation_control_admin'] = 'YES';
$CONF['alias_control'] = 'YES';
$CONF['alias_control_admin'] = 'YES';
$CONF['special_alias_control'] = 'NO';
$CONF['alias_goto_limit'] = '0';
$CONF['alias_domain'] = 'YES';
$CONF['backup'] = 'YES';
$CONF['sendmail'] = 'YES';
$CONF['logging'] = 'YES';
$CONF['fetchmail'] = 'YES';
$CONF['fetchmail_extra_options'] = 'NO';
$CONF['show_header_text'] = 'NO';
$CONF['header_text'] = ':: Postfix Admin ::';
$CONF['user_footer_link'] = "http://www.yourdomain.com/";
$CONF['show_footer_text'] = 'NO';
$CONF['footer_text'] = 'Return to change-this-to-your.domain.tld';
$CONF['footer_link'] = 'http://change-this-to-your.domain.tld';
$CONF['welcome_text'] = <<
Hi,

Welcome to your new account.
EOM;
$CONF['emailcheck_resolve_domain']='YES';
$CONF['show_status']='YES';

$CONF['show_status_key']='YES';
$CONF['show_status_text']='  ';
$CONF['show_undeliverable']='YES';
$CONF['show_undeliverable_color']='tomato';
$CONF['show_undeliverable_exceptions']=array("unixmail.domain.ext","exchangeserver.domain.ext","gmail.com");
$CONF['show_popimap']='YES';
$CONF['show_popimap_color']='darkgrey';
$CONF['show_custom_domains']=array("subdomain.domain.ext","domain2.ext");
$CONF['show_custom_colors']=array("lightgreen","lightblue");
$CONF['recipient_delimiter'] = "";
$CONF['mailbox_postcreation_script']='sudo /usr/local/bin/postfixadmin-mailbox-postcreation.sh';
$CONF['mailbox_postdeletion_script']='sudo /usr/local/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script']='sudo /usr/local/bin/postfixadmin-domain-postdeletion.sh';
$CONF['used_quotas'] = 'NO';
$CONF['new_quota_table'] = 'NO';
$CONF['theme_logo'] = 'images/logo-default.png';
$CONF['theme_css'] = 'css/default.css';
$CONF['xmlrpc_enabled'] = false;
if (file_exists(dirname(__FILE__) . '/config.local.php')) {
    include(dirname(__FILE__) . '/config.local.php');
}

-Habilitamos permisos para apache

chown -R apache.apache /var/www/html/postfixadmin

-Abrimos firefox y vemos el URL http://192.168.0.18/postfixadmin/setup.php
Se realizara un test de que tengamos todos los requirimientos ok y nos pedira un password, le colocamos uno y el nos devuelve un hash del mismo. OJO, que no se nos olvide este password. El hash devuelto lo colocamos en $CONF['setup_password'] = dentro de config.inc.php

-A continuacion nos creamos una cuenta con privilegios de admin en la misma pagina web, en la opcion Setup password colocamos el password que colocamos anteriormente, no en hash sino normal, email de la persona y el password a colocarle 2 veces y damos click en Add Admin
Debe devolvernos Admin has been added!

-Continuamos

mv setup.php setup.php-disabled
cp /var/www/html/postfixadmin/ADDITIONS/postfixadmin* /usr/local/bin
cd /usr/local/bin
chown root.root
postfixadmin*
chmod 744 postfixadmin*

-Modificamos o agregamos las siguientes lineas en estos 3 scripts

vi postfixadmin-mailbox-postcreation.sh

basedir=/opt/mail
..
..
maildirmake "$maildir"
chown -R vmail:vmail $maildir

-Salvamos y salimos

vi postfixadmin-mailbox-postdeletion.sh

basedir=/opt/mail
trashbase=/opt/deleted
..
..
maildir="${basedir}/${1}"
..
..
mv $maildir $trashdir
chown -R vmail:vmail $trashdir

-Salvamos y salimos

vi postfixadmin-domain-postdeletion.sh

basedir=/opt/mail
trashbase=/opt/deleted

mv $domaindir $trashdir
chown -R vmail:vmail $trashdir


-Salvamos y salimos
-Creamos los directorios mail y deleted

mkdir /opt/mail /opt/deleted
chmod 700 /opt/mail/ /opt/deleted/
chown vmail.vmail /opt/mail/ /opt/deleted/

-Modificamos

vi /var/www/html/postfixadmin/smarty.inc.php

-Buscamos

return htmlentities($data, ENT_QUOTES, 'UTF-8', false);

y lo cambiamos a

return htmlentities($data, ENT_QUOTES, 'UTF-8');

-Salimos salvando.

-Accedemos a la interfaz administrativa de postfixadmin. Pero aun no creamos dominios y cuentas:

http://192.168.0.18/postfixadmin/

-Configuramos SASL para SMTP-AUTH

vi /usr/lib/sasl2/smtpd.conf

# smtpd.conf
pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/spool/authdaemon/socket

-Salvamos y salimos

chown root.vmail /usr/lib/sasl2/smtpd.conf
chmod 640 /usr/lib/sasl2/smtpd.conf
chmod 755 /var/spool/authdaemon/

-Comenzamos a configurar postfix

cd /etc/postfix

-Modificamos master.cf

vi master.cf

#descomentamos smtps para tener smtp sobre SSL
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

#habilitamos otro puerto para el smtp para los casos cuando los ISP bloquean el puerto 25 SMTP
567 inet n - n - - smtpd

#Modificamos la linea del maildrop
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/bin/maildrop -w 90 -d ${recipient}

#agregamos al final el modulo de vacation
#
# VIRTUAL VACATION
#
vacation unix - n n - - pipe
flags=DRhu user=vacation argv=/var/spool/vacation/vacation.pl -f ${sender} -- ${recipient}

-Salvamos y salimos

-Agregamos el usuario para ejecutar el script de vacation. Por motivos de seguridad, no necesitamos que tenga shell asignado, nadie se logeara por esta cuenta

adduser -d /var/spool/vacation -s /sbin/nologin vacation

-Editamos /etc/passwd y le colocamos un * al campo password del usuario vacation, asi evitamos que alguien coloque un password a esta cuenta para después usarla.

vi /etc/passwd
vacation:*:1002:1002::/var/spool/vacation:/sbin/nologin

-Copiamos el script y le cambiamos sus privilegios

cp /var/www/html/postfixadmin/VIRTUAL_VACATION/vacation.pl /var/spool/vacation/vacation.pl
chown vacation.vacation /var/spool/vacation/vacation.pl
chmod 700 /var/spool/vacation/vacation.pl

-Editamos el script y cambiamos

vi /var/spool/vacation/vacation.pl

our $db_type = 'mysql';
our $db_host = '192.168.0.22';
our $db_username = 'postfixadmin';
our $db_password = 'postfixadmin';
our $db_name = 'postfix';
our $vacation_domain = 'autoreply.example.org';
our $smtp_server = 'localhost';
our $smtp_server_port = 25;
our $syslog = 0;
our $logfile='/var/spool/vacation/vacation.log';
our $log_level = 2;
our $log_to_file = 1;
our $interval = 0;

-Lo agregamos a transport

vi /etc/postfix/transport

autoreply.yourdomain.com vacation

-Activamos el cambio

postmap /etc/postfix/transport

-Instalamos por dependencias con perl

yum install links ncftp openssh-askpass

-Entramos a webmin para agregar unos modulos perl que necesitamos para vacation

https://192.168.0.18:10000/

-Vamos a Others - Perl. Modulos a instalar (ademas de los que se instalan por default en Centos):

CPAN::Bundle
DBD::mysql
Mail::Sendmail
Mail::Sender
MailTools
Email::Valid
MIME::Charset
Log::Log4perl
Log::Dispatch
MIME::EncWords
Net::Server
IO::Multiplex

-Modificamos main.cf

cd /etc/postfix

vi main.cf
myhostname = mail.yourdomain.com
mydomain = yourdomain.com
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
mynetworks = $config_directory/mynetworks
relay_domains = mysql:/etc/postfix/mysql_relay_domains_maps.cf
alias_database = hash:/etc/aliases

-Agregamos al final del fichero

virtual_alias_maps      = hash:/etc/aliases mysql:/etc/postfix/mysql_virtual_alias_maps.cf hash:/etc/aliases
virtual_uid_maps        = static:1001
virtual_gid_maps        = static:1001
virtual_mailbox_base    = /opt/mail
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_limit   = 51200000
virtual_mailbox_maps    = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid     = 1001
virtual_transport = maildrop
maildrop_destination_recipient_limit = 1
transport_maps = hash:/etc/postfix/transport
vacation_destination_recipient_limit = 1
virtual_create_maildirsize     = yes
virtual_mailbox_extended       = yes
virtual_mailbox_limit_maps     = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message  = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
smtpd_sasl_auth_enable          = yes
smtpd_sasl_security_options     = noanonymous
broken_sasl_auth_clients        = yes
smtpd_sasl_path                 = smptd
smtpd_sasl_local_domain         =
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions    =  permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_hostname,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unauth_destination,reject_unauth_pipelining,reject_invalid_hostname,reject_rbl_client list.dsbl.org,reject_rbl_client bl.spamcop.net,reject_rbl_client sbl-xbl.spamhaus.org
smtp_use_tls                     = no
smtpd_use_tls                    = yes
smtpd_tls_auth_only              = no
smtpd_tls_key_file               = /usr/local/ssl/mail.yourdomain.com.key
smtpd_tls_cert_file              = /usr/local/ssl/mail.yourdomain.com.crt
smtpd_tls_session_cache_database = btree:/etc/postfix/tls_smtpd_scache
smtpd_tls_loglevel               = 1
smtpd_tls_received_header        = yes
smtpd_client_restrictions        = check_client_access hash:/etc/postfix/access
smtpd_client_connection_count_limit = 60
message_size_limit = 16000000

-Creamos los ficheros mysql-virtual

vi /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix
hosts = 192.168.0.22
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = 1

vi /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = 192.168.0.22
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
#query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'

vi /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = 192.168.0.22
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1

vi /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = postfix
hosts = 192.168.0.22
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s'

vi /etc/postfix/mysql_relay_domains_maps.cf
user = postfix
password = postfix
hosts = 192.168.0.22
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'

-Como estos files contienen datos de conexion a nuestra db, limitamos su acceso por seguridad

chown root.postfix /etc/postfix/mysql_*.cf
chmod 640 /etc/postfix/mysql_*.cf
ls -la /etc/postfix/mysql*
-rw-r----- 1 root postfix 143 Apr 29 15:35 /etc/postfix/mysql_relay_domains_maps.cf
-rw-r----- 1 root postfix 137 Apr 29 15:24 /etc/postfix/mysql_virtual_alias_maps.cf
-rw-r----- 1 root postfix 264 Apr 29 15:27 /etc/postfix/mysql_virtual_domains_maps.cf
-rw-r----- 1 root postfix 126 Apr 29 15:31 /etc/postfix/mysql_virtual_mailbox_limit_maps.cf
-rw-r----- 1 root postfix 143 Apr 29 15:29 /etc/postfix/mysql_virtual_mailbox_maps.cf

-Colocamos las ip de los servers que harán relay a traves de nuestro server. Los usuarios que tengan cuenta en el server no necesitan tener su ip aqui, ya que ellos se logearan por SMTP-AUTH, por default colocamos localhost para darle permiso a los scripts locales en el server

echo '# Localhost' > /etc/postfix/mynetworks
echo '127.0.0.0/8' >>/etc/postfix/mynetworks
echo '' >>/etc/postfix/mynetworks

-Existen 2 formatos de guardar sus mails, Mbox que es un fichero donde se almacenan todos los mails, uno detrás del otro y Maildir que almacena los mails cada uno en un directorio especial. Para este documento usaremos Maildir

-Configuramos Courier-authlib para manejar Courier-IMAP y Courier-POP3

vi /etc/authlib/authdaemonrc
authmodulelist="authmysql"
authdaemonvar=/var/spool/authdaemon

vi /etc/authlib/authmysqlrc
MYSQL_SERVER 192.168.0.22
MYSQL_USERNAME postfix
#password de la cuenta postfix de mysql
MYSQL_PASSWORD 12345
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD '1001'
MYSQL_GID_FIELD '1001'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD '/opt/mail'
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD CONCAT("/opt/mail/",maildir)
MYSQL_QUOTA_FIELD concat(quota,'S')

 -Protegemos el fichero

chmod 400 /etc/authlib/authmysqlrc

-Comenzamos a configurar Maildrop con Maildir+softquota

vi /etc/quotawarnmsg
X-Comment: Rename/Copy this file to quotawarnmsg, and make appropriate changes
X-Comment: See deliverquota man page for more information
From: Mail Delivery System
Reply-To: postmaster@calcom.com.mx
To: Valued Customer:;
Subject: Mail quota warning
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 7bit
Your mailbox on the server is now more than 90% full. So that you can continue to receive mail you need to remove some messages from your mailbox.


vi /etc/postfix/master.cf
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/bin/maildrop -w 90 -d ${recipient}
#-w N dara un alerta por mail al usuario cuando su quota de disco este al N porciento lleno
#repitiendose esta alerta todos los dias hasta que libere espacio. El mensaje se toma de
#/etc/quotawarnmsg con los campos "Date:" y "Message-Id:" actualizados


-Salvamos y salimos. Reiniciamos el servicio postfix

chkconfig sendmail off
service sendmail stop
chkconfig postfix on
service postfix restart

vi /etc/maildroprc
logfile "/var/log/maildroprc.log"

-Configuramos Courier-IMAP Courier-POP3

vi /usr/lib/courier-imap/etc/imapd
MAXPERIP=20
IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=PLAIN AUTH=LOGIN IDLE"
IMAP_ACL=0
IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY"
IMAP_ENHANCEDIDLE=1
#IMAP_TRASHFOLDERNAME=Trash
IMAPDSTART=YES
#IMAP_EMPTYTRASH=Trash:7

vi /usr/lib/courier-imap/etc/imapd-ssl
IMAPDSSLSTART=YES
IMAPDSTARTTLS=YES
#certificado creado anteriormente
TLS_CERTFILE=/usr/local/ssl/mail.yourdomain.com.pem
TLS_PROTOCOL=SSL3
TLS_STARTTLS_PROTOCOL=TLS1

vi /usr/lib/courier-imap/etc/pop3d
MAXDAEMONS=40
POP3AUTH="CRAM-MD5 CRAM-SHA1 PLAIN LOGIN"
POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5 CRAM-SHA1 CRAM-SHA256"
POP3AUTH_TLS="$POP3AUTH"
POP3DSTART=YES
MAXPERIP=20

vi /usr/lib/courier-imap/etc/pop3d-ssl
POP3DSSLSTART=YES
POP3_STARTTLS=YES
TLS_CERTFILE=/usr/local/ssl/mail.yourdomain.com.pem
TLS_PROTOCOL=SSL3

-Ejecutamos y verificamos que los daemons necesarios estan ok

service saslauthd start
service courier-authlib start
service courier-imap start
service postfix restart
chkconfig saslauthd on
chkconfig courier-authlib on
chkconfig courier-imap on

-Modificaciones a postfixadmin
-Normalmente para crear los maildir para las cuentas de email necesitaremos algunos comandos, aunque modificaremos el postfixadmin para que haga el trabajo sucio por nosotros.
-Este es un ejemplo de como hacerlo manualmente

-Creación del home maildir de una cuenta email:
maildirmake /opt/mail/user1@yourdomain.com

-Le creamos una quota de disco, si no esta presente, no hay restricción de espacio, en este caso son 10MB y fijense en la S que colocamos al final del numero:
maildirmake -q 10971520S /opt/mail/user1@yourdomain.com

-Protegemos el directorio
chmod g-r,o-r /opt/mail/user1\@yourdomain.com/
chown -R vmail.vmail /opt/mail/user1\@yourdomain.com/

-Damos permiso a los scripts para crear usuarios y dominios y borrarlos desde postfixadmin

visudo
#comentamos requiretty
#Defaults requiretty
..
..

vmail   ALL=(ALL)       NOPASSWD: ALL
apache  ALL=(ALL)      NOPASSWD: ALL
apache mail.yourdomain.com=NOPASSWD:   /usr/local/bin/postfixadmin-mailbox-postcreation.sh
apache mail.yourdomain.com=NOPASSWD:   /usr/local/bin/postfixadmin-mailbox-postdeletion.sh
apache mail.yourdomain.com=NOPASSWD:   /usr/local/bin/postfixadmin-domain-postdeletion.sh


service postfix restart

-Manejo de la cola de emails en postfix por linea de comandos

postqueue -p

-Poner un mensaje en HOLD. MESSAGEID es un identificador unico dado por postfix al colocar el mail en cola, para marcar todos los mails escribimos ALL

postsuper -h MESSAGEID

-Eliminar un mail de la cola

postsuper -d MESSAGEID

-Eliminar todos los mails en la cola

postsuper -d ALL

-Verificamos permisos de los files del postfix

postfix check

-Verificamos otros errores

egrep '(reject|warning|error|fatal|panic):' /var/log/maillog

-Verificamos los valores de Courier-authlib. Mostramos las cuentas creadas

vi /etc/authlib/authdaemonrc

DEBUG_LOGIN=2

-Reiniciamos el daemon

service courier-authlib restart

-Listamos las cuentas

/usr/sbin/authenumerate
user2@yourdomain.com 1001 1001 /opt/mail /opt/mail/user2@yourdomain.com/

-Verificamos por linea de comandos una cuenta

/usr/sbin/authtest someuser@yourdomain.com somepassword
Authentication succeeded.

Authenticated: someuser@yourdomain.com (uid 1001, gid 1001)
Home Directory: /opt/mail
Maildir: /opt/mail/someuser@yourdomain.com/
Quota: 10240000S
Encrypted Password: $1$9625a822$9wBt3mVsXm9oMbbO49HVX/
Cleartext Password: somepassword
Options: wbnochangepass=1,wbusexsender=1,disableshared=1

-Cuando estemos seguro de que Courier-authlib este funcionando ok, desabilitamos el modo debug o podemos llenar nuestro disco con mensajes de log

vi /etc/authlib/authdaemonrc
DEBUG_LOGIN=0

service courier-authlib restart

-Verificamos el servicio POP3

telnet localhost pop3
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
user user2@yourdomain.com
+OK Password required.
pass 12345
+OK logged in.
stat
+OK 0 0
quit
+OK Bye-bye.
Connection closed by foreign host.

-Verificamos IMAP

telnet localhost imap
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=PLAIN AUTH=LOGIN IDLE STARTTLS] Courier-IMAP ready. Copyright 1998-2008 Double Precision, Inc.  See COPYING for distribution information.
a login user2@yourdomain.com 12345
a OK LOGIN Ok.
a examine inbox
* FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent)
* OK [PERMANENTFLAGS ()] No permanent flags permitted
* 0 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1221862032] Ok
* OK [MYRIGHTS "cdilrsw"] ACL
a OK [READ-ONLY] Ok
a logout
* BYE Courier-IMAP server shutting down
a OK LOGOUT completed
Connection closed by foreign host.

-Verificamos Maildrop. Salimos con Control C

maildrop -V9 -d user2@yourdomain.com
maildrop: authlib: groupid=1001
maildrop: authlib: userid=1001
maildrop: authlib: logname=user2@yourdomain.com, home=/opt/mail, mail=/opt/mail/user2@yourdomain.com/
maildrop: Changing to /opt/mail

-Ya con postfix funcionando ok, pasaremos a instalar y configurar MailScanner. MailScanner es un software opensource que integra soporte antispam con spamassassin y antivirus con clamav entre otros antivirus.

-Antes de comenzar paramos el servicio postfix

service postfix stop
service saslauthd stop

mkdir /var/spool/postfix/usr
mkdir /var/spool/postfix/usr/var
mkdir /var/spool/postfix/var/
mkdir /var/spool/postfix/var/spool
mv /var/spool/authdaemon/ /var/spool/postfix/var/spool/authdaemon
ln -s /var/spool/postfix/var/spool/authdaemon/ /var/spool/authdaemon

-Reiniciamos postfix y saslauthd

service postfix start
service saslauthd start

-Cambiamos la configuración del postfix para que trabaje en modo split MTA
vi /etc/postfix/main.cf

header_checks = regexp:/etc/postfix/header_checks

vi /etc/postfix/header_checks

/^Received:/ HOLD

-Descargamos MailScanner

cd /home/vmail/downloads/

wget -c http://mailscanner.info/files/4/rpm/MailScanner-4.80.4-1.rpm.tar.gz
gunzip -d MailScanner-4.80.4-1.rpm.tar.gz
tar xvf MailScanner-4.80.4-1.rpm.tar
cd MailScanner-4.80.4-1

-Ejecutamos el script de install, OJO, colocamos un . punto antes del /

./install.sh

-Prestamos atencion que se instalen bien HTML-Parser y MIME-tools. Es normal que veamos algunos errores. Pero estos 2 modulos si deben quedar instalados. Ctrl-S para temporalmente la ejecucion para darnos tiempo a anotar algun error o modulo faltante para despues instalarlo y Ctrl-Q continua. Si algun modulo perl da error por falta de otro modulo, tomamos nota y lo instalamos despues al terminar el install.sh y volvemos a ejecutarlo.

-Modificamos los siguientes parametros en MailScanner.conf

cd /etc/MailScanner
vi MailScanner.conf

Run As User = postfix
Run As Group = postfix
Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming
MTA = postfix
SpamAssassin User State Dir = /var/spool/MailScanner/spamassassin

-Preparamos el directorio bayes

mkdir /etc/MailScanner/bayes
chmod g+rws /etc/MailScanner/bayes

-Descargamos e instalamos spamassassin y clamav (antispam-antivirus)

cd /home/vmail/downloads/

-Creamos una cuenta para clamav pero sin home y sin que se pueda logear

adduser -Ms /sbin/nologin clamav

wget -c http://mailscanner.info/files/4/install-Clam-SA-latest.tar.gz
tar xzvf install-Clam-SA-latest.tar.gz
cd install-Clam-0.96-SA-3.3.0
./install.sh

-Respondemos y en:
Do you want me to install ClamAV for you [y or n, default is y] ? y

-Habilitamos algunos pluggins de spamassassin


vi /etc/mail/spamassassin/init.pre
loadplugin Mail::SpamAssassin::Plugin::RelayCountry
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
loadplugin Mail::SpamAssassin::Plugin::Hashcash
loadplugin Mail::SpamAssassin::Plugin::SPF
loadplugin Mail::SpamAssassin::Plugin::Razor2
loadplugin Mail::SpamAssassin::Plugin::DKIM

vi /etc/mail/spamassassin/v310.pre
loadplugin Mail::SpamAssassin::Plugin::DCC
loadplugin Mail::SpamAssassin::Plugin::Pyzor
loadplugin Mail::SpamAssassin::Plugin::Razor2
loadplugin Mail::SpamAssassin::Plugin::SpamCop
loadplugin Mail::SpamAssassin::Plugin::AWL
loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
loadplugin Mail::SpamAssassin::Plugin::TextCat
loadplugin Mail::SpamAssassin::Plugin::WhiteListSubject
loadplugin Mail::SpamAssassin::Plugin::MIMEHeader
loadplugin Mail::SpamAssassin::Plugin::ReplaceTags
loadplugin Mail::SpamAssassin::Plugin::RelayCountry
loadplugin Mail::SpamAssassin::Plugin::SPF
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
loadplugin Mail::SpamAssassin::Plugin::DKIM

vi /etc/mail/spamassassin/v312.pre
loadplugin Mail::SpamAssassin::Plugin::DKIM

vi /etc/mail/spamassassin/v320.pre
loadplugin Mail::SpamAssassin::Plugin::Check
loadplugin Mail::SpamAssassin::Plugin::HTTPSMismatch
loadplugin Mail::SpamAssassin::Plugin::URIDetail
loadplugin Mail::SpamAssassin::Plugin::Shortcircuit
loadplugin Mail::SpamAssassin::Plugin::Bayes
loadplugin Mail::SpamAssassin::Plugin::BodyEval
loadplugin Mail::SpamAssassin::Plugin::DNSEval
loadplugin Mail::SpamAssassin::Plugin::HTMLEval
loadplugin Mail::SpamAssassin::Plugin::HeaderEval
loadplugin Mail::SpamAssassin::Plugin::MIMEEval
loadplugin Mail::SpamAssassin::Plugin::RelayEval
loadplugin Mail::SpamAssassin::Plugin::URIEval
loadplugin Mail::SpamAssassin::Plugin::WLBLEval
loadplugin Mail::SpamAssassin::Plugin::VBounce
loadplugin Mail::SpamAssassin::Plugin::ImageInfo
loadplugin Mail::SpamAssassin::Plugin::RelayCountry
loadplugin Mail::SpamAssassin::Plugin::SPF
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
loadplugin Mail::SpamAssassin::Plugin::Razor2
loadplugin Mail::SpamAssassin::Plugin::DKIM

vi /etc/mail/spamassassin/v330.pre
loadplugin Mail::SpamAssassin::Plugin::FreeMail
loadplugin Mail::SpamAssassin::Plugin::RelayCountry
loadplugin Mail::SpamAssassin::Plugin::SPF
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
loadplugin Mail::SpamAssassin::Plugin::Razor2
loadplugin Mail::SpamAssassin::Plugin::DKIM

-Activamos el spamassassin y clamav en MailScanner.conf

vi /etc/MailScanner/MailScanner.conf
Use SpamAssassin = yes
Incoming Work User = clamav
Incoming Work Group = clamav
Clamd Socket = /tmp/clamd.socket
Incoming Work Permissions = 0660
Quarantine User = root
Quarantine Group = apache
Quarantine Permissions = 0660
Quarantine Whole Message = yes
Spam Actions = store
Always Looked Up Last = MailWatchLogging
Is Definitely Not Spam = &SQLWhitelist
Is Definitely Spam = &SQLBlacklist

-Creamos el script de inicio para spamassassin

vi /etc/init.d/spamassassin
#!/bin/sh
#
# spamassassin This script starts and stops the spamd daemon
#
# chkconfig: - 78 30
# processname: spamd
# description: spamd is a daemon process which uses SpamAssassin to check \
#              email messages for SPAM.  It is normally called by spamc \
#              from a MDA.

# Source function library.
. /etc/rc.d/init.d/functions

prog="spamd"

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# Set default spamd configuration.
SPAMDOPTIONS="-d -c -m5 -H"
SPAMD_PID=/var/run/spamd.pid

# Source spamd configuration.
if [ -f /etc/sysconfig/spamassassin ] ; then
        . /etc/sysconfig/spamassassin
fi

[ -f /usr/bin/spamd -o -f /usr/local/bin/spamd ] || exit 0
PATH=$PATH:/usr/bin:/usr/local/bin

# By default it's all good
RETVAL=0
# See how we were called.
case "$1" in
  start)
        # Start daemon.
        echo -n $"Starting $prog: "
        daemon $NICELEVEL spamd $SPAMDOPTIONS -r $SPAMD_PID
        RETVAL=$?
        echo
        if [ $RETVAL = 0 ]; then
                touch /var/lock/subsys/spamassassin
        fi
        ;;
  stop)
        # Stop daemons.
        echo -n $"Stopping $prog: "
        killproc spamd
        RETVAL=$?
        echo
        if [ $RETVAL = 0 ]; then
                rm -f /var/lock/subsys/spamassassin
                rm -f $SPAMD_PID
        fi
        ;;
  restart)
        $0 stop
        sleep 3
        $0 start
        ;;
  condrestart)
       [ -e /var/lock/subsys/spamassassin ] && $0 restart
       ;;
  status)
         status spamd
        RETVAL=$?
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|status|condrestart}"
        RETVAL=1
        ;;
esac

exit $RETVAL

-Salimos salvando, pasamos a activarlo

chkconfig spamassassin on
service spamassassin start

-Configuramos clamav y freshclam

vi /usr/local/etc/clamd.conf
LogSyslog yes
LogFacility LOG_MAIL
DatabaseDirectory /usr/local/share/clamav
LocalSocket /tmp/clamd.socket
SelfCheck 600
AlgorithmicDetection yes
ScanPE yes
ScanELF yes
ScanOLE2 yes
ScanPDF yes
ScanMail yes
PhishingSignatures yes
ScanHTML yes
ScanArchive yes
MaxScanSize 15M

vi /usr/local/etc/freshclam.conf
DatabaseDirectory  /usr/local/share/clamav
UpdateLogFile /var/log/freshclam.log
LogFileMaxSize 2M
LogSyslog yes
LogFacility LOG_MAIL
PidFile disabled
DatabaseOwner clamav
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror db.US.clamav.net
DatabaseMirror database.clamav.net
ScriptedUpdates yes
NotifyClamd /usr/local/etc/clamd.conf

-Creamos un script para iniciar clamd y lo activamos

vi /etc/init.d/clamd
#! /bin/bash
#
# crond   Start/Stop the clam antivirus daemon.
#
# chkconfig: 2345 70 41
# description: clamd is a standard Linux/UNIX program that scans for Viruses.
# processname: clamd
# config: /usr/local/etc/clamd.conf
# pidfile: /var/lock/subsys/clamd

# Source function library.
. /etc/init.d/functions

RETVAL=0

# See how we were called.

prog="clamd"
progdir="/usr/local/sbin"

# Source configuration
if [ -f /etc/sysconfig/$prog ] ; then
        . /etc/sysconfig/$prog
fi

start() {
        echo -n $"Starting $prog: "
        LANG= daemon $progdir/$prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/clamd
        return $RETVAL
}

stop() {
echo -n $"Stopping $prog: "
        # Would be better to send QUIT first, then killproc if that fails
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/clamd
        return $RETVAL
}

rhstatus() {
        status clamd
}

restart() {
        stop
        start
}

reload() {
        echo -n $"Reloading clam daemon configuration: "
        killproc clamd -HUP
        retval=$?
        echo
        return $RETVAL
}

case "$1" in
  start)
        start
        ;;
  stop)
stop
        ;;
  restart)
        restart
        ;;
  reload)
        reload
        ;;
  status)
        rhstatus
        ;;
  condrestart)
        [ -f /var/lock/subsys/clamd ] && restart || :
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
        exit 1
esac

exit $?

-Salimos salvando y ahora lo activamos

chkconfig clamd
service clamd start

vi /etc/MailScanner/spam.assassin.prefs.conf
ok_locales              en es pt
use_bayes 1
bayes_path /etc/MailScanner/bayes/bayes
bayes_file_mode 0660
bayes_auto_learn 1
ifplugin Mail::SpamAssassin::Plugin::Pyzor
pyzor_path /usr/bin/pyzor
endif
rbl_timeout 11
razor_timeout 10
pyzor_timeout 4

-Instalamos y configuramos razor, dcc y pyzor

cd /home/vmail/downloads/
wget -c http://internap.dl.sourceforge.net/sourceforge/razor/razor-agents-sdk-2.07.tar.bz2
wget
bunzip2 razor-agents-sdk-2.07.tar.bz2
bunzip2 razor-agents-2.84.tar.bz2
tar xvf razor-agents-sdk-2.07.tar
tar xvf razor-agents-2.84.tar

-Verificamos tengamos los siguientes modulos perl instalados:

Time::HiRes
Digest::SHA1
MIME::Base64
Test::Simple
Test::Harness
Getopt::Long
Business::ISBN
GD::Barcode::EAN13
URI::Escape

-Compilamos e instalamos razor

cd razor-agents-sdk-2.07
perl Makefile.PL
make
make test
make install

cd ..
cd razor-agents-2.84
perl Makefile.PL
make
make test
make install

-Creamos el usuario razor para sus reportes, como postfix no puede logearse, primero lo creamos en root y despues lo pasamos al home de postfix

cd /root
razor-admin -create
razor-admin -register
cp -rf .razor/ /var/spool/postfix/
chown -R postfix.postfix /var/spool/postfix/.razor/

-Descargamos e instalamos DCC

cd /home/vmail/downloads/
wget -c http://www.rhyolite.com/dcc/source/dcc.tar.Z
uncompress -d dcc.tar.Z
tar xvf dcc.tar
cd dcc-1.3.126/
./configure
make install

-Descargamos e instalamos Pyzor

cd ..
wget -c http://downloads.sourceforge.net/project/pyzor/pyzor/0.5.0/pyzor-0.5.0.tar.gz
tar xzvf pyzor-0.5.0.tar.gz
cd pyzor-0.5.0

-Para instalar pyzor necesitamos el modulo gdbm de python, verificamos si lo tenemos instalado

python -c 'import gdbm' && echo 'gdbm found'
gdbm found

python setup.py build
python setup.py install

-Le cambiamos los permisos

chmod -R a+rX /usr/share/doc/pyzor /usr/lib/python2.4/site-packages/pyzor /usr/bin/pyzor /usr/bin/pyzord

cd /root
pyzor discover
cp -rf .pyzor/ /var/spool/postfix/
chown -R postfix.postfix /var/spool/postfix/.pyzor/

chkconfig postfix off
service postfix stop
chkconfig MailScanner on
service MailScanner restart

-Descargamos MailWatch

cd /home/vmail/downloads
wget -c http://internap.dl.sourceforge.net/sourceforge/mailwatch/mailwatch-1.0.5.tar.gz
tar xzvf mailwatch-1.0.5.tar.gz
cd mailwatch-1.0.5

-Copiamos el file de creacion de la db al SQL

scp create.sql root@192.168.0.22:/root

-En el server SQL, creamos la db para MailWatch y damos permisos para su acceso

mysql -p < create.sql
mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 154
Server version: 5.1.41-ndb-7.0.13-cluster-gpl MySQL Cluster Server (GPL)

mysql> CREATE USER 'mailwatch'@'localhost' IDENTIFIED BY 'choose_a_password';
Query OK, 0 rows affected (0.07 sec)

mysql> GRANT ALL PRIVILEGES ON `mailscanner` . * TO 'mailwatch'@'localhost';
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE USER 'mailwatch'@'192.168.0.18' IDENTIFIED BY 'choose_a_password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON `mailscanner` . * TO 'mailwatch'@'192.168.0.18';
Query OK, 0 rows affected (0.00 sec)

mysql>FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

-Volvemos al server de email para editar la configuracion de MailWatch.

vi MailWatch.pm
my($db_host) = '192.168.0.22';
my($db_user) = 'mailwatch';
my($db_pass) = 'choose_a_password';
#Comentamos la linea 93
#$dbh->commit;

-Salimos salvando.

mv MailWatch.pm /usr/lib/MailScanner/MailScanner/CustomFunctions/
mv -f mailscanner/ /var/www/html/
chown -R apache:apache /var/www/html/mailscanner/
chmod ug+rwx /var/www/html/mailscanner/images/ /var/www/html/mailscanner/images/cache/
chmod ug+rw /var/www/html/mailscanner/temp/

vi /var/www/html/mailscanner/conf.php.example
define('DB_USER', 'mailwatch');
define('DB_PASS', 'choose_a_password');
define('DB_HOST', '192.168.0.22');
define('QUARANTINE_USE_FLAG', true);

mv /var/www/html/mailscanner/conf.php.example /var/www/html/mailscanner/conf.php
vi SQLBlackWhiteList.pm
my($db_host) = '192.168.0.22';
my($db_user) = 'mailwatch';
my($db_pass) = 'choose_a_password';

mv SQLBlackWhiteList.pm /usr/lib/MailScanner/MailScanner/CustomFunctions/

-Creamos el usuario admin para acceder a mailwatch. Regresamos al server SQL

mysql mailscanner -u mailwatch -p

INSERT INTO users VALUES ('%web_user_username%',md5('%web_user_password%'),'%web_user_name%','A','0','0','0','0','0');
quit;

-Volvemos al server de email y modificamos php.ini.

vi /etc/php.ini
short_open_tag ="On"
safe_mode ="Off"
register_globals ="Off"
magic_quotes_gpc ="On"
magic_quotes_runtime ="Off"
auto_start ="0"
allow_url_fopen ="On"
upload_max_filesize ="15M"
post_max_size = 15M

-Verificamos haya quedado bien configurado spamassassin. Verificamos si falta algun modulo perl para instalarselo

spamassassin -D -p /etc/MailScanner/spam.assassin.prefs.conf --lint

-Modificamos la cuarentena de MailScanner


vi /etc/cron.daily/clean.quarantine
$days_to_keep   = 15;

-Modificamos la cuarentena de MailWatch

cd /home/vmail/downloads/mailwatch-1.0.5
vi tools/db_clean.php
#!/usr/bin/php -q

cp tools/quarantine_maint.php /usr/local/bin/
cp tools/db_clean.php /usr/local/bin/
chmod +x /usr/local/bin/quarantine_maint.php /usr/local/bin/db_clean.php

-En una sola linea ejecutamos lo siguiente

echo "/usr/local/bin/quarantine_maint.php --clean" > /etc/cron.daily/mailwatch_quarantine_maint.sh

echo "/usr/local/bin/db_clean.php" > /etc/cron.daily/mailwatch_db_clean.sh
chmod +x /etc/cron.daily/mailwatch*

 -Cola de mensajes

cp mailq.php /usr/local/bin/
crontab -e
0-59 * * * * /usr/local/bin/mailq.php

-Liberar un mail de cuarentena y que no sea chequeado nuevamente con los filtros antispam y antivirus. Debemos agregar un registro a la db mailscanner en la tabla whitelist. Los valores serian:

to_address = defaultto_domain = defaultfrom_address = 127.0.0.1

-Modificamos algunos ficheros de MailScanner, OJO, los campos son separados por TAB dentro de estos ficheros

cd /etc/MailScanner/

-En una sola linea ejecutamos el siguiente comando

touch filename.rules filetype.rules filename.rules.allowall.conf filetype.rules.allowall.conf rules/content.scanning.rules

vi filename.rules
From: 127.0.0.1 /etc/MailScanner/filename.rules.allowall.conf
FromOrTo: default /etc/MailScanner/filename.rules.conf

vi filetype.rules
From: 127.0.0.1 /etc/MailScanner/filetype.rules.allowall.conf
FromOrTo: default /etc/MailScanner/filetype.rules.conf

vi filename.rules.allowall.conf
allow .* - -

vi filetype.rules.allowall.conf
allow .* - -

vi rules/content.scanning.rules
From: 127.0.0.1 no
FromOrTo: default yes

-Modificamos los permisos para el directorio de cuarentena

chmod g+rws /var/spool/MailScanner/quarantine/

-Instalamos unrar
cd /home/vmail/downloads/
wget -c http://dag.wieers.com/rpm/packages/unrar/unrar-3.7.4-1.el5.rf.i386.rpm
rpm -vi unrar-3.7.4-1.el5.rf.i386.rpm

-Entrada a MailWatch. Nos logeamos con el usuario administrativo que creamos, en el URL http://192.168.0.18/mailscanner

-Personalizamos MailWatch. Actualizamos las definiciones de spamassassin y GeoIP en Tools/Links y con eso nos queda listo nuestro server. En la medida que nuestro server maneje una buena cantidad de mails, mas de 1000, entre spam y ham (mails buenos) este mejorara su porcentaje de efectividad.

Share/Bookmark