Servidores

Corrección de permisos recursivamente mediante PHP

0

A la hora de realizar una mudanza de servidor es posible encontrarse con problemas de permisos que impidan descargar todo el contenido de una web mediante FTP. Por lo general estos problemas son ocasionados cuando hay un administrador de ficheros integrado en la web y el servidor está configurado con PHP estándar, sin el módulo suPHP. En estos casos, todo fichero generado mediante un script tendrá como dueño apache, y con los permisos 600, por lo que no podrá ser descargado mediante FTP.

Para solucionarlo, utilizamos el siguiente fichero PHP:
(más…)

Migración de Plesk para Windows a Plesk para Linux

0

En las últimas versiones de Plesk, Parallels ha incluido una herramienta estupenda que permite realizar migraciones entre servidores Linux, o servidores Windows, e incluso de un servidor Linux a un servidor Windows, utilizando internamente ssh y rsync para realizar el transporte de datos, pero no da la posibilidad de realizar una migración automatizada de Windows a Linux, así que para este caso no ha quedado más remedio que recurrir a procedimientos más artesanales.

El plan consiste básicamente en realizar consultas SQL a la base de datos de Plesk para Windows, a partir de las cuáles se pueda obtener una serie de scripts que utilicen los comandos CLI provistos por Plesk. Una vez replicada la estructura de clientes y dominios, ya se comienza a pasar los datos, vía FTP, del código de las webs, y mediante exports de MySQL para las bases de datos. Para el correo se creó una utilidad en Python que analizaba el fichero AUTH.TAB de MailEnable, generando un script que crea los buzones en Plesk, y después invoca a imapsync para copiar el contenido de los mismos.
(más…)

Sincronización NTP de servidores Windows

4

Para sincronizar cualquier equipo con sistema operativo Windows de escritorio (XP ó 7, principalmente), es tan simple como hacer doble click en la hora de la barra de tareas, ir a la pestaña Hora de Internet, y allí hacer los cambios que se desee. Sin embargo, esta pestaña no está disponible en los sistemas operativos para servidores (comprobado en 2003 y 2008 R2), así que tenemos que recurrir al símbolo de sistema para lograrlo:

El servidor elegido se puede cambiar en el parámetro, por supuesto, pero así de paso veis cuál es el NTP que lleva la hora oficial en España, del Real Instituto y Observatorio de la Armada.

Configuración NTP Windows

Para no tener que teclear tanto, esta es la secuencia de comandos:

net stop w32time
net start w32time
w32tm /config /manualpeerlist:hora.roa.es,0x1 /syncfromflags:MANUAL
w32tm /config /update
w32tm /resync

Como instalar un servidor web en ubuntu 12.04 (Apache, PHP, mySql)

2

A continuación describiremos unos pasos básicos para obtener una instalación básica de un servidor web en nuestra máquina con Ubuntu 12.04

Servidor wen apache php mysqlInstalar Apache

Para esto ejecutaremos desde la consola

sudo apt-get install apache2 -y

Con esto ya deberíamos tener apache configurado. Solo con poner 127.0.0.1 en nuestro navegador debería mostrarse.

Instalar PHP.

Para esto nuevamente desde el terminal ejecutaremos

sudo apt-get install php5 libapache2-mod-php5 -y

Si queremos que apache se de cuenta tendremos que reiniciarlo ejecutando de la consola

sudo /etc/init.d/apache2 restart

Instalar servidor MySQL.

Ejecutaremos desde la consola

sudo apt-get install mysql-server mysql-client -y

Algo mas….

Finalmente instalaremos algunos complementos que siempre viene bien

sudo apt-get install php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl -y

Recuerda volver a reiniciar Apache.

Como apunte breve comentaré unas rutas que tarde o temprano necesitaremos para administrar el servidor

Apache

virtual hosts configurados
/etc/apache2/sites-enabled

el virtual host por defecto
/etc/apache2/sites-available/default

PHP

Archivo de configuración PHP
/etc/php5/apache2/php.ini

MySQL

Archivo global de SQL
/etc/mysql/my.cnf

.bashrc para SSH en Ubuntu

0

Por defecto cuando conectamos a Ubuntu Server por SSH no carga automáticamente el archivo .bashrc de nuestro home.

¿Dónde ponemos los alias entonces?

Debemos crear un archivo .profile en nuestro home (cuyo funcionamiento es el mismo que el antiguo .bash_profile) con el siguiente contenido:

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

De esta forma el archivo .profile será el encargado de buscar el archivo .bashrc y cargarlo en caso de estar disponible.

Traducción de los mensajes de postfix

2

Si estás leyendo esto posiblemente sepas inglés, y quizá también seas administrador de algún sistema de correo. Aunque no lo seas, convendrás en que no todos los usuarios de un servidor de correo tienen por qué saber idiomas, así que cuando reciben un mensaje de un tal MAILER-DAEMON, lo primero que hacen es pensar que hay un error en el sistema y llamar directamente al informático, aunque el mensaje sea una confirmación de entrega con un gran successful en el asunto. Es por esto que conviene traducir estos mensajes, o mejor aun mantener el inglés pero añadir el castellano en ellos. Esto se puede hacer fácilmente en postfix, utilizando un fichero de plantilla, siguiendo estos pasos:

Primero averiguamos dónde está la configuración de postfix y el fichero de plantilla:

postconf -n | grep config_directory
postconf -n | grep bounce_template_file

Si ya tenemos un fichero de plantilla, simplemente sustituimos el contenido por el que adjuntamos poco después. Si no lo tenemos configurado, modificamos el fichero main.cf, añadiendo una línea:

bounce_template_file = /etc/postfix/bounce.es-ES.cf

Y creando el fichero /etc/postfix/bounce.es-ES.cf, con el siguiente contenido:

#
# The failure template is used when mail is returned to the sender;
# either the destination rejected the message, or the destination
# could not be reached before the message expired in the queue.
#

failure_template = <<EOF
Charset: utf-8
From: MAILER-DAEMON (Sistema de entrega de correo)
Subject: Servidor de correo: Mensaje no entregado
Postmaster-Subject: Servidor de correo: Mensaje no entregado

Este es un mensaje de correo enviado automáticamente por el servidor de
correo $myhostname.

No ha sido posible entregar su mensaje a uno o más destinatarios. El
mensaje que causó el error está adjunto a este mensaje.

Para más información o cualquier duda, por favor, envíe un mensaje al
administrador del sistema en <postmaster>.

En tal caso incluya adjunto este mensaje de informe. Puede eliminar el
texto del mensaje original que considere, aunque le recomendamos que
mantenga intacto el texto de este informe.

-------------------------------------------------------------------------------

This is the mail system at host $myhostname.

I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.

For further assistance, please send mail to <postmaster>

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

                   The mail system
EOF

#
# The delay template is used when mail is delayed. Note a neat trick:
# the default template displays the delay_warning_time value as hours
# by appending the _hours suffix to the parameter name; it displays
# the maximal_queue_lifetime value as days by appending the _days
# suffix.
#
# Other suffixes are: _seconds, _minutes, _weeks. There are no other
# main.cf parameters that have this special behavior.
#
# You need to adjust these suffixes (and the surrounding text) if
# you have very different settings for these time parameters.
#

delay_template = <<EOF
Charset: utf-8
From: MAILER-DAEMON (Sistema de entrega de correo)
Subject: Servidor de correo: Mensaje pospuesto
Postmaster-Subject: Servidor de correo: Mensaje pospuesto

Este es un mensaje de correo enviado automáticamente por el servidor de
correo $myhostname.

###########################################
# ÉSTE ES SÓLO UN MENSAJE DE AVISO.       #
# NO ES NECESARIO QUE REENVÍE EL MENSAJE. #
###########################################

Su mensaje no pudo ser entregado al destinatario después de intentarlo
durante $delay_warning_time_hours hora(s).
Se seguirá intentando enviar el mensaje hasta que pasen
$maximal_queue_lifetime_days días.

Para más información o cualquier duda, por favor, envíe un mensaje al
administrador del sistema en <postmaster>.

En tal caso incluya adjunto este mensaje de informe. Puede eliminar el
texto del mensaje original que considere, aunque le recomendamos que
mantenga intacto el texto de este informe.

-------------------------------------------------------------------------------

This is the mail system at host $myhostname.

####################################################################
# THIS IS A WARNING ONLY.  YOU DO NOT NEED TO RESEND YOUR MESSAGE. #
####################################################################

Your message could not be delivered for $delay_warning_time_hours hour(s).
It will be retried until it is $maximal_queue_lifetime_days day(s) old.

For further assistance, please send mail to <postmaster>

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

                   The $mail_name program
EOF

#
# The success template is used when mail is delivered to mailbox,
# when an alias or list is expanded, or when mail is delivered to a
# system that does not announce DSN support. It is an error to specify
# a Postmaster-Subject: here.
#

success_template = <<EOF
Charset: utf-8
From: MAILER-DAEMON (Sistema de entrega de correo)
Subject: Servidor de correo: Informe de entrega correcta de mensaje

Este es un mensaje de correo enviado automáticamente por el servidor de
correo $myhostname.

Su mensaje fue entregado correctamente al/a los destinatario/s indicados a
continuación. Si el mensaje fue entregado directamente a los destinatarios,
no recibirá más notificaciones; en caso contrario, si el mensaje tuviera que
pasar por más servidores de correo, es posible que reciba más notificaciones
de estos servidores.

-------------------------------------------------------------------------------

This is the mail system at host $myhostname.

Your message was successfully delivered to the destination(s)
listed below. If the message was delivered to mailbox you will
receive no further notifications. Otherwise you may still receive
notifications of mail delivery errors from other systems.

                   The mail system
EOF

#
# The verify template is used for address verification (sendmail -bv
# address...). or for verbose mail delivery (sendmail -v address...).
# It is an error to specify a Postmaster-Subject: here.
#

verify_template = <<EOF
Charset: utf-8
From: MAILER-DAEMON (Sistema de entrega de correo)
Subject: Servidor de correo: Informe de estado de entrega de mensaje

Este es un mensaje de correo enviado automáticamente por el servidor de
correo $myhostname.

Adjunto a este mensaje se encuentra el informe de entrega solicitado.

-------------------------------------------------------------------------------

This is the mail system at host $myhostname.

Enclosed is the mail delivery report that you requested.

                   The mail system
EOF

Como dato extra, es posible que también quieras modificar el remitente de dichos correos, que suele ser MAILER-DAEMON@hostname. Esto, como bien se apunta aquí, se soluciona modificando el fichero /etc/mailname en sistemas Debian, como Ubuntu.

Por último, recargamos la configuración de postfix para que sea efectivo el cambio:

postfix reload

Instalación simple de mod_security en Plesk 10 para Ubuntu

2

Uno de los sistemas para minimizar las posibilidades de éxito de los intentos de ataque a los servidores, a nivel de aplicación, es ModSecurity. Con él podemos dormir un poquito más tranquilos, sabiendo que vamos a estar más protegidos de los ataques de inyección SQL, fuerza bruta o vulnerabilidades conocidas.

Lamentablemente, parece que por cuestiones de licencia, ya no se siguen generando los binarios en paquetes Debian, por lo que el método recomendado de instalación es compilar a partir del código fuente, pero esto necesita un cambio en el servidor Apache que viene con Plesk 10 para Ubuntu, así que mejor dejamos la última versión disponible instalable con apt, y procedemos con:

apt-get install libapache-mod-security

Esto nos dejará instalados y activados los módulos mod_security2 y mod_unique_id, con sus enlaces en /etc/apache2/mods-enabled. Ahora necesitamos un conjunto de reglas para ModSecurity, y las que vamos a utilizar son las gratuitas de Atomicorp, los editores de ASL, que las ofrecen con un retraso de 90 días sobre las de pago, disponibles en http://updates.atomicorp.com/channels/rules/delayed/. Las descargamos y descomprimimos en /etc/apache2/modsecurity.d:

mkdir /etc/apache2/modsecurity.d
wget http://updates.atomicorp.com/channels/rules/delayed/modsec-2.5-free-latest.tar.gz
tar xvf modsec-2.5-free-latest.tar.gz

Ahora creamos un fichero de configuración, también en /etc/apache2/modsecurity.d, llamado modsecurity_crs_10_config.conf, con el siguiente contenido:

SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType (null) text/html text/plain text/xml
SecResponseBodyLimit 2621440
SecServerSignature Apache
SecComponentSignature 200911012341
SecUploadDir /var/asl/data/suspicious
SecUploadKeepFiles Off
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLogType Concurrent
SecAuditLog /var/log/apache2/modsecurity/audit_log
SecAuditLogParts ABIFHZ
SecArgumentSeparator "&"
SecCookieFormat 0
SecRequestBodyInMemoryLimit 131072
SecDataDir /var/asl/data/msa
SecTmpDir /tmp
SecAuditLogStorageDir /var/asl/data/audit
SecResponseBodyLimitAction ProcessPartial

#SecPcreMatchLimit  100000
#SecPcreMatchLimitRecursion 100000

SecDebugLog /var/log/apache2/modsecurity/modsec_debug_log
SecDebugLogLevel 3

Atención a las carpetas especificadas para las estructuras de datos necesarias para ModSecurity, que deben existir y Apache tener permiso sobre ellas, por lo que ejecutamos:

mkdir /var/asl /var/asl/data /var/asl/data/audit /var/asl/data/msa /var/asl/data/security
chown -R www-data:www-data /var/asl/data/

Por último, creamos un fichero 00_modsecurity.conf en /etc/apache2/conf/, con ese nombre para que cargue el primero, activando las reglas que deseemos, que en nuestro caso son las siguientes:

LoadModule security2_module modules/mod_security2.so
LoadModule unique_id_module modules/mod_unique_id.so

  # Todas + exclusiones personalizadas:
  Include /etc/apache2/modsecurity.d/00_asl_0_global.conf
  Include /etc/apache2/modsecurity.d/00_asl_custom_exclude.conf
  # Quitamos RBL porque coge las IPs incorrectamente, como desordenadas
  #Include /etc/apache2/modsecurity.d/00_asl_rbl.conf
  #Include /etc/apache2/modsecurity.d/00_asl_whitelist.conf
  # Esta sólo funciona con ModSecurity > 2.6.1
  #Include /etc/apache2/modsecurity.d/00_asl_z_antievasion.conf
  Include /etc/apache2/modsecurity.d/00_asl_zz_strict.conf
  Include /etc/apache2/modsecurity.d/05_asl_exclude.conf
  # No tenemos el CLAM antivirus instalado
  #Include /etc/apache2/modsecurity.d/05_asl_scanner.conf
  Include /etc/apache2/modsecurity.d/09_asl_rules.conf
  Include /etc/apache2/modsecurity.d/09_asl_rules_antievasion.conf
  Include /etc/apache2/modsecurity.d/10_asl_antimalware.conf
  Include /etc/apache2/modsecurity.d/10_asl_antimalware_output.conf
  Include /etc/apache2/modsecurity.d/10_asl_rules.conf
  Include /etc/apache2/modsecurity.d/11_asl_data_loss.conf
  Include /etc/apache2/modsecurity.d/12_asl_brute.conf
  Include /etc/apache2/modsecurity.d/20_asl_useragents.conf
  Include /etc/apache2/modsecurity.d/30_asl_antimalware.conf
  Include /etc/apache2/modsecurity.d/30_asl_antispam.conf
  Include /etc/apache2/modsecurity.d/30_asl_antispam_referrer.conf
  Include /etc/apache2/modsecurity.d/40_asl_apache2-rules.conf
  Include /etc/apache2/modsecurity.d/50_asl_rootkits.conf
  Include /etc/apache2/modsecurity.d/60_asl_recons.conf
  Include /etc/apache2/modsecurity.d/61_asl_recons_dlp.conf
  Include /etc/apache2/modsecurity.d/98_asl_jitp.conf
  Include /etc/apache2/modsecurity.d/99_asl_exclude.conf
  Include /etc/apache2/modsecurity.d/99_asl_jitp.conf
  Include /etc/apache2/modsecurity.d/99_asl_redactor.conf
  # No tenemos el CLAM antivirus instalado
  #Include /etc/apache2/modsecurity.d/99_asl_scanner.conf

Vamos, prácticamente todas, menos la que da problemas por la versión de ModSecurity, que no es la 2.6.1 o superior, las de listas negras y las del antivirus CLAM.

Ya está todo listo. Comprobamos que la configuración de Apache es correcta con

apache2ctl configtest

Y si lo es, reiniciamos apache con

apache2ctl graceful

Hale, ya podemos empezar a ver correr en /var/log/apache2/modsecurity/audit_log la lista de peticiones bloqueadas.

Actualización: Cómo desactivar reglas

 

Es muy posible que tengamos que desactivar algunas reglas al encontrarnos con falsos positivos, mostrando errores 403 cuando los permisos y el código están perfectamente. En nuestro caso, al alojar tiendas, algunos TPVs virtuales dan problemas, así que decidimos desactivar globalmente. Para esto, se modifica el fichero /etc/apache2/modsecurity.d/00_asl_custom_exclude.conf, añadiendo el siguiente contenido:

<LocationMatch .*>
  <IfModule mod_security2.c>
    SecRuleRemoveById 350147
    SecRuleRemoveById 350148
  </IfModule>
</LocationMatch>

Al modificar el fichero de configuración global y utilizar .* como patrón, indicamos que para cualquier dominio y URL alojada en el servidor no queremos que se tengan en cosideración esas reglas. También podemos modificar una regla para un dominio en particular, modificando el fichero vhost.conf que Plesk utiliza para este menester, y regenerando la configuración, por supuesto.

Integración de Roundcube con Plesk 10

1

If you prefer to read this post in english, click here.

Como ya hemos comentado en anteriores ocasiones, los webmails incluidos con Plesk 10 no eran de nuestro agrado, así que cuando sustituímos Plesk 9.5 Windows por Plesk 10.3 Linux, decidimos cambiarlo por Roundcube. El problema ha sido que los usuarios han echado de menos cierta funcionalidad de la que disponían con MailEnable, pero lo hemos podido solventar mediante el desarrollo de plugins o drivers para plugins ya existentes, que queremos publicar:

Función Descripción Descarga
Cambio de contraseña Driver para el plugin Password, que permite cambiar la contraseña del buzón utilizando la utilidad CLI mail, provista en Plesk 10.3. Enlace
Mensaje fuera de oficina Driver para el plugin Vacation, que permite establecer una respuesta automática a los correos recibidos, y de forma opcional, reenviar el correo a un tercero, utilizando la utilidad CLI autoresponder, provista en Plesk 10.3. Enlace
Redireccionamiento Plugin nuevo, desarrollado a partir de Vacation, que permite especificar varias direcciones e-mail a las que se reenviarán los correos recibidos, utilizando la utilidad CLI mail, provista en Plesk 10.3. Enlace

Todos los desarrollos asumen que Roundcube se está ejecutando en el mismo servidor que Plesk, y precisan de permisos de ejecución de las utilidades CLI para el usuario que esté ejecutando Apache. La ventaja de llamar nativamente a Plesk es que los cambios realizados en el panel se ven en el webmail, y viceversa, además de que se incluyen en la copia de seguridad de Plesk.

Roundcube and Plesk 10 integration

16

Si prefiere leer esta entrada en castellano, pulse aquí.

As mentioned previously, webmails included with Plesk 10 were not to our liking, so when we switched from Plesk 9.5 Windows to Plesk 10.3, we decided to replace them with Roundcube. The problem was that users have missed some functionality available with MailEnable, but we were able to solve by developing plugins or drivers for existing plugins which we want to publish:

Function Description Download
Password change Driver for Password plugin, which lets users change mailbox password using the CLI utility mail, provided in Plesk 10.3. Link
Vacation message Driver for Vacation plugin, which lets users define an automatic reply to received emails, and optionally, forward emails to third parties, using the CLI utility autoresponder, provided in Plesk 10.3. Link
Forward New plugin, developed from Vacation code, which lets users specify multiple e-mail addresses to which incoming e-mail will be forwarded, using the CLI utility mail, provided in Plesk 10.3. Link

All developments assume that Roundcube is running on the same server as Plesk, and require execute permissions over CLI utilites for user running Apache. The advantage of call natively Plesk through his CLI is that changes made in the panel are shown in the webmail, and vice versa, in addition to being included in the Plesk backup.

Update 23/12/2011: Changed link for Vacation message to GitHub repository, where latest version should be found, with contributions from other authors.

Scripts y consultas SQL interesantes de Plesk 10

0

¿Un cliente llama con problemas en uno de sus buzones de correo? No hay problema. En lugar de ir preguntando la contraseña, podemos averiguarla nosotros mismos, utilizando uno de los scripts que el CLI de Plesk 10 incorpora, así que accedemos por SSH a nuestro servidor y lo lanzamos. En esta entrada iremos actualizando con los scripts que veamos interesantes, conforme los vayamos descubriendo.

/usr/local/psa/admin/bin/mail_auth_view: Muestra en la salida estándar una tabla con todos los buzones de correo, el estado de la cuenta y la contraseña.

mysql -uadmin -p`cat /etc/psa/.psa.shadow` -e "use psa; select sys_users.home, sys_users.login, accounts.password from accounts INNER JOIN sys_users ON accounts.id=sys_users.account_id;": Muestra una lista de los usuarios y contraseñas FTP, el directorio raíz (que nos da una pista del dominio o subdominio al que acceden), y su contraseña.

mysql -uadmin -p`cat /etc/psa/.psa.shadow` -e "USE psa; SELECT domains.name AS domain_name, data_bases.name AS database_name, db_users.login, accounts.password FROM data_bases, db_users, domains, accounts WHERE data_bases.dom_id = domains.id AND db_users.db_id = data_bases.id AND db_users.account_id = accounts.id ORDER BY domain_name;": Muestra una lista con el dominio, nombre de la base de datos, usuario y contraseña de todas las bases de datos registradas en Plesk.

for i in `mysql -uadmin -p\`cat /etc/psa/.psa.shadow\` psa -Ns -e "select concat(mail.mail_name,\"@\",domains.name) as address from mail,domains,accounts where mail.dom_id=domains.id and mail.account_id=accounts.id order by address"`; do /usr/local/psa/bin/spamassassin -u $i -status true -action move -modify-subj false; done: Activar el sistema de detección de correo basura Spamassassin en todas las cuentas, configurado para mover los mensajes sospechosos a una carpeta específica y sin modificar el asunto.

mysql -uadmin -p`cat /etc/psa/.psa.shadow` -e "USE psa; SELECT cl.type, cl.login, acc.password FROM clients cl, accounts acc WHERE acc.id = cl.account_id;": Obtiene todos los nombres de usuario y contraseñas de clientes y revendedores.

Go to Top