url seguras en apache2 con mod_auth_token

A veces el publicar en nuestra web algo para que la gente se descargue, puede provocar que si el link es publicado en algun sitio, puede generar un exceso de trafico en nuestros servidores por una descarga masiva.
El modulo de apache2 mod_auth_token, nos puede ayudar a generar uris temporales para limitar en el tiempo y en base a la IP de origen la url generada.
http://code.google.com/p/mod-auth-token/

Para poder compilar el modulo tenemos que instalar algunos paquetes, si no los tenemos instalados ya

root@lnxport:~# apt-get install apache2-prefork-dev autoconf automake  libtool

Ahora nos descargamos el modulo y lo instalamos

root@lnxport:~# wget http://mod-auth-token.googlecode.com/files/mod_auth_token-1.0.5.tar.gz
root@lnxport:~# tar xvfz mod_auth_token-1.0.5.tar.gz
root@lnxport:~# cd mod_auth_token-1.0.5

Como el modulo puede haberse generado por el autor con una version diferente de automake para que nos compile tenemos que ejecutar el script buildconf que hay en el directorio antes de hacer el configure

root@lnxport:~/mod_auth_token-1.0.5# ./buildconf
root@lnxport:~/mod_auth_token-1.0.5# ./configure
root@lnxport:~/mod_auth_token-1.0.5# make
root@lnxport:~/mod_auth_token-1.0.5# make install

Si todo ha ido bien, nos dira que ha instalado y activado el modulo. Ahora debemos configurar apache para que use el modulo. Añadimos la siguiente configuración en el virtualhost de nuestro apache2

root@lnxport:~# vi /etc/apache2/sites-enabled/000-default

   AuthTokenSecret       "clavesecreta"
   AuthTokenPrefix       /downloads/
   AuthTokenTimeout      60
   #AuthTokenLimitByIp    off

Seguir leyendo

chroot con sftp y sshd

Hace ya muchos años, muchos vimos como iban desapareciendo los accesos por telnet a las maquina unix y se sustituia por un acceso encriptado, el cual nos obligaba a cambiar nuestro terminal, ya que por los años 90 no existian demasiados clientes ssh. Para windows aparecio el famoso putty.

SSH aparte de permitir el acceso remotamente a un tty de una maquina unix, implementa sftp, el cual permite la transferencia de archivos mediante los mismos comandos que ftp, pero mediante un canal encriptado.
Cuando necesitamos dar acceso a nuestras maquinas por sftp, la mayoria de los caso queremos que el usuario que lo usa, no pueda andar por nuestras maquinas a sus anchas, por lo que vamos a ver como hacer un chroot a tambien llamado jail o jaula.

Cuando creamos un chroot, lo que hacemos es encerrar al usuario en una parte del sistema de archivos, haciendole creer que se encuentra en el raiz de sistema y aunque intente ir para atras con un cd .. seguira en el mismo sitio.

Primero creamos el directorio donde queremos hacer el chroot y le cambiamos los permisos para que sean de root el propietario, tambien creamos un usuario webuser, con el home en / y como shell /bin/false, para que no pueda entrar por ssh a la maquina.

root@lnxport:~# mkdir /chroot
root@lnxport:~# chown root /chroot/
root@lnxport:~# useradd -d / -s /bin/false webuser
root@lnxport:~# passwd webuser
Introduzca la nueva contraseña de UNIX: 
Vuelva a escribir la nueva contraseña de UNIX: 
passwd: password updated successfully

Seguir leyendo

solr – gestion de cores y cambio de indices online

Hace unos días os hable de Solr, un motor de búsqueda hecho en java basado en Lucene.
Una de las nuevas funcionalidades que han implementado ha sido el soporte para manejar diferentes cores. Los cores en solr son diferentes instancias del buscador que funcionan completamente independientes dentro del contenedor J2EE, con sus propios indices, configuración, etc
Esto nos va a permitir crear, recargar, clonar, renombar y cambiar los cores completamente online, sin interrumpir el servicio en ningun momento

Supongamos que tenemos que hacer una reindexacion completa de los datos de nuestro buscador porque hemos cambiado los campos, pero no queremos dejar de dar servicio.

Para configurar solr para soportar multicore, tenemos que crear en el directorio principal un archivo llamado solr.xml, con el siguiente formato:


  
    
  

Es importante persistence=true para permitir al servidor tomcat modificar el propio solr.xml para guardar los cambios que le vamos a ordenar por http.
Ahora iniciamos solr y vemos el status de los cores:

http://localhost:8080/solr/admin/cores

En esta url nos dara los datos en formato xml de todos los cores disponibles asi como informacion del numero de documentos, si esta optimizado el indice, etc.



0
1



core0
/opt/tomcat/solr/core0/
/opt/tomcat/solr/core0/data/
2011-04-30T00:32:55.975Z
1082425

0
0
1304123575977
false
true
false
org.apache.lucene.store.NIOFSDirectory:org.apache.lucene.store.NIOFSDirectory@/opt/tomcat/solr/core0/data/index
2011-04-30T00:32:55Z





Ahora creamos una copia del directorio base de nuestro y decimos a solr que cree un core con el:

root@lnxport:/opt/tomcat/solr# cp -R core0/ coretemp
root@lnxport:/opt/tomcat/solr# curl "http://localhost:8080/solr/admin/cores?action=CREATE&name=coretemp&instanceDir=coretemp"

Seguir leyendo

ejecutar comandos como root con sudo

Cuando tenemos que realizar determinadas tareas en nuestras maquinas linux como root, si no tenemos acceso al superusuario, tendremos que pedirle al administrador que nos permita hacerlo. Si ademas necesitamos hacerlo dentro de un script, por ejemplo para un proceso de monitorización, lo mejor seria no tener que poner un password.

Para hacer esto existe sudo, un comando que se usa mucho, ya que la mayoría de las distribuciones ubuntu, te crean un usuario que tienen acceso a todo mediante sudo.

El archivo de configuración de sudo es /etc/sudoers pero por algun motivo que desconozco, no se puede editar directamente con nuestro editor favorito, si no que tenemos que usar el comando visudo

root@lnxport:~# visudo
root@lnxport:~# man sudoers

Las opciones son muchas, asi que voy a explicar un ejemplo para que se entienda.
Imaginemos que tenemos una aplicacion web que cambia las contraseñas de los usuarios, pero nuestro apache corre como usuario sin privilegios, por lo que no puede ejecutar el comando passwd para cambiar las de otros usuario. Pero tampoco queremos que pudieran cambiar el passwd del root. ejecutamos visudo y pomemos lo siguiente al final

httpd    ALL = NOPASSWD: /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

Con esto le decimos a sudo que permitimos al usuario httpd que puede ejecutar el comando /usr/bin/passwd para todo menos para root
Ahora como usuario httpd podemos hacer la prueba y veremos que nos permite cambiar el password de cualquier usuario menos la del root

httpd@lnxport:/$ sudo passwd userprueba
Introduzca la nueva contraseña de UNIX: 
Vuelva a escribir la nueva contraseña de UNIX: 
passwd: password updated successfully

insert ignore into tabla

Hoy vamos a hablar de bases de datos y de mysql

Hay veces que al hacer cargas masiva mediante scripts sql, la persona que te pasa los datos, no se preocupa de si en tu tabla ya existe el registro y os lo digo por experiencia o bien te piden hacer en el mejor de los casos un TRUNCATE de la tabla, otras DELETE FROM e incluso algunos hacen un DROP y la vuelven a crear. Esto con tablas con varios millones de registros.

Aunque el TRUNCATE es poco costoso para la mysql, luego volver a insertar los millones de registros si lo es, asi que vamos a mejorar el INSERT para que sea rápido y asi evitamos hacer el truncate de la tabla. Lo mas costoso seria cualquier tipo de DDL ( Data Definition Language) DROP TABLE – CREATE TABLE

Imaginemos una sencilla tabla con 2 campos, cliente y telefono. En este caso puede haber varios telefonos para un mismo cliente, pero no es posible que haya el mismo telefono para distintos clientes, por lo que la clave primaria va a ser telefono. Vamos a crear la tabla:

CREATE TABLE `customer` (
  `cid` varchar(30) NULL,
  `tlf` varchar(50) NOT NULL,
  PRIMARY KEY  (`tlf`),
  KEY `cust_tlf` (`tlf`));

En el campo cliente permito nulos ya que a veces me llegan telefonos sin cliente 😉

Supongamos que en nuestro spript hay un insert como este:

mysql> INSERT INTO customer (tlf,cid) values ("936686666","111111");
Query OK, 1 row affected (0.00 sec)

La primera vez que lo ejecutemos no habra ningun problema, ya que la clave primaria no se viola, pero si al dia siguiente, en el script viene otra vez el mismo insert y no se ha hecho un truncate de la tabla, el mismo comando dara un error:

mysql> INSERT INTO customer (tlf,cid) values ("936686666","111111");
ERROR 1062 (23000): Duplicate entry '936686666' for key 1

Como esto no esta bien y no vamos a ejecutar el script lleno de errores lo podemos hacer de una forma mas elegante y eficiente en terminos de recursos de BD:

mysql> DELETE FROM customer WHERE tlf = "936686666";
Query OK, 1 row affected (0.00 sec)

mysql> INSERT IGNORE INTO customer set tlf = "936686666", cid="111111";
Query OK, 1 row affected (0.00 sec)

mysql> INSERT IGNORE INTO customer set tlf = "936686666", cid="111111";
Query OK, 0 rows affected (0.00 sec)

Primero borramos el registro que hemos insertado y hacemos un INSERT IGNORE y vemos que hay 1 row afectado o sea que ha insertado un registro, pero la segunda vez, dice que no ha insertado nada, pero no da ningún error y así el script puede continuar correctamente sin problemas.

balanceo de carga con apache y mod_proxy

El uso de mod_proxy de apache tiene muchas utilidades y gracias a su sencillez de configuración, nos puede sacar de muchos apuros.

En este caso lo vamos a usar para balancear la carga sobre unos servidores web en python llamado tornado http://www.tornadoweb.org que sirve un framework en python. Usaremos el llamado proxy inverso

Instalamos mod_proxy si no lo tenemos ya y activamos los modulos proxy, proxy_balancer, proxy_html, lo mejor en poner proxy* para que a2enmod active lo que necesite

root@lnxport:~# apt-get install libapache2-mod-proxy-html
root@lnxport:~# a2enmod proxy*

Un vez instalado y activado el modulo en apache, necesitamos configurarlo en el archivo apache2.conf dentro de un VirtualHost Seguir leyendo

variables especificas para compilación de paquetes

Hola.

Hay veces que nos encontramos compilando los sources de algun paquete y no nos encuentra o bien, las librerias o los headers de otros paquetes que no hemos instalado en el sitio estandar.

Yo suelo instalarlo todo en un directorio compartido para poder actualizar facilmente, por ejemplo:

root@lnxport:~# ./configure --prefix=/opt/shared

Pues bien, si estas compilando algun paquete que requiere de algun include o libreria instalada alli y aunque hayas definido en /etc/ld.so.conf la ruta a las librerias hay veces que no lo encuentra, entonces podemos instruir a make para que lo encuentre con estas variables:

  • LD_LIBRARY_PATH: esta es una variable de la shell, por si no tenemos el root y necesitamos cambiar esta variable para el usuario en cuestion
    root@lnxport:~# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/shared/lib/
  • LDFLAGS: esta variable es igual que la anterior, solo que para el compilador, su uso es asi:
    root@lnxport:~# export LDFLAGS=-L/opt/shared/lib
  • CPPFLAGS: esta es otra variable para el compilador e instruye a make para que encuentre los headers o ficheros .h
    root@lnxport:~# export CPPFLAGS=-I/opt/shared/include

 

instalación Solr 3.1 y apache tomcat 6

Solr es un motor de busqueda hecho en java, basado en Lucene.

En este tutorial voy a enseñaros como instalar Solr en un contenedor de aplicaciones Tomcat en vez del pequeño servidor que tiene en los ejemplos.
Primero tenemos que tener instalado el servidor J2EE apache tomcat y funcionando. Para los ejemplos esperamos que tomcat este instalado en /opt/tomcat

Descargamos la última versión de Solr

root@lnxport:~# wget http://apache.rediris.es//lucene/solr/3.1.0/apache-solr-3.1.0.tgz
root@lnxport: tar xvfz apache-solr-3.1.0.tgz
root@lnxport: cd apache-solr-3.1.0

En este directorio tenemos tanto el webapp para administración y consulta de solr, como los ejemplos. Nosotros vamos a hacer una instalación nueva, por lo que solo vamos a usar los archivos de configuración.
Primero vamos a desplegar el archivo war de solr dentro de tomcat. Para esto hacemos lo siguiente

root@lnxport:~/apache-solr-3.1.0# cp dist/apache-solr-3.1.0.war /opt/tomcat/webapps/solr.war
root@lnxport:~/apache-solr-3.1.0# cp -R example/solr/ /opt/tomcat/
root@lnxport:~/apache-solr-3.1.0# vi /opt/tomcat/conf/Catalina/localhost/solr.xml

/opt/tomcat/conf/Catalina/localhost/solr.xml

<Context docBase="/opt/tomcat/webapps/solr.war" debug="0" privileged="true" allowLinking="true" crossContext="true">
<Environment name="solr/home" type="java.lang.String" value="/opt/tomcat/solr" override="true" />
</Context>

Seguir leyendo

pysql , el sustituto perfecto de sqlplus

Todo el que haya trabajado con oracle sabrá que el cliente de consola, sqlplus, es una aplicación poco amigable para trabajos repetitivos y tienes que estar continuamente modificando el formato de salida porque si no lo que sale por pantalla no se entiende. Eso no quiere quitarle méritos a sqlplus, una herramienta muy potente para la generación de informes, que es para lo que fue diseñado.

Hace ya un par de años, mirando en los repositorios de sourceforge, encontré un proyecto llamado pysql http://pysql.sourceforge.net aunque ahora tienen los repositorios en github https://github.com/digitalfox/pysql

Pysql es un sustituto para sqlplus, para gente como yo, que le guste usar la consola de forma intensa, pero sin renunciar a una aplicación potente.
Las caracteristicas que mas me gustan son:

  • soporte para readline: podemos hacer edición de la linea de comandos, historial de comandos, control-R para completar
  • informes AWR
  • explain plan directo y con syntax-color
  • ddl de objectos en un solo comando
  • librerias: ponemos guardar una query con el comando lib para reutilizarlo mas tarde. Muy potente, ya que con el tabulador nos muestra todas las disponibles, por si te olvidas del nombre
  • sqltune: podemos pedirle a oracle que analize una query y nos haga recomendaciones para mejorar el rendimiento Seguir leyendo

monitorización de directorios con inotify

Hay veces que necesitamos que si en un determinado directorio, ocurre algo, por ejemplo, la creación de un archivo, poder desencadenar algún tipo de evento que haga algo con ese archivo.

Ya hace años que el kernel de linux tiene soporte para hacer estas cosas, antes con dnotify y ya actualmente con inotity.
http://en.wikipedia.org/wiki/Inotify

Inotity es basicamente un subsistema del kernel de linux que notifica a las aplicaciones que lo implementen, de cambios en el estado del un directorio dado, bien sea porque se ha creado, borrado, modificado, etc algun fichero de ese directorio.

Para implementar inotify, bien puedes hacerte una aplicación usando libinotify o bien usan las muchas herramientas que hay ya hechas y que te facilitan el trabajo. Seguir leyendo