Vicente
This user hasn't shared any profile information
Posts by Vicente
Corrección de permisos recursivamente mediante PHP
0A 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
0En 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
4Para 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.
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
Renombrar archivos masivamente
1De vez en cuando suele surgir la problemática: en una colección de fotos, con documentos almacenados en la empresa, los trabajos de la carrera… Necesitamos ir organizándolos, y es posible que los tengamos ya organizados, pero en un momento dado preferimos cambiar algo de la organización. Ahí es donde podemos echar mano de Rename Expert, la mejor aplicación con que me he cruzado para este fin.
Se puede realizar un filtrado por multitud de conceptos, tanto sobre el nombre y ruta del fichero como sobre el contenido. Por nombrar algunos:
- Longitud del nombre del fichero.
- Ancho de la imagen contenida.
- Datos de la cámara con que se realiza la fotografía.
- Título de la canción según ID3.
- Autor del texto del PDF.
Después, para los ficheros que cumplan el filtro se pueden definir acciones que no se limitan a jugar con el nombre, como pueden ser:
- Mover el fichero.
- Recuperar el nombre de una lista CSV.
- Encriptación de los nombres de archivo por contraseña.
En definitiva, tras probar unos cuantos, el mejor que he encontrado. Eso sí, sólo Windows.
Espera, ¿que no quieres pagar por el renombrador? Pues nada, hay una alternativa, pero no es tan estética e intuitiva: Bulk Rename Utility.
No me ha hecho falta, así que no he buscado mucho, pero creo que tampoco puede lidiar con MP3, JPG y PDF. Lo que sí hace perfectamente es trabajar con las longitudes de nombres y tratar la generación de duplicados.
Traducción de los mensajes de postfix
2Si 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
Conexión fácil de IIS con Tomcat
2Si se quieren procesar páginas JSP y ASP.NET en un mismo servidor no queda más remedio que tener instalados Tomcat e IIS simultáneamente. Si además queremos que las páginas se sirvan por el mismo puerto, que generalmente suele ser el 80, pues ya tenemos un problema. Existen conectores ISAPI que permiten reenviar las peticiones JSP del IIS al Tomcat, como hace el Plesk 9 para Windows, pero siempre los he encontrado complejos de configurar. Sin embargo, en la última instalación de Windows Server 2008 R2 que hemos realizado, hemos encontrado un nuevo conector que simplifica enormemente el trabajo, permitiendo realizarlo en dos pasos.
Partiremos de una instalación funcional de IIS 7.5 en el puerto web estándar, y de Tomcat 7.0.25 en el puerto 8080 con AJP en el puerto 8009. Si no sabes cómo llegar a este punto, mal empezamos…
Supondremos que la web JSP que queremos alojar está en
C:\inetpub\wwwroot\miwebaspxjsp.com\partejsp
. En tal caso, lo primero que haremos será hacer que Tomcat conozca dicho código, creando un fichero XML en %CATALINA_HOME%\conf\Catalina\localhost
, con nombre partejsp.xml
, y con el siguiente contenido:
<Context displayName="partejsp" docBase="C:\inetpub\wwwroot\miwebaspxjsp.com\partejsp" path="/partejsp" reloadable="true" />
Ahora vamos a la URL http://miwebaspxjsp.com:8080/partejsp
, y deberíamos ver el contenido servido directamente por Tomcat correctamente. Si no es así, toca revisar las rutas y reiniciar el servicio Tomcat.
Sin embargo, si vamos a la URL http://miwebaspxjsp.com/partejsp
, obtendremos un precioso error 404.3, ya que IIS no sabe cómo interpretar el script y además no nos permite descargarlo al no conocer el tipo MIME del fichero.
Ahora la parte mágica: Descarga el proyecto IIS to Tomcat Connector de Bilal. En él encontrarás un instalador que a partir de unos datos mínimos de configuración se encargará de registrarse en el IIS, pudiendo limitarse a los sitios que se le indique, de forma que no haya que configurar nada más que el nuevo documento por defecto index.jsp
.
Tras la instalación, prueba de nuevo la URL http://miwebaspxjsp.com/partejsp
, y si todo ha ido correctamente, ya se debería mostrar exactamente lo mismo que accediendo a http://miwebaspxjsp.com:8080/partejsp
.
Como limitación, indicar que con este sistema siempre se cargaría la web JSP como subdirectorio, en la URL http://www.miwebaspjsp.com/partejsp/
. Seguramente se podrá solucionar, pero como no lo hemos necesitado, no he investigado más.
Actualización: Cómo hacerlo funcionar en el raíz y con servlets
Para hacerlo funcionar en el raíz del dominio, podemos utilizar el módulo URL Rewrite de IIS, similar al mod_rewrite de Apache, de forma que redirijamos todas las peticiones a una subcarpeta, y así no tenemos que pelear tanto con la configuración. También debemos preservar la ruta de la cookie, para evitar problemas con las sesiones, con una segunda regla. Quedaría en web.config más o menos así:
<rewrite> <rules> <rule name="Reescribimos a subcarpeta" enabled="true"> <match url="^(.*)" /> <action type="Rewrite" url="carpetaconjsp/{R:1}" /> </rule> </rules> <outboundRules> <rule name="Reescribimos la ruta de la cookie de sesión"> <match serverVariable="RESPONSE_Set_Cookie" pattern="^(.*); Path=/carpetaconjsp(.*)" /> <action type="Rewrite" value="{R:1}; Path={R:2}" /> </rule> </outboundRules> </rewrite>
Igualmente, si utilizamos servlets, habrá que modificar el manejador por defecto, para que IIS no salte con un 404 si no se llama a algo que no sea un JSP, quedando el siguiente código en web.config:
<handlers> <add name="Boncode" path="*" verb="*" type="BonCodeIIS.BonCodeCallHandler,BonCodeIIS,Version=1.0.0.0,Culture=neutral,PublicKeyToken=ad590a40d40745cf" resourceType="Unspecified" preCondition="integratedMode" /> </handlers>
Reparación de inicio de Windows 7 tras cambiar la placa base
23Cuando se actualiza “a lo bestia” el hardware sobre el que corre Windows 7, pueden ocurrir problemas serios, como que Windows se niegue a arrancar, mostrando un BSOD con el código 0x0000007B, que viene a indicar que el sistema operativo no es capaz de acceder al disco. Sobre todo suele ocurrir cuando se cambia el chipset de la placa, o se pasa de modo IDE a AHCI. El problema es debido a que para optimizar el arranque del sistema operativo, se desactivan algunas detecciones de controladores tras la instalación, con lo que al realizar el cambio, pues Windows no es capaz de volver a arrancar.
Para solucionarlo, tendremos que reactivar dichos controladores, como bien se explica en el KB922976, bien restaurando momentáneamente el hardware original, o mediante las herramientas de reparación integradas en el DVD de Windows 7 (en el símbolo de sistema podemos ejecutar RegEdit), o incluso utilizando un editor de registro offline, como el incluido con UBCD4Win. Las claves que debemos modificar son:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msahci
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\IastorV
Poniendo en ambas el valor de Start
a 0
.
Eliminación de valores por defecto establecidos en el cliente OpenERP mediante SQL
0OpenERP tiene una función bastante cómoda, que permite establecer valores por defecto en el cliente web o GTK. Esto es muy útil para definir el país más utilizado al dar de alta un nuevo partner, o para establecer los impuestos más comunes al crear un nuevo producto.
Sin embargo, si se utiliza a la ligera puede dar problemas, como por ejemplo si decidimos que las nuevas líneas de factura tengan un impuesto por defecto. Al principio puede parecer que es una maravilla, hasta que queremos introducir una factura de proveedor y comprobamos que si no tenemos cuidado, vamos a asignarle el mismo IVA repercutido de las facturas de clientes, cuando debería ser IVA soportado. A la hora de deshacerlo, se pueden eliminar las líneas de impuestos y establecer de nuevo el valor con el asistente, o bien modificar directamente la base de datos.
Así, para eliminar la opción comentada de unos impuestos por defecto en la línea de factura, esta es la sentencia SQL a utilizar:
DELETE FROM ir_values WHERE name = 'invoice_line_tax_id'
‘NoneType’ object has no attribute ‘id’ en OpenERP, al cambiar el partner de la factura
0Como no estoy seguro de si es realmente un bug o un problema con los datos de prueba, lo anoto en este blog, pero no paso informe en Launchpad, que es donde debería, pero el caso es que he detectado este problema utilizando la versión 6.0.3 de OpenERP con los módulos de la localización española y nan_account_extension instalados, siempre que se introduce un cliente en la factura.
Para solucionarlo, basta con modificar la línea 395 de invoice.py en el módulo account:
if p.property_account_receivable and (p.property_account_receivable.company_id.id != company_id) and p.property_account_payable and (p.property_account_payable.company_id.id != company_id):
De esta forma, antes de utilizar las cuentas a cobrar y a pagar del partner, se comprueba que estén definidas, que es lo que estaba dando problemas, aunque entiendo que no debería, al tener instalado el módulo de NaN que en principio las gestiona debidamente.
Instalación simple de mod_security en Plesk 10 para Ubuntu
2Uno 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.