Evitar fugas de información mediante metadatos con Alfresco

Tras hablar de las fugas de información en el “capítulo” anterior, donde explicaba la problemática existente con la gestión de los metadatos internos de los contenidos de cara a posibles análisis y extracción de información que no queramos hacer pública, he preparado la siguiente prueba de concepto para poder limpiar metadatos internos de archivos de imágenes (jpg, png) y pdf con Alfresco. Concretamente usaremos Exiftool, una herramienta hecha en Perl que soporta la edición, y por lo tanto, borrado de metadatos internos de los siguientes formatos y tipos de metadatos más conocidos (ver en la página de Exiftool todos los formatos soportados, que son muchos más):

Formato Información adicional
EPS, EPSF, PS R/W [Encapsulated] PostScript Format
EXIF R/W/C Exchangable Image File Format metadata (TIFF-based)
GIF R/W Compuserve Graphics Interchange Format
IND, INDD, INDT R/W Adobe InDesign Document/Template (XMP metadata only)
JPEG, JPG R/W Joint Photographic Experts Group image (see table below)
PDF R/W Adobe Portable Document Format
PNG, JNG, MNG R/W Portable/JPEG/Multiple-image Network Graphics
TIFF, TIF R/W Tagged Image File Format
XMP R/W/C Extensible Metadata Platform sidecar file

En esta prueba de concepto no veremos como automatizar el borrado de metadatos en ficheros ofimáticos de MS Office u Open Office, ya que Exiftool no soporta esos formatos, aunque los desconozco, parece ser que hay librerías que pueden permitir automatizarlo y añadirlo de la misma forma que comento en este artículo. Hace unos días Chema Alonso, de Informática 64, me comentó que ellos tienen una aplicación que se puede invocar desde línea de comandos y soporta esos formatos que podría servir para mejorar este que os muestro hoy, pero no tengo más detalles.

DISCLAIMER: Recordad que este artículo no es más que una prueba para demostrar que se puede hacer, aunque en mis pruebas no he visto ningún problema que afecte a la estabilidad de la plataforma, no me hago responsable si rompes algo 😉

Bien, empecemos. Vamos a ver la instalación, configuración, prueba y uso.

  • Instalación de exiftool y módulo de ejecución de comandos en Alfresco:

Para realizar esta prueba de concepto he utilizado Alfresco Enterprsie 4.0.0 pero igualmente valdría para la versión Community. Aparte de tener un Alfresco 4.0 instalado y funcionando necesitamos tener instalado Exiftool, podéis descargar de esta dirección la aplicación para Windows, Linux o MacOSX. También podéis descargarlo e instalarlo directamente usando Yum o Apt en vuestra distribución de Linux favorita. Uso Linux en este ejemplo así que todos los comandos y rutas serán en base a este sistema operativo, para hacerlo en Windows deberías cambiar rutas, etc. En MacOSX también lo he probado y este proceso es igual que en Linux.

Una vez instalado Exiftool, posiblemente lo tendremos en la ruta /usr/bin/exiftool por lo tanto en el PATH del sistema operativo y podremos invocarlo ejecutando en una consola simplemente “exiftool” (sin comillas). Para asegurarnos que funciona correctamente asegúrate que tiene permisos de ejecución (chmod +x)  y ejecuta exiftool contra una imagen o pdf que tengas:

[bash]
$ exiftool foto.jpg
[/bash]

Si todo va bien, verás una lista todos los metadatos que contiene la foto como veíamos en las capturas del artículo anterior.

Ahora vamos a ver como se realiza el borrado de todos los metadatos de un fichero desde línea de comandos para terminar todas las comprobaciones:

[bash]
$ exiftool -all= −overwrite_original foto.jpg
[/bash]

Con el anterior comando se borran todos los metadatos del fichero (-all=) y sobrescribe el fichero que se trata (−overwrite_original). Una vez ejecutado el comando vuelve a ejecutar el comando inicial de lectura para comprobar que realmente se han borrado todos los metadatos y funciona correctamente.

Ahora que tenemos instalado el comando principal para limpiar vamos al siguiente paso. La instalación del módulo que nos permitirá implementar una acción consistente en una llamada a un comando, es decir, a un script de shell. Le conté la idea a mi compañero en Alfresco Rui Fernandes y me dedicó unos minutos para hacer un módulo que permite ejecutar un comando sobre un nodo del repositorio (gracias amigo!), yo he adaptado el módulo a la ejecución de exiftool y podéis descargar el AMP desde aquí:

http://dl.dropbox.com/u/357018/cmd-line-action-clean-metadata-1.0.1.amp

Una vez tengamos descargado el módulo cmd-line-action-clean-metadata-1.0.1.amp, debemos instalarlo a alfresco.war con la herramienta alfresco-mmt (parando antes el servidor de aplicaciones). Para hacer esa tarea de forma sencilla copiamos el módulo al directorio “amps/” que debe estar en la raíz de la instalación de Alfresco. Posteriormente ejecutamos el script apply_amps.sh que está en “bin/” también en la raíz de la instalación. Si no hemos tenido ningún problema tras la ejecución del script ya tenemos el módulo instalado, podemos ver que ha hecho un backup automático de alfresco.war y que ha limpiado ficheros temporales del anterior despliegue.

  • Configuración del módulo para que la acción ejecute nuestro limpiador:

Teniendo el módulo de la acción instalado, ahora debemos configurarlo para usarlo posteriormente en una regla de Alfresco y aplicar la limpieza de metadatos internos de un contenido o contenidos concretos.

Primero debemos crear el script que vamos a ejecutar, lo llamaremos file-metadata-removal-script.sh y lo pondremos en el directorio “bin/” de la instalación de Alfresco, con el siguiente contenido tan sencillo:

[bash]
#!/bin/bash

# Script for calling File Metadata Removal Tool command
/usr/bin/exiftool -all= -overwrite_original $1
[/bash]

Recuerda hacerlo ejecutable con el comando “chmod +x file-metadata-removal-script.sh”.

Por último en alfresco-global.properties debemos añadir el siguiente nuevo parámetro donde indicamos la ruta absoluta del script (modifícala con la ruta del script en tu servidor):

[bash]
#Cleaner metadata script
file.metadata.removal.command=/opt/alfresco-enterprise-4.0.0/bin/file-metadata-removal-script.sh
[/bash]

Hecho lo anterior ya podemos arrancar el servidor de aplicaciones y probarlo.

  • Prueba:
  1. Accede a Alfresco Share con un usuario con permisos para crear una carpeta y crea una carpeta en un sitio.
  2. Crea una regla simple como la siguiente, donde se ejecuta la acción “Clean internal metadata”:
  3. Sube o mueve un fichero del tipo jpg, png o pdf al directorio donde has creado la regla. Sus metadatos internos serán extraídos como siempre por Alfresco y los usará para añadirlos a la información del contenido en su propia base de datos como veíamos en el artículo anterior. Pero también lo limpiará en el propio fichero interno que se almacena en el contentstore. También puedes mover un fichero que ya esté en el repositorio a esa carpeta y se ejecutará la limpieza.
  4. Como ves, es una acción totalmente transparente para el usuario. En los logs podremos ver más información.
  • Logs:

En el fichero alfresco.log podremos ver las siguientes cadenas donde vemos que el nodo de turno se ha limpiado correctamente (1 image files updated):

[bash]
2012-02-27 01:01:32,908  INFO  [rfernandes.cmdlineaction.CmdLineActionExecuter] [defaultAsyncAction4] Binary content store URL fetched: 2012/2/26/22/25/c1a9d2e3-9779-4dc5-aaea-927c1e8bc3a5.bin

2012-02-27 01:01:32,928  INFO  [rfernandes.cmdlineaction.CmdLineActionExecuter] [defaultAsyncAction4] Command line to execute: /opt/alfresco-enterprise-4.0.0/bin/file-metadata-removal-script.sh /opt/alfresco-enterprise-4.0.0/alf_data/contentstore/2012/2/26/22/25/c1a9d2e3-9779-4dc5-aaea-927c1e8bc3a5.bin

2012-02-27 01:01:32,928  INFO  [rfernandes.cmdlineaction.CommandExecutor] [defaultAsyncAction4] Executing: /opt/alfresco-enterprise-4.0.0/bin/file-metadata-removal-script.sh /opt/alfresco-enterprise-4.0.0/alf_data/contentstore/2012/2/26/22/25/c1a9d2e3-9779-4dc5-aaea-927c1e8bc3a5.bin

2012-02-27 01:01:33,332  INFO  [rfernandes.cmdlineaction.CommandExecutor] [Thread-143] OUTPUT>    1 image files updated

2012-02-27 01:01:33,338  INFO  [rfernandes.cmdlineaction.CommandExecutor] [defaultAsyncAction4] ExitValue: 0
[/bash]

Por defecto se usa el modo INFO en el log del módulo, pero con la siguiente cadena se podría modificar en log4j.properties:

[bash]
log4j.logger.org.alfresco.demo.rfernandes.cmdlineaction=info
[/bash]

  • Comprobar con exiftool:

Podemos comprobar con exiftool que realmente se ha limpiado el contenido lanzando el comando contra el nodo directamente:

[bash]
$ exiftool /opt/alfresco-enterprise-4.0.0/alf_data/contentstore/2012/2/26/22/25/c1a9d2e3-9779-4dc5-aaea-927c1e8bc3a5.bin
[/bash]

Y veremos que sólo se muestran los metadatos básicos del contenido, no los que pueden aportar más información. Ojo con lanzar comandos directamente a los contenidos en el contentstore, no lo hagas con comandos que no sepas realmente lo que hacen, podrías generar una inconsistencia en el repositorio. La implementación ideal sería usando código java así que cuidado con lo que hacéis 😉

  • Reglas:

En este ejemplo hemos visto una sencilla regla para probar la limpieza de los ficheros, para usar esta idea en un sistema real deberíamos saber como vamos a integrar Alfresco con un sistema web, por ejemplo con un portal o un canal de publicación, y ejecutar la acción con los contenidos que vayan a ser usados por ese portal o canal independientemente de cómo se acceda a Alfresco (CMIS, API nativa, etc.). Si lo que usamos es el Transfer Service de Alfresco, también deberíamos crear una regla para que se limpien los contenidos cuando salgan del repositorio con destino otro sistema.

  • Conclusión:

Como hemos visto en este artículo, hay opciones muy válidas para llevar a cabo la tarea de limpieza de contenidos para evitar fugas de información mediante los metadatos usando Alfresco. Seguro que con esta idea como base se pueden hacer cosas mucho más potentes. Los comentarios y mejoras son bienvenidos.

10 thoughts to “Evitar fugas de información mediante metadatos con Alfresco”

  1. Un artículo genial, como siempre. Lo más interesante que además destaco es que no solo puede servir para limpiar información del JPG, etc. (cosa que en realidad la mayor parte de las veces es información sin importancia) sino el poder asignar nueva información (meta-datos) a las imágenes, p.e. un mensaje de copyright y autor, geolocalización, noderef de un nodo al que la imagen puede hacer referencia, etc. es decir, se abre la puerta no solo a limpieza de valores o rescatar esos mismos para ser asignados al modelo de datos de Alfresco, sino también a la manipulación de estos con fines de gestión 🙂

    Un saludo!!
    fegor

  2. Gracias Fernando, aunque lo de “cosas sin importancia” yo no lo tengo tan claro, hay veces que se ve una imagen retocada y en su thumbnail (incrustado) se ve sin retocar, por ejemplo.

    Para añadir las propiedades que comentas yo lo haría directamente con Alfresco mediante el modelado de datos, al menos esa sería la buena práctica en cuanto a gestión de metadatos en un ECM.

    Gracias por el comentario!

  3. Pues no te creas, pe. en el caso de un CSV (Código Seguro de Verificación), este puede ir en un documento PDF (en el cuerpo) pero también podría ir en un meta-dato del propio documento y este código que serviría para localizar desde el “papel” (documento exportado a un usuario/ciudadano) el documento electrónico en Alfresco podría usarse incluso por otros programas posteriormente desde un usuario/ciudadano en su casa, otra institución que usar el documento devuelto con el CSV para sus gestiones, etc. (¿a que me gusta enredar?)… 😉

  4. La verdad es que si, puede haber casos concretos. Para PDFs firmados o cifrados no lo he probado, no tengo ninguno por aquí, pero supongo que hay que tenerlo en cuenta para “no romperlos”.

  5. Para meter baza también. Para casos como propone Fernando, perfectamente validos, lo suyo sería sencillamente actualizar el contenido (como parte de una política o de una acción) según los procedimientos normales de Alfresco (o sea nuevo nodo de contenido en el content store de Alfresco con el documento con metadato añadido). Se trata de algo relativamente más clásico. El caso de que habla Toni en el post es “original” (con todo lo que la palabra conlleva, de bueno y de malo/peligroso/”a ser utilizado con cuidado”) porque trata de reemplazar directamente un nodo de contenido de Alfresco “sin pasar por el api” (que conllevaría la creación de un nuevo nodo) porque precisamente trata de garantizar que el contenido existente en el sistema no posea esta información.

    Abrazo a los dos!

  6. Estoy haciendo un módulo para la extracción de metadatos de las imágenes y estoy utilizando exiftool, pero no se como mostrar los metadatos que reconoce exiftool en el alfresco. Podrías ayudarme?

    Porfi ayudameeee

    Saludos

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.