LinuxParty

NUESTRO SITIO necesita la publicidad para costear hosting y el dominio. Por favor considera deshabilitar tu AdBlock en nuestro sitio. También puedes hacernos una donación entrando en linuxparty.es, en la columna de la derecha.
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado
 

Correo electrónico

A diferencia de otros sistemas, en Linux el correo electrónico es uno de los servicios de red mas importantes. Linux hace uso del correo electrónico para muchas de sus tareas. Además de estar estrechamente ligado a las cuentas de los usuarios, el correo en Linux es utilizado por ejemplo para informar de sus actividades programadas con cron, o enviar notificaciones sobre operaciones realizadas por shell scripts, entre otras.  El servidor de correo contiene los mensajes entrantes de cada usuario, normalmente en /var/spool/mail, aunque como siempre, esto pueda variar en función de la distribución que estemos usando. Deberemos de tener un conocimiento básico sobre su funcionamiento, configuración y posibilidades (crear alias de correo, reenviar correos, configurar el correo en aplicaciones clientes, etc…).

Existen varios protocolos para administrar el correo electrónico, siendo el mas común SMTP (Simple Mail Transfer Protocol, Protocolo simple de transferencia de correo). En la mayoría de ocasiones se utiliza SMTP como sistema de entrega de correo, por estar diseñado como sistema push (el sistema emisor inicia la transferencia). No obstante en la etapa final del envío del correo se utilizan protocolos de tipo pull (el sistema receptor inicia la transferencia) como POP (Post Office Protocol, Protocolo de oficina de correos) o IMAP (Internet Message Access Protocol, Protocolo de acceso a mensajes de Internet). Estos protocolos son útiles sobre todo cuando el sistema receptor es el equipo de un usuario, el cual suele permanecer apagado en muchas ocasiones. La diferencia básica entre ambos protocolos es que con POP descargaremos los mensajes a nuestro equipo y con IMAP podremos leerlos desde el propio servidor.

 

Funcionamiento del correo electrónico

El método tradicional en Linux para enviar correo, es hacer que los programas locales se comuniquen con el servidor de correos local, quién a través del protocolo SMTP reenviará el correo hacia el destino. Los servidores SMTP son conocidos también como MTA, Agentes de Transferencias de Correos. De esta manera en caso de que el servidor de envío SMTP se encuentre offline, el correo se pondrá en cola y será enviado a sus destinos una vez que este vuelva a estar operativo. La mayoría de los clientes de correo (MUA, Agentes de usuario de correo) ofrecen la opción de contactar directamente con un servidor SMTP remoto al enviar el correo.

Un servidor SMTP puede hacer tanto de servidor (es decir recibe el correo de otro sistema) como de cliente (envía un correo a otro sistema).

El protocolo SMTP permite que un mensaje pase por un número arbitrario de ordenadores. Un usuario puede redactar un email que será enviado a su servidor SMTP local. Este servidor buscará a través de los servidores DNS el destino y una vez localizado se procederá a la entrega.

Cada servidor de la cadena de transmisión alterará el correo añadiendo un encabezado que proporcionará información sobre la ruta que ha tomado el correo. Los spammers y similares, falsifican los encabezados del correo complicando enormemente el análisis de seguimiento.

 

Configurar el correo electrónico

Aviso: Esta sección queda fuera del alcance del examen LPIC-1, aún así se cree conveniente añadir algunos comentarios o parámetros de configuración que nos permitan entendernos con un servidor de correo local, bien para enviar y recibir correos a usuarios de la misma máquina o red, o incluso hacer relay a un proveedor como gmail, de manera que podamos enviar mensajes al exterior a través de una cuenta de correos existente en un proveedor externo.

En un sistema de correo Linux totalmente funcional, probablemente se incluyan otros software. Lo normal es tener un servidor de correo saliente (push) y uno de correo entrante (pull), además de utilidades que nos ayuden a reorganizar el correo, a filtrarlo, a detener correo spam, etc…

Existen diferentes alternativas para servidores de correos de tipo push. Algunos de estos con formatos de configuración mas complejos, mientras que otros quizás estén mas orientado a proporcionar seguridad, o una configuración rápida y efectiva. Los servidores de correo mas populares en Linux son:

  • Sendmail: Durante muchos años fue el servidor de correo dominante en Internet. Es muy potente pero también difícil de configurar. Sus archivos de configuración pueden parecernos algo arcaicos.
  • Postfix: Diseñado como sustituto modular de sendmail ya que utiliza varios programas, controlando cada cual su pequeña tarea específica. Esto lo hace mas seguro y además suele ser mas fácil de configurar que sendmail. Es el servidor de correo por defecto en muchas distribuciones Linux. Será este el que usemos en los ejemplos de configuración que veremos en breves.
  • Exim: Al igual que sendmail, es un servidor monolítico pero su formato de configuración es mas sencillo por lo tanto mas fácil de configurar. Algunas distribuciones de Linux lo emplean como servidor de correo por defecto.
  • qmail: Es un servidor modular (como postfix) con la seguridad como principal objetivo. Es mas sencillo de configurar que sendmail, pero debido a su licencia, la cual complica su distribución en Linux, no se ofrece como servidor de correo por defecto.

Podemos averiguar de diferentes formas que servidor de correo instala nuestra distribución por defecto como por ejemplo mediante el comando ps o incluso mirando dentro de los directorios /usr/bin o /usr/sbin. Para ambos podemos aplicar filtros con grep como ya vimos en Capítulos anteriores. Por motivos de compatibilidad la mayoría de servidores de correo Linux incluyen un programa sendmail, por lo que este podría servir de patrón en nuestra búsqueda.

De igual modo que con el servidor push, dependiendo del modo en el que vayamos a configurar nuestra forma de recibir correos podremos optar por algunas opciones entre las que destacamos:

  • Servidores pull de correo: Los dos protocolos mas populares para este tipo de sistema son POP e IMAP y ya vimos la diferencia básica entre ellos. Algunas de las herramientas mas destacadas con las que podremos controlar la lectura del correo en nuestro Linux son: cyrus, dovecot y courier (los tres tienen su equivalente tanto para POP como IMAP).
  • Fetchmail: Si dependemos de un ISP externo para la distribución de correo, necesitaremos un programa que obtenga el correo utilizando POP o IMAP, y que después lo inserte en una cola de correo SMTP. Esta es la función principal de Fetchmail.
  • Lectores de correos: Son el último eslabón de la cadena de correo. Existen muchos y suelen venir incluidos con la aplicación cliente. Por nombrar algunos: Evolution, KMail, Thunderbird o mutt. Mientra los tres primeros son para GUI, mutt puede ser útil para leer el correo desde la línea de comando, posee una interfaz gráfica para la shell, es decir está basado en texto.

Alguna de las herramientas de las que podemos hacer uso para completar nuestro sistema de correos podrían ser:

  • d-push: Útil si queremos recuperar mediante push el correo en dispositivos móviles. Requiere de un servidor web como apache o nginx y de soporte para PHP.
  • procmail: Funciona como MDA (Mail Delivery Agent, Agente de entrega de correo). Sirve para filtrar y clasificar el correo de entrada. Permite a los usuarios definir reglas que filtren los email recibidos y realizar una serie de funciones como colocarlos en determinadas carpetas, clasificarlos, reenviarlos, etc…
  • spamassassin: Identifica el correo sospechoso o masivo añadiendo cabeceras a los mensajes de modo que pueda ser filtrados por el cliente de correo electrónico

En las dos próximas secciones abarcaremos una configuración básica para en reenvío de correo electrónico dentro de la red local o el propio sistema (algo que en muchas distribuciones viene por defecto) y como reenviar el correo a un proveedor externo. No vamos a abarcar la configuración de un servidor de correo totalmente funciona pues son muchas y diferentes configuraciones las que entran en juegos, pero para que quede una idea, podremos montar una infraestructura con:

  • Postfix quién hará de servidor SMTP enviando y recibiendo el correo
  • dovecot para recuperar el correo IMAP en aplicaciones clientes de los usuarios
  • spamassassin para controlar el spam
  • procmail para filtrar y clasificar el correo
  • d-push con el que recuperar los email en clientes móviles

Configuración básica local

Ahora que tenemos claro los conceptos vamos a proceder a configurar un servidor de correo de manera que el sistema pueda enviar y recibir email entre cuentas de usuarios, algo que en muchos sistemas viene configurado por defecto. Para ello vamos a usar Postfix como SMTP sobre la distribución Linux Mint 17.1 (derivado de Debian)

Nota: En distribuciones como CentOS o Fedora (derivados de Red Hat) este sistema viene ya preconfigurado para un funcionamiento a nivel local.

En caso de que ya tuviéramos postfix instalado (de lo contrario deberemos de buscarlo por ejemplo con aptitude search postfix, en caso de distribuciones derivadas de Debian, y posteriormente instalarlo con apt-get) pero no configurado haremos:

$ sudo dpkg-reconfigure postfix

Esto volverá a ejecutar el programa de configuración posterior a la instalación de postfix. En el se realizan una serie de preguntas a las que deberemos de responder y con estos datos se creará el archivo de configuración /etc/postfix/main.cf que en caso de tenerlo podemos ahorrarnos el pasar por esta interfaz de menú y editar el archivo directamente. Importante recargar el servicio tras su edición.

Otra manera de efectuar cambios sobre main.cf es a través de la herramienta postconf (herramienta de configuración de postfix) la cual además también nos sirve para ver el valor de los parámetros de configuración o modificarlos. Por ejemplo, para ver el valor de una directiva de main.cf  bastará con pasársela como argumento a postconf, Si queremos cambiarle su valor, lo haremos así ‘postconf -e <directiva=valor>‘. Si queremos ver el valor que trae por defecto cada directiva de main.cf bastará con pasarle el parámetro -d, o -n para listar todas aquellas que tenemos ya configuradas. Con -p  listaremos todas las directivas de configuración de postfix, tanto aquellas a las que no se les ha cambiado su valor como las que si se han modificado. Sobre-escribiremos el valor de una directiva usando -o como opción. Existe otro archivo igual de importante (o incluso mas) que configura el servidor postfix y es master.cf. Para mostrar su contenido usaremos -M,

Las preguntas a contestar (y sus respuestas para mi configuración personal básica) son:

  • Configuración base inicial: solo correo local
  • FQDN: En mi caso no dispongo de dominio así que ‘freeser‘ a secas será el nombre de mi host.
  • Alias para redireccionar el correo de postmaster y root: Yo lo redirecciono todo a mi usuario ‘nebul4ck
  • Lista de dominios separados por comas para los que actuará nuestro servidor: <ok>. Yo la dejo tal cual, básicamente con el nombre de mi host y si tuviese dominio pues lo pondría igualmente.
  • Sincronizar el correo de forma síncrona: <No>. Esto ralentiza el procesado del servicio de correo. Si tenemos un sistema de archivos con journal no tiene por que hacernos falta.
  • Configuración del bloque de red: Para enviar y recibir en equipos de la red sería algo parecido a 192.168.1.0/24 (podemos eliminar la IP IPv6 si no la vamos a utilizar). Yo dejo la que viene por defecto que es para gestionar solo el correo local (127.0.0.1/8)
  • Tamaño máximo del buzón de correo: 0 ilimitado, 51200000 el valor dado por el desarrollador. Esto no tiene que ver con la cuota de correo para cada usuario, para eso deberemos de usar el sistema de Quota Disk que ya hemos estudiado.
  • Elegir un caracter que defina la extensión de dirección local: ‘+ por defecto. Yo lo dejo en blanco.
  • Concretar el protocolo de IP a utilizar: IPv4 en mi caso

Estas preguntas y respuestas lo que hacen es añadir/modificar las siguientes líneas del archivo main.cf, con las que tendremos un sistema igualmente funcional en caso de que queramos hacerlo editando el archivo directamente:

relayhost =
myhostname = freeser
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = nombredetuequipo
mynetworks = 127.0.0.1/8
mailbox_size_limit = 51200000
inet_interfaces = loopback-only
inet_protocols = ipv4

Una vez tenemos la configuración base para postfix vamos a crear un alias para root, recordar que en los pasos anteriores creamos un alias para nuestro usuario de manera que todo el correo de postmaster y root se redirigiera a nuestro usuario, pero al parecer, según el mensaje obtenido tras la configuración: WARNING: /etc/aliases exists, but does not have a root alias. root no tiene alias por lo que deberemos de redirigir todo el correo (incluido el de postmaster) hacia root y entonces el de root será redirigido a nosotros. Para ello editamos el archivo /etc/aliases. Bastará con escribir ‘root: nuestrousuario

Nota: En la sección “Administrando el correo electrónico” veremos como crear alias y redirigir el correo.

Ahora con el archivo /etc/aliases editado, necesitaremos ejecutar el comando newaliases para crear un binario que pueda ser leído por el sistema.

Con esta configuración ya podremos enviar correos entre los usuarios del sistema local o red si hemos configurado el bloque de red de la siguiente manera:

$ mail -s "Asunto" usuariodelsistema@nombredehost

Nota: Si el prompt devolviera el típico “mail: command not found” deberemos de instalar el paquete mailutils que es donde suele encontrarse la utilidad mail.

Tras introducir esta línea nos aparece ‘cc:‘ esto es por si queremos poner en copia a alguien, si no queremos pulsamos <Enter> y a continuación el prompt esperará que introduzcamos texto. Una vez terminado pulsamos Control+D y el email será enviado.

En la sección “Administrando el correo” veremos mas opciones de mail y aprenderemos a gestionar nuestro correo.

Configuración para reenviar correo a un proveedor como gmail

En la sección anterior hemos aprendido a configurar postfix para enviar correo desde una cuenta de nuestro sistema a otra cuenta del mismo sistema u otro dentro de nuestra red local. Lo que haremos ahora será configurar un relay en postfix de manera que podamos reenviar el correo desde nuestra cuenta del sistema a una cuenta propia en un servidor de correo externo como podría ser gmail (para nuestro ejemplo) y que sea esta la que envíe el correo al destinatario. Así podremos salir a Internet fácilmente a través de un proveedor externo.

Para pasar de la configuración de correo local a hacer relay contra por ejemplo gmail las líneas a tener en cuenta y que deberíamos de agregar en caso de no existir en main.cf serían las siguientes:

  • relayhost = [smtp.gmail.com]:587
  • smtp_sasl_auth_enable = yes
  • smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
  • smtp_sasl_security_options = noanonymous
  • smtp_tls_CAfile = /etc/postfix/cacert.pem
  • default_transport = smtp
  • relay_transport = relay

Las modificaciones han sido claras. Estamos indicando que queremos hacer relay contra el servidor SMTP de gmail por el puerto 587, hemos habilitado el mecanismo de autenticación sasl indicando que archivo es el que contiene las credenciales de la cuenta que vamos a usar para hacer el relay con la opción ‘noanonymous‘, se ha referenciado el PATH para el certificado de nuestra máquina y por último se han modificado las directivas default_transpor y relay_transport, ambas con el valor ‘error‘ en nuestra anterior configuración “solo correo local.

Por lo general suelen existir las siguientes líneas en main.cf, de lo contrario (como por ejemplo en CentOS y Fedora) deberemos de añadirla nosotros para habilitar la capa SSL/TLS:

  • smtpd_use_tls = yes
  • smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
  • smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
  • smtp_tls_policy_maps = hash:/etc/postfix/tls_policy

Volviendo a las líneas anteriores, para crear el archivo de credenciales ‘sasl_passwd‘ y hacer que postfix lo reconozca haremos lo siguiente:

1. Crear el archivo con las credenciales:

$ sudo vi /etc/postfix/sasl_passw

2. Añadimos la línea a sasl_passw con los datos de la cuenta:

[smtp.gmail.com]:587 USERNAME@gmail.com:PASSWORD

3. Cambiamos el modo de acceso del archivo a solo lectura para root:

$ sudo chmod 400 /etc/postfix/sasl_passwd

4. Indicamos a postfix que utilice el archivo de credenciales:

$ sudo postmap /etc/postfix/sasl_passwd

Con el archivo de credenciales creado y reconocido por postfix, pasamos a generar un certificado. En Linux Mint contamos con bastantes certificados preinstalados. En concreto nosotros usaremos uno de los que son válidos para gmailThawte_Premium_Server_CA.pm‘:

$ ls -lt /etc/ssl/certs |grep Thawte
 Thawte_Premium_Server_CA.pem -> /usr/share/ca-certificates/mozilla/Thawte_Premium_Server_CA.crt

Por lo que podremos generarlo de la siguiente manera:

$ cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem | sudo tee -a /etc/postfix/cacert.pem

Importante: Igualmente podríamos haber creado nuestro propio certificado, algo que no será útil por ejemplo en CentOS (entre otras) donde no contamos con estos certificados preinstalados. Para crear nuestro propio certificado haremos:

# cd /etc/pki/tls/certs
# make <nombre_host>.pem

Se nos hará una serie de preguntas a las que deberemos de responder, como el País, la Ciudad o Estado, email, etc… luego ya podremos generar nuestro certificado:

# cp /etc/pki/tls/certs/<nombre_host>.pem /etc/postfix/cacert.pem

Nota: Si hemos tenido que crear nuestro propio certificado normalmente en estas distribuciones tendremos que crear un archivo /etc/postfix/tls_policy y seguir los mismos pasos realizados con el archivo /etc/postfix/sasl_passwd solo que el contenido a añadir será:

[smtp.gmail.com]:587     encrypt

Ahora, como ya sabemos, cada vez que modificamos main.cf toca recargar el archivo de configuración o incluso reiniciar el servicio, así que:

$ sudo service postfix reload | restart

Hasta aquí debe de estar todo listo para poder hacer el reenvío. Antes comentamos alguna forma de enviar un correo desde la línea de comandos con mail, aquí mostramos esta otra:

$ echo "Este es mi tercer email" | mail -s "Mi tercer" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

Para ver lo que ha ocurrido como siempre visitaremos nuestro mejor amigo /var/log/mail.log o /var/log/maillog

Podremos encontrar mucha información sobre como configurar el servidor postfix en /usr/share/doc/postfix/

Los servidores de correo proporcionan una amplia variedad de opciones avanzadas para priorizar el envío de correos, aceptar mensajes por la línea de comandos, borrar mensajes específicos de la cola, depurar conexiones de correos y otras muchas opciones que no se han abarcado en esta sección por no extender en demasía el Capítulo, además de no ser el propósito de esta guía de estudios para LPIC-1.

Proteger el servidor

En esta sección no se desarrollarán métodos sobre como securizar nuestro servidor de correos, pero si alguna información importante a tener en cuenta y herramientas que pueden hacernos la vida menos complicada en lo referente a nuestro servidor de correos. Por ejemplo algo con lo que estar familiarizado deben de ser los bugs del propio servidor de correos o herramientas que usemos para dar de alguna forma asistencia o complementación a nuestro servicio de correo. Los bugs pueden poner en peligro el sistema permitiendo a alguien obtener acceso y enviar correos, o como vimos en el Capítulo anterior sobre el diagnóstico de la red, conectándose al puerto 25 (SMTP) mediante un cliente Telnet y escribiendo comandos SMTP para aprovechar la vulnerabilidad. Es por esto que muchas distribuciones de Linux reducen el acceso exclusivamente al ordenador local. Es muy importante instalar los parches que puedan surgir a raíz de bugs encontrados y actualizar el sistema constantemente.

Otro aspecto a tener en cuenta es la configuración. Deberemos de ser conocedores de que parámetros son los que estamos configurando y que valor le estamos dando. Existen configuraciones defectuosas que permiten a spammers utilizar su servidor de correos para enviar email masivos por lo que no tardarán en bloquear nuestra IP o añadirla a listas negras (blacklist). A este tipo de configuraciones se las llama open relay (transmisiones abiertas). La mayoría de distribuciones Linux configuran el servidor de manera que no permita el open relay por lo que de cierta manera podemos andar tranquilos. No obstante deberemos de revisar de que nosotros tenemos la configuración apropiada. Existen varias maneras o sitios en Internet en los que podremos comprobar esto como por ejemplo desde la web http://www.spamhelp.org/shopenrelay, o bien mediante conexión Telnet, conectando a nuestro servidor SMTP por su IP y puerto 25 y enviando comandos SMTP.

Algunas herramientas útiles de cara a la seguridad en sistemas totalmente funcionales de correo electrónico pueden ser: spamassassin (herramienta open source que utiliza una extensa serie de test o reglas tanto a nivel local como de red para identificar firmas de spam en los correos electrónicos.), smapd o greylist (ambas orientadas a reducir el correo spam).

 

Administrar el correo electrónico

Hasta aquí hemos visto algunos aspectos básicos sobre la configuración de un servidor postfix SMTP, de manera que podamos enviar y recibir correos en nuestra máquina local o aquellas que pertenecen a nuestra red, y además como reenviar correo desde nuestra cuenta del sistema hacia una cuenta en un proveedor externo (en nuestro caso gmail) para que sea esta quien entregue el correo del sistema a través de Internet. En las siguientes secciones aprenderemos un uso básico sobre la administración del correo de manera local, como el envío y lectura del correo a través de la línea de comandos, ver la cola de correo y eliminar alguno o todos los correos existente en ella, además de como redirigir el correo entre usuarios de una máquina mediante alias de correo.

Enviar y recibir correo desde la línea de comandos

Linux dispone de una amplia gama de aplicaciones de correo cliente o MUA (Mail User Agent) con las que poder administrar una cuenta. Alguna de estas pudiesen ser Geary, sistema cliente básico para principiantes, Thunderbird, Evolution y KMail, todas ellas disponibles para GUI y orientadas a usuarios mas avanzados, Zimbra, para acceder vía web. Además Zimbra es un paquete Open Source con el que podremos crear y gestionar un servidor funcional completo de correos (SMTP, POP, IMAP…) que incluye otras funcionalidades como la Agenda y el Calendario. Otro cliente con el que podremos enviar y recibir correo pero esta vez desde la línea de comandos es mutt. Mutt es un MUA que soporta protocolos como IMAP y POP para la lectura del correo, así como SMTP para la transferencia. Es bastante configurable y su interfaz está basada totalmente en texto. No obstante en esta sección nos vamos a centrar en la ya mencionada herramienta mail con la que podremos envía correo desde la línea de comandos e incluso leerlos.

La sintaxis básica de mail es la siguiente:

  •  Para enviar un correo:

mai [-v] [-s “asunto”] [-c “dirección con-copia” | -b “dirección con copia oculta”] dirección destinatario

Nota: La opción -c no trabaja en todas las versiones de mail

Anteriormente ya vimos dos formas de enviar un email, bien escribiendo la línea del comando mail la cual nos desplegará un prompt donde introducir texto y finalizar con Control+D o bien mediante el comando echo redireccionado a mail. Otras dos formas de enviar un correo serían:

1. Enviar el contenido de un archivo como correo:

mail -s "Lista de invitados para la fiesta!!" < /home/party/listainvitados.txt Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.

2. Es igual a la opción básica pero en vez de usar Control+D para finalizar, utilizamos una palabra:

mail -s "Tareas por hacer" Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. << EOF
Aqui escribiremos todo lo que queramos
El correo terminará cuando repitamos la palabra con
la que abrimos el contenido de este email
EOF

Nota: Esta última forma es muy útil en correos enviados desde shell scripts.

  • Para leer un correo:

mail  [-v] [-f “/var/mail/<usuario>” | -u <usuario>]

Con -f indicaremos el nombre del archivo de correo de un determinado usuario o bien con -u pasamos directamente el nombre de ese usuario. Otras formas de leer el correo es desplegando el contenido del archivo de correo de un usuario mediante un paginador de archivo o cat, o bien utilizando mail de forma interactiva lo cual conseguiremos llamando a mail sin parámetros.

Cuando usamos mail de forma interactiva lo que hace es desplegar una serie de líneas de resúmenes de mensajes (un resumen de mensaje por línea) con el siguiente formato:

<nº de mensaje> <remitente> <fecha> <nº de líneas>/<nº de bytes> <Asunto>

Deberemos de prestar atención al número de mensaje pues es el que deberemos de introducir para desplegar su contenido. Posteriormente podremos eliminar el mensaje con d o responder a este con r.

Comprobar la cola de correo

El programa mailq es la principal herramienta para administrar la cola de correo. Originalmente este programa formaba parte del paquete sendmail, es por ello que usar sendmail -bp es equivalente a mailq. El comando básico (sin opciones) muestra el contenido de la cola de correo de todos los sistemas.

Podremos vaciar una cola de correos con sendmail -q, postqueue (postfix) o runq (exim). Además en postfix contamos con la utilidad postsuper con la que podremos eliminar toda la cola de correos con ‘-d ALL’ o un solo correo con ‘-d <nº de correo>

Redirigir el correo

Por regla general los servidores de correo mantienen una cuenta propietaria que en la mayoría de los casos se nombra postmaster a la que se le es enviado el correo y cuyo contenido solo debería de ser leído por el administrador del sistema (root). Existe una manera con la que el correo es direccionado o redirigido a otro usuario con el fin de que este pueda leerlo. Para hacer posible esto se cuenta con el archivo aliases que suele encontrarse bajo /etc/ o bajo /etc/mail y que posee un formato sencillo pero eficaz.

Si abriésemos este archivo veríamos una lista de líneas con un formato parecido al siguiente:

# Basic system aliases -- these MUST be present.
mailer-daemon: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
adm: root
...

Este sería el caso mas simple en el que se nombra a postmaster como mailer-daemon y seguidamente se crea el primer alias en el que el correo de postmaster será redirigido a root (postmaster: root). Las siguientes líneas (y algunas mas que faltan) por lo general lo que hacen es que el correo enviado a las cuentas de servicios o programas del sistema sea redirigido a root, de manera que el administrador cuente con la información de todos ellos. Al final de de este archivo podríamos añadir la siguiente línea:

root: nuestrousuario

con lo que estaríamos diciendo que una vez que todo el correo del sistema (servicios y programas) haya sido enviado a root, este sea su vez reenviado a nuestro usuario, con el fin de mantener un control de esta información sin llegar a ser superusuario o poseer los permisos de este.

Además de usar un nombre de usuario del sistema al que redirigir el correo, podremos utilizar un comando por el que canalizar los mensajes ( | ), el nombre de un archivo en el que se encuentran añadidos una serie de direcciones o incluso una cuenta de correo como Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo..

En la mayoría de servidores de correos es un requisito el compilar /etc/aliases a un archivo binario de manera que  pueda ser procesado mas rápidamente. Para esto usaremos el comando ya visto newaliases

Otra manera de redirigir el correo es hacerlo a nivel de usuario, es decir, editando el archivo ~/.forward del directorio principal del usuario de manera que el correo que es enviado a este, sea reenviado a otra cuenta. Para hacer esto basta con editar el archivo con tan solamente el nombre de usuario al que queremos redirigir el correo o bien una cuenta de correo electrónico completa. Este sistema tiene varias ventajas como por ejemplo, el administrador del sistema podría crear por ejemplo una cuenta ‘correos‘ y avisar a todos los usuarios del sistema que hagan el reenvío de su correo a esta cuenta, de forma que el administrador pueda tener el correo de los usuarios de una forma controlada, o bien los usuarios podrán reenviar el correo de varias de sus cuentas a una sola cuenta de usuario o correo sin tener que molestar al administrador.

 

 

Administrar datos con SQL

En las siguientes secciones hablaremos sobre el Lenguaje de consulta estructurado o SQL (Structured Query Languaje) que como su nombre indica es utilizado para obtener datos de una base de datos. Para comenzar a utilizar SQL deberemos de disponer de algún paquete de software que lo implemente. En Linux disponemos de algunos, siendo los mas habituales:

  • MySQL: Este paquete nos ofrece un servidor de BBDD, un cliente para conectar con estas y herramientas de desarrollo. Es un software en propiedad de Oracle el cual se distribuye bajo GPL. La mayoría de las distribuciones de Linux incluyen a MySQL en sus repositorios oficiales.
  • PostgreSQL: Disponible bajo licencia BSD y es una evolución del software Ingres inicial. El nombre de PostgreSQL es la compresión de Post-Ingres SQL. Al igual que MySQL, se encuentra disponible en los repositorios oficiales de las distribuciones Linux.
  • SQLite: Es una biblioteca que implementa SQL. No se trata de un gestor de BBDD independiente, mas bien un procedimiento o medio que permite a un programa almacenar datos utilizando una interfaz SQL del propio programa. Si desea escribir un programa que acceda a BBDD pero instalar un software pesado como MySQL o PostgreSQL resulta excesivo, quizás SQLite sea su solución.

 

Fundamentos de SQL

Desde LPI.org se está planteando la posibilidad de prescindir del contenido sobre gestión de bases de datos y mas concretamente de la herramienta SQL con la que acceder a BBDD relacionales. Es por ello que nos hemos extendido un poco mas en el software del correo electrónico y lo haremos de forma mas breve con respecto a SQL.

SQL permite la gestión de varias BBDD, a su vez estás están formadas por una o mas tablas construidas por filas (tuplas) y columnas (atributos o campos).

Las columnas de una base de datos contienen tipos de datos específicos, ya que no es lo mismo indicar un color (rojo) que un precio (1.99€). Usaremos los tipos de datos específicos para crear restricciones relacionadas, llamadas “dominio” o “tipo de datos“.

Algunos de estos tipos de datos son:

  • INTEGER (INT): Valor entero de cuatro bytes.
  • SMALLINT: Valor entero de dos bytes
  • DECIMAL o NUMERIC: Almacenamiento preciso de valores decimales
  • FLOAT: Número de coma flotante
  • DOUBLE PRECISION: Número de coma flotante almacenado con el doble de precisión que con el que lo hace FLOAT
  • DATETIME: Una fecha y una hora
  • DATE: Una fecha
  • TIME: Una hora en formato HH:MM:SS
  • CHAR: Uno o mas caracteres
  • VARCHAR: Un número variable de caracteres
  • ENUM: Una lista enumerada de datos como pequeño, mediano y grande
  • SET: Datos que pueden tener cero o más valores. Como para un yogurt de macedonia: fresa, plátano, melocotón y pera.

Los datos de una tabla no están ordenados, pero podremos devolver el contenido de una consulta realizada con SQL de forma ordenada y filtrada como veremos en breves.

 

Primeros pasos en una base de datos

Lo primero que debemos de hacer para aprender a utilizar SQL es tener acceso a una base de datos SQL. Nosotros en nuestro ejemplo vamos a utilizar el motor MySQL. Aquí vamos a suponer que tenemos ya instalado el paquete mysql en el que se incluye servidor, cliente y herramientas, y además lo tenemos en ejecución (esto se hace de la misma forma que el resto de servicios Linux).

Para iniciar el cliente mysql basta con llamar a mysql sin parámetro alguno. Esto nos introducirá en un prompt (mysql> ) que al igual que bash esperará a que introduzcamos comandos. Los comandos SQL se suelen escribir en mayúsculas. No es obligación pero si una forma de simplificar o clarificar la lectura de los comandos que normalmente ocupan mas de una línea. Una vez en el prompt de mysql lo primero que debemos de hacer es mostrar las bases de datos existentes. Lo normal es que no haya ninguna creada, pero mysql muy amigo nuestro nos tiene una preparada llamada test con la que podremos iniciarnos.

mysql> SHOW DATABASES;

Es importante fijarnos en como terminamos la línea de comandos. El caracter punto y coma ‘;‘ es el que indica que hemos terminado la línea de comandos, por lo que mientras que este no sea indicado se entenderá que la línea de consulta sigue abierta.

Si queremos crear una base de datos utilizaremos el comando CREATE DATABASE seguido por el nombre de la base de datos:

mysql> CREATE DATABASE animales;

Ahora podremos empezar a usar la tabla con el comando USE:

mysql> USE animales;

Como acabamos de crear la base de datos no existe ninguna tabla. Por ello vamos a crear una tabla con cuatro columnas o campos que servirán para diferenciar unas filas o tuplas de otras que iremos almacenando posteriormente. Por ejemplo:

mysql> CREATE TABLE gatos (nombre VARCHAR(30), raza  VARCHAR(20), fech_nac DATE, precio DECIMAL (4,2));

Con este comando crearemos la tabla ‘gatos‘ como hemos dicho de cuatro campos | id | nombre | raza | fecha de nacimiento | precio |, en la que los dos primeros campos usan un tipo de datos de caracter variable, es decir podrán tener un máximo de 30 y 20 caracteres respectivamente. Si hubiésemos utilizado CHAR tanto los nombres de los gatos como sus razas deberían de tener exactamente 30 y 20 caracteres respectivamente. Para la fecha de nacimiento usamos el tipo DATE y algo a tener en cuenta en el campo ‘precio‘ es que podríamos haber usado el tipo FLOAT pero sin duda para un campo en el que vamos a definir algo tan importante y exacto como es un precio, es preferible utilizar el tipo DECIMAL (mas exacto que FLOAT) con el que se indica los dígitos que irán delante de la coma (4 en este caso) y cuantos decimales tras la coma (2 para nuestro ejemplo). En otros motores de bases de datos existe el tipo MONEY pero MySQL no lo soporta.

Antes de pasar a almacenar datos en la tabla vamos a ver como mostrar las tablas que forma la base de datos:

mysql> SHOW TABLES;

Una vez localizada que tablas forman una base de datos podremos ver los campos que construyen a cada tabla. Vamos a ver por ejemplo que campos (nombre, raza, fecha de nacimiento y precio en nuestro ejemplo)  son la base de la tabla gatos.

mysql> DESCRIBE gatos;

Bueno ahora que hemos localizado nuestra base de datos, hemos creado una tabla y hemos mostrado que campos son los que finalmente hemos añadido, vamos a pasar a almacenar información dentro de estos. Para insertar una tupla en una tabla usaremos el comando INSERT INTO de la siguiente manera:

mysql> INSERT INTO gatos
-> values ('rigodón', 'europeo', '2009-02-28', 23,4);

Bueno ahora supongamos que hemos insertado un dato erróneo, por lo que vamos a actualizar los datos de la tabla con el valor correcto:

mysql> UPDATE gatos SET precio=12.99 WHERE nombre='rigodon';

Esto buscará la tupla que tiene como nombre rigodon y volverá a setear el valor de precio pero esta vez con el valor 12.99. Si existiesen mas de una tupla con nombre rigodon deberemos de añadir mas criterios de filtrado. Podemos conseguir esto con AND y OR. Por ejemplo, vamos a suponer que existen dos filas con el valor rigodon en el campo nombre pero solo una con la fecha de nacimiento 2009-02-28, para localizar esta tupla usaremos la siguiente línea:

mysql> UPDATE gatos SET precio=12.99 WHERE nombre='rigodon' AND fech_nac='2009-02-28';

Como últimos comandos a estudiar en esta sección y no por ello menos importantes son DELETE  y DROP con los que podremos eliminar algunos o todos los datos de una tabla o eliminar la tabla competa respectivamente.

Si queremos eliminar todos los datos de una tabla haremos uso del comodín ‘*‘:

mysql> DELETE * FROM gatos;

Podemos eliminar solo datos específicos así:

mysql> DELETE FROM gatos
-> WHERE raza='persa' OR precio > 21,99;

Nota: Esto eliminará toda las tuplas pertenecientes a gatos cuya raza es ‘persa‘ o tienen un precio superior a 21,99

En ocasiones lo que querremos será borrar una tabla completa (tuplas y campos) ya porque esta no sirva o porque haya tantos datos erróneos o desfasados que ya no nos interesen. En este caso usaremos DROP de la siguiente manera:

mysq> DROP TABLE gatos;

Entre las numerosas posibilidades de manipulación de datos con las que cuenta SQL tenemos la de recuperar datos de distintas tablas y combinarlos, dando como salida una única tabla con los datos necesitados. Para lograr esto, las tablas a combinar deben de tener todas ellas un campo común que pueda ser utilizado para conectarlas y además cada tabla igualmente deberá de tener un campo cuyo valor identifique inequívocamente a cada tupla. A este campo se le llama PK (Primary Key, Clave Primaria).

Antes de nada debemos de conocer el comando SELECT. SELECT nos permite realizar consultas en una base de datos. Será el comando que nos ofrezca la posibilidad de recuperar los datos de las distintas tablas para posteriormente manipularlos o simplemente obtener la información deseada.

La sintaxis básica para SELECT es la siguiente:

SELECT campo(s) FROM tabla [ WHERE condiciones ] [ ORDER BY campo ]

Vamos a recuperar todos los datos de la tabla gatos:

mysql> SELECT * FROM gatos;

Podemos seleccionar uno o varios campos de la siguiente manera:

mysql> SELECT nombre, raza FROM gatos;

Y de la misma manera que ya hemos visto podemos filtrar la consulta con WHERE y ser mas específicos con AND, OR o NOT:

mysql> SELECT * FROM gatos WHERE raza='persa' OR fech_nac>'2008-11-29' AND NOT raza='europeo';

Podemos incluso ordenar la salida por un campo en orden ascendente (ASC) o descendente (DESC). Igualmente podemos sumar (SUM) todos los valores de un campo. Esto último es útil por ejemplo si queremos sumar el precio de todas las mascotas.

mysql> SELECT raza,precio FROM gatos WHERE precio>15.99 GROUP BY precio ASC

Una vez que conocemos el uso básico de SELECT será suficiente para poder combinar la salida de por ejemplo dos tablas. Para combinar tablas podemos usar el mismo comando SELECT aunque se suele emplear JOIN. A continuación veremos un ejemplo, pero antes vamos a hacer un uso sencillo de otro de los comandos que nos ofrece SQL y es ALTER TABLE. Este comando nos permite modificar la estructura de una tabla ya existente, por ejemplo, añadir nuevas columnas o eliminar otras o bien, crear y borrar restricciones. Para ello se permite el uso de palabras reservadas como ADD (añade o modifica una columna), DROP (elimina una columna o restricciones sobre ella), UNIQUE (los datos de cada tupla de la columna serán únicos), PRIMARY KEY (esta columna hará de clave primaria para cada tupla) y CONSTRAINT (añade o elimina una restricción) . ¿ Porque comentamos esto aquí ? – pues porque si hubiésemos seguido los ejemplos que hemos ido realizando, nos daríamos cuenta (en caso de que no hayamos eliminado ya la tabla o base de datos) que cuando creamos la tabla gatos no creamos el campo/columna ‘id’ el cual nos permitirá combinar tablas con SELECT o JOIN. La sintaxis de ALTER es la siguiente:

  • Añadir una columna (para eliminarla usamos la misma sentencia pero cambiamos ADD por DROP):

ALTER TABLE <tabla> ADD [COLUMN] <nombre_columna> <tipo>

  • Añadir una columna con restricciones:

ALTER TABLE <tabla> ADD [COLUMN] <nom_column> <tipo> RESTRICCIONES

  • Añadir restricciones a una columna ya existente:

ALTER TABLE <tabla> ADD [COLUMN] RESTRICCIONES <columna>

Nota: Para eliminar una restricción usamos la sintaxis anterior pero cambiamos ADD por DROP

Antes de pasar al ejemplo que comentábamos sobre la combinación de tablas con SELECT y JOIN vamos a crear definitivamente nuestro campo id en la tabla gatos con las siguientes restricciones: el campo no podra ser nulo (NOT NULL) y nos valdrá como clave primaria (PRIMARY KEY). Será de tipo entero y con un máximo de cuatro dígitos de longitud:

mysql> ALTER TABLE gatos ADD COLUMN id INTEGER(4) NOT NULL PRIMARY KEY;

Aviso: El ejemplo anterior solo ha servidor para mostrar como crear una columna con un nombre y tipo y dos restricciones pero en la práctica obtendremos un error diciendo que no podemos hacer el campo id PK. Esto es porque al ser NOT NULL se le ha asignado el valor 0 a todos y al ser repetido es imposible que sea una clave primaria. Por ello anularemos el PRIMARY KEY, le daremos un valor diferente a cada tupla y a continuación usaremos la siguiente sentencia:

mysq> ALTER TABLE gatos ADD PRIMARY KEY (id);

Ahora que ya tenemos nuestro campo id en la tabla gatos volvamos al ejemplo de combinación de tablas:

Ejemplo: Un veterinario nos pide que saquemos los números de contacto de todos los gatos mayores de cinco años que tienen implantado el chip de reconocimiento y que además estén vacunados.

Lo primero que haremos será localizar las tablas que tengan campos en común y posean el campo PK. Además de esto las tablas deberán de tener la información de si se encuentran vacunados, si existe un número de contacto y la fecha de nacimiento. Vamos a suponer que ya hemos dado con dos tablas que nos serán útiles.

  • La tabla gatos tiene los siguientes campos: id | nombre | raza | fech_nac | precio |
  • La tabla identificación está formada por: num_chip | nombre | vacunado | contacto |

Sabemos que las PK de ambas tablas son ‘id‘ y ‘num_chip‘ y el campo común es ‘nombre‘. Para obtener la información que nos ha pedido el veterinario haremos lo siguiente:

mysql> SELECT gatos.nombre, gatos.fech_nac, identificacion.vacunado, identificacion.contacto
-> FROM gatos, identificacion
-> WHERE gatos.nombre=identificacion.nombre AND gatos.fech_nac<'2010-01-01' AND identificacion.vacunado='si';

Si queremos combinar de la misma forma pero usando JOIN solo existe la diferencia de que una tabla es especificada con FROM y la otra con JOIN:

mysql> SELECT gatos.nombre, gatos.fech_nac, identificacion.vacunado, identificacion.contacto
-> FROM gatos
-> JOIN identificacion
-> WHERE gatos.nombre=identificacion.nombre AND gatos.fech_nac<'2010-01-01' AND identificacion.vacunado='si';

Y hasta aquí todo lo relacionado con la administración de bases de datos. Ha sido un mini tutorial pero como ya indicamos al principio de la sección, este contenido puede quedar obsoleto con respecto a la certificación LPI-1


 

Capítulo 9

 


 

 Notas del autor:

 

 

Licencia Creative Commons
Curso LPIC-1 400 Capítulo 9 por nebul4ck se distribuye bajo una Licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional.

Pin It

Escribir un comentario


Código de seguridad
Refescar



Redes:



 

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

Probablemente te niegues, pero.. ¿Podrías ayudarnos con una donación?


Tutorial de Linux

Filtro por Categorías