Demo: Alfresco para prevenir fugas de información mediante metadatos

Al hilo de mi artículo anterior sobre crónica y materiales de la Alfresco DevCon 2012. He pensado que igual es buena idea volver a grabar la demo que hice pero esta vez en español, así poder llegar a más gente. Pues bien, aquí está la demo donde muestro la problemática existente cuando no se tiene control de los metadatos en los contenidos he se hacen públicos y como resolver el problema con Alfresco y el modulo de limpieza de metadatos.

También está disponible en inglés junto al resto de conferencias en el canal de Alfresco en Youtube, lista de videos de San José.

Aprovecho para recordar que creé un proyecto en Google Code para recoger todas las soluciones existentes en torno a Alfresco y Seguridad, puedes verlo aquí http://code.google.com/p/alfresco-security-toolkit/ y si quieres colaborar no dudes en contactar conmigo.

Alerta de seguridad en Alfresco (ALF-13721 y ALF-13726)

Tanto en Alfresco Enterprise como en Community se han detectado dos vulnerabilidades relacionadas con el acceso a la información en el repositorio.

El pasado viernes se publicaron estas dos alertas ALF-13721ALF-13726, aunque se explican en cada uno de esos casos en el Jira de Alfresco, voy a explicarlos para aclarar ciertas dudas que pueden surgir y entender bien la gravedad de ambos casos.

  • ALF-13721, La API REST de SOLR permite acceso no-autenticado al contenido del repositorio.

En realidad se permite el acceso no autenticado a los índices generados por SOLR para cualquier contenido con índices. Por lo tanto esta vulnerabilidad afecta sólo a versiones 4.0.0 Enterprise y 4.0.{a,b,c,d} Community. Está resuelto en la versión 4.0.1 Enterprise y se puede resolver en versiones Community muy fácilmente como se explica en el foro de Alfresco en español añadiendo las lineas correspondientes al fichero web.xml de la aplicación Alfresco. Básicamente la solución es proteger estos paths /alfresco/s/api/solr, /alfresco/wcservice/api/solr y /alfresco/wcs/api/solr como se indica en la alerta. En la próxima versión Community ya vendrá resuelto, y como decía en la versión Enterprise 4.0.1 ya está resuelto.

  • ALF-13726, Ejecución remota de código mediante el procesador de XSLT para Web Scripts (Web Script XSLT Processor)

Esta vulnerabilidad también afecta a versiones anteriores de Alfresco tanto Enterprise como Community (3.X) además de las versiones 4.0.0 Enterprise y 4.0.{a,b,c,d} Community. Trata de una forma de acceder al repositorio invocando clases Java específicas mediante el motor XSLT. Para explotar esta vulnerabilidad hay que tener acceso previo al repositorio y subir un fichero concreto para poder invocarlo posteriormente mediante un web script. Para clientes con versiones 3.4.X se publicará resuelto en la versión 3.4.9 y también hay un parche específico disponible en el ticket de Jira. Se puede solucionar fácilmente tanto en Enterprise como Community siguiendo estas indicaciones o aplicando el diff que se puede descargar del ticket.

Ya sabes, a actualizar y mantener tu sistema al día, seguro y protegido.

Video y presentación del webinar “Consejos de Seguridad con Alfresco”

Cuanta más información almacenamos en Alfresco, más necesidad de protegerla tenemos y también más necesidad de disponer de la misma. Por eso pienso que este webinar puede ser muy interesante para cualquiera que debe mantener un entorno con Alfresco independientemente de la criticidad del mismo.

En este webinar de unos 50 minutos de duración vamos a ver qué aspectos relacionados con la seguridad debemos tener en cuenta en los diferentes procesos del ciclo de un proyecto con Alfresco como durante la planificación, instalación, configuración y fortificación así como en el mantenimiento, monitorización y auditoría.

Básicamente, este webinar es una colección de consejos y trucos que nos ayudan a fortificar y controlar nuestro entorno ECM.

Aquí está la presentación utilizada para poder descargarla desde la web de Slideshare:

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.

Contenidos, metadatos y las fugas de información

Llevo un tiempo escribiendo algunas cosas sobre seguridad y Alfresco (que iré publicando), una de los temas que más interés me despierta es la fuga de información, concretamente mediante datos que no vemos directamente pero que están ahí, que están en los contenidos, es decir, en los metadatos ocultos (o no tan ocultos) de los ficheros. De esto se ha hablado mucho, por ejemplo en España contamos con Chema Alonso que ha escrito gran cantidad de información al respecto en http://www.elladodelmal.com.

¿Quién no recuerda el famoso “Caso Blair”? Se publicó un fichero sobre la Guerra de Irak y las armas de destrucción masiva y se demostró (mediante los datos ocultos en el fichero) que había sido manipulado por gente de su gabinete y por lo tanto mentía en cuanto a la procedencia de la información. Más información en inglés y en español.

¿De qué estoy hablando? Voy a aclarar algunos conceptos para no liarnos y ponernos en situación.

Cualquier fichero contiene la información del mismo fichero, por ejemplo, un fichero foto.jpg contendrá una imagen, pero también contiene más información que no se ve a simple vista, son los metadatos o propiedades de dicho fichero que nos aportan más información sobre el mismo. En esos metadatos de la foto se pueden ver datos sobre la cámara con la que se ha realizado, fecha en la que se hizo, software con la que se ha editado, una miniatura, información sobre la localización donde se tomó y muchos datos más. Propiedades parecidas también se encuentran en ficheros Adobe PDF, MS Office, Open Office y un largo etcétera. En el caso de ficheros DOC o DOCX incluso podríamos extraer información sobre las personas que lo han editado, nombres de usuario, impresoras donde se ha enviado, recursos compartidos accedidos, etc. Por lo tanto, analizando esas propiedades podemos extraer mucha información valiosa.

Gracias a Google u otros buscadores es muy fácil localizar los ficheros publicados en internet por parte de una organización concreta, tan fácil como buscar algo así: “inurl:dominio.com filetype:pdf”

Hay millones de webs que publican esta información sin tratar previamente, sin saber realmente que información están dejando visible al resto del mundo. Incluso en España está contemplado el borrado o limpieza de esta información en el Esquema Nacional de Seguridad pero tras hacer unos cuantos escaneos de webs españolas de referencia es evidente parece que no tiene mucho éxito.

Fijaros si es importante este concepto que organizaciones como la NSA (National Security Agency de los Estados Unidos) o SANS, han publicado informes sobre los riesgos que supone este problema. Podéis acceder a los mismos aquí:

http://www.nsa.gov/ia/_files/app/pdf_risks.pdf

http://www.sans.org/reading_room/whitepapers/privacy/document-metadata-silent-killer_32974

¿Cómo puedo ver todo esto que comentas? Existen varias herramientas que nos permiten extraer este tipo de datos, analizarlos y poder averiguar cierta información que podrían permitir realizar intrusiones, uso fraudulento de la misma u otras actividades “interesantes”. Voy a enumerar algunas:

FOCA, también con versión online.

libextractor.

Metagoofil.

Exiftool.

Maltego.

Sin lugar a dudas, la más completa y además con sabor español es FOCA, escrita por la empresa Informatica64, tiene una versión gratuita y funciona sobre Windows. Esta herramienta nos permite extraer toda la información oculta en los ficheros, analizarlos y recolectar la información de forma gráfica e intuitiva, incluso puede dibujar un mapa de red con los datos extraídos como direcciones IP o nombres de máquinas. En este enlace se puede ver una conferencia en la DEFCON que es auto explicativa (merece la pena verla entera). Cabe recordar que FOCA nació para hacer auditorías y recolección de datos, y la extracción de metadatos es una de las muchas cosas que hace esta herramienta.

¿Y cómo puedo prevenir este tipo de situaciones? ¿Cómo limpio los archivos que voy a sacar fuera de mi ordenador o que voy a publicar en alguna página en internet? Hay algunas herramientas que nos permiten hacerlo y generalmente es una tarea totalmente manual que debe hacer el usuario por su cuenta (con lo que eso conlleva).

Con OOMetaextractor podemos borrar los metadatos de los documentos de OpenOffice. En el propio MS Office 2007 y versiones superiores hay una opción al guardar que nos permite borrar la información personal, para versiones anteriores hay un plugin que permite hacerlo. En el caso de PDF, para eliminar toda la información interna debemos usar Adobe Acrobat 8.0 o un plugin para versiones anteriores o con la herramienta Exiftool mencionada anteriormente. En ficheros gráficos del tipo JPG, PNG, etc, se puede eliminar algunos de estos datos con Adobe Photoshop o también con Exiftool. Aunque esta herramienta no está orientada precisamente a un usuario final.

Las fotos almacenan esa información en metadatos EXIF, IPTC y otros, los ficheros PDF en XMP, hay muchos más tipos de metadatos en los ficheros, en la web de Exiftool podéis aprender mucho sobre este tema.

Aquí vemos un ejemplo de los datos extraídos de una foto que me han enviado por correo electrónico:

Aquí los metadatos de una presentación en Power Point:

Como veis, en ambos casos hay información muy interesante, en la foto la localización exacta donde se hizo la foto, altitud, el teléfono con el que se hizo la foto, incluso podríamos acceder a la imagen en miniatura si la tuviera (que puede ser algo sorprendente porque puede no ser exactamente igual) y mucha información más. En el fichero PowerPoint podemos ver el usuario que está trabajando actualmente con el fichero, el usuario que lo hizo, fechas de creación, tiempo que se ha tardado en realizar el documento, etc. Toda esta información está muy bien siempre y cuando el usuario quiera que sea pública o que esté disponible, pero generalmente el usuario final no sabe nada de esto ni las consecuencias que puede tener.

Imaginad el impacto que puede tener la publicación de un documento que ha escrito una empresa “amiga” con un RFP y que posteriormente ha publicado otra empresa u organismo, si no se limpian los metadatos se podría demostrar e impugnar una asignación de un proyecto ya que se podría demostrar quien ha escrito el documento y quien lo ha publicado. Eso ocurre y ha ocurrido en muchas ocasiones, por eso esto es muy crítico.

¿Y qué relación tiene todo esto con Alfresco? Gran parte de estos metadatos que residen en múltiples formatos de documentos son utilizados por los extractores de Alfresco para nutrir sus contenidos de información adicional y evitar que el usuario deba rellenar a mano algunos de ellos, esta tarea se hace gracias a las librerías Apache Tika incorporadas en el repositorio. Por lo tanto, si subimos un fichero a Alfresco, se extraen los metadatos más conocidos automáticamente y podemos acceder a ellos en las propiedades de cada contenido, esto no significa que desaparezcan del propio fichero. A efectos de un ECM esto es normal ya que una vez que un fichero está en un ECM éste es el encargado de gestionar la información alrededor del fichero y poder dotar a los contenidos de más información y posibilidades que el propio contenido en si mismo.

En esta captura podemos ver como se muestran las propiedades extraídas (y ahora almacenadas en la BBDD de Alfresco) de una foto:

Entonces ¿qué ocurre si publico mis contenidos en servidores web con acceso público, o si tengo integrado mi portal cuyos contenidos están almacenados en Alfresco? ¿Qué pasa con los metadatos internos de los ficheros que se ponen a disposición de cualquiera en internet pero residen en el repositorio o salen de él?

Eso lo veremos en el próximo artículo, donde explicaré como defendernos de posibles fugas de información mediante metadatos usando Alfresco.

Seguridad en las comunicaciones de Alfresco

En este artículo quiero hablar sobre las comunicaciones en Alfresco. Como buenos administradores debemos saber qué puertos utiliza la aplicación de entrada (tráfico inbound: servicios que publica Alfresco) y de salida (tráfico outbound: servicios externos a los que accede Alfresco). De esa forma podemos configurar apropiadamente el firewall local del servidor y también el firewall perimetral de la organización. Otro aspecto a tener en cuenta es la seguridad de los servicios que publicamos, las comunicaciones tipo cliente-servidor y entre capas de una instalación, es decir, la posibilidad de cifrar el tráfico de los servicios que publicamos y de los servicios que se usan entre las capas o entre nodos en caso de cluster.

Listado de puertos, servicios y origen/destino del tráfico

  • En el listado siguiente podemos ver puertos de servicio que se usan o se pueden usar en Alfresco. Posiblemente veréis alguno más de los que pensábais, cuento con que tenemos Alfresco Repository (alfresco.war) y Alfresco Share (share.war) desplegado en el mismo servidor de aplicaciones y la base de datos, LDAP y almacenamiento en servidores remotos, aunque como sabéis, estos servidores también podrían estar en local en caso de desarrollo o pruebas. Todos estos puertos son los que se establecen por defecto, y como veremos, algunos no están activados por defecto:
Protocolo Puerto TCP/UDP IN/OUT Activo Comentarios
HTTP 8080 TCP IN Si Incluye WebDav
FTP 21 TCP IN Si Modo pasivo
SMTP 25 TCP IN No
CIFS 137,138 UDP IN Si
CIFS 139,445 TCP IN Si
IMAP 143 TCP IN No
Share Point  Protocol 7070 TCP IN Si
Tomcat Admin 8005 TCP IN Si
Tomcat AJP 8009 TCP IN Si
SOLR admin 8443 TCP IN Si Hay que instalar cert en navegador
NFS 111,2049 TCP/UDP IN No
Lotus Quickr 6060 TCP IN No
RMI 50500-50507 TCP IN Si Usado por EHCache entre nodos de cluster y para gestión JMX
JGroups 7800 TCP IN No Cluster discovery entre nodos
JGroups 7801-7802 TCP IN No Comunicación Ehcache RMI entre nodos de cluster
OpenOffice 8100 TCP IN Si Sólo en localhost, no hay que abrirlo
  • Como hemos visto, los puertos indicados anteriormente son todos los que podría utilizar Alfresco en una instalación con todas las funcionalidades activadas y en cluster, en una instalación para producción deberemos arrancar el servidor de aplicaciones con un usuario no privilegiado (en caso de Linux), por lo tanto no podremos levantar los puertos por debajo del 1024, deberemos cambiarlos en la configuración para que sean por encima del puerto 1024 y posteriormente hacer una redirección con el firewall local. Aquí podéis ver un ejemplo.
  • Para controlar el tráfico de salida, es decir, la actividad que genera o sistemas a los que se conecta nuestro servidor, deberíamos crear reglas para controlar el tráfico. En muchos casos no sería necesario limitar la información de salida, pero si quieres realmente controlar todo lo que sale del sistema y tus requisitos de seguridad son elevados, controlar el tráfico de salida es vital:
Protocolo Puerto TCP/UDP IN/OUT Activo Comentarios
SMTP 25 TCP OUT No Configurado hacia tu MTA. Usado para enviar notificaciones.
DB – PostgreSQL 5432 TCP OUT Si* Depende de la BBDD usada
DB – MySQL 3306 TCP OUT Si* Depende de la BBDD usada
DB – MS SQL Server 1433 TCP OUT Si* Depende de la BBDD usada
DB – Oracle 1521 TCP OUT Si* Depende de la BBDD usada
DB – DB2 50000 TCP OUT Si* Depende de la BBDD usada
LDAP 396 TCP OUT No Hay que activar autenticación/sincronización
LDAPS 636 TCP OUT No Hay que activar autenticación/sincronización
docs.google.com 443 TCP OUT No
OpenOffice 8100 TCP OUT No Sólo si se usa OpenOffice externo
JGroups 7800-7802 TCP OUT No Entre nodos del cluster
NFS 111,2049 TCP/UDP OUT No Sólo si se usa un almacenamiento NFS remoto para contentstore
Kerberos 88 TCP/UDP OUT No Sólo si tenemos SSO con Kerberos
DNS 53 UDP OUT Si Si queremos que el servidor resuelva nombre
  • Seguro que hay otros puertos de salida a tener en cuenta, he destacado los necesarios para que funcione el servidor. Por ejemplo, habría que permitir el tráfico a servicios remotos de Facebook, Twitter, LinkedIn, Slideshare, Youtube, Flickr o Blogs, en caso de usar el Publishing Framework. En este caso, y dado que los puertos de salida comentados en el listado anterior pueden variar, lo más rápido sería abrir hacia internet todo el tráfico del servidor, capturar el tráfico y analizarlo. Hecho eso podremos abrir realmente el tráfico saliente que necesitamos. Claro, todo ese control de tráfico de salida habría que hacerlo si estás muy obsesionado con la seguridad, ahí tienes ideas.
  • Si usas autenticación externa, contra un LDAP, procura usar la conexión segura LDAPS (puerto 636 TCP).
  • Otro aspecto a tener en cuenta son las personalizaciones que utilizan o consumen información de otros servidores remotos, como es lógico, no está contemplado en el listado anterior.
  • Tampoco está contemplado en las tablas de arriba otros puertos y tráfico saliente con destino a servidores remotos en caso de usar Transfer/Replication Services de Alfresco, FSR (Alfresco File System Receiver), Liferay, Drupal, etc. En el caso del Replication Service es muy recomendable usar HTTPS y no realizar las transferencias con el usuario admin.
  • Recuerda: tener un firewall (o cuatro firewalls) bien configurado no es sinónimo de seguridad, es sólo un proceso continuo más que debemos llevar a cabo para controlar lo que ocurre en nuestras redes y en nuestros servidores.

Cifrado de la información:

Si no usamos cifrado en las comunicaciones, las contraseñas y los contenidos viajan en sin cifrar, por lo que esa información podría ser interceptada y usada sin nuestro consentimiento, con el grave perjuicio que eso conlleva.

Y de los servicios que publica Alfresco ¿cuales puedo hacer seguros? Vamos a ver los más importantes de cara al usuario y dónde consultar para aprender a configurarlos apropiadamente:

  • HTTP -> HTTPS:

De esta forma cifraríamos la comunicación (http y webdav) entre el navegador del usuario hasta Alfresco o hasta el frontal web que proteja al servidor de aplicaciones.

Para hacer seguro el acceso web a Alfresco Share, Explorer y webdav, podríamos hacerlo de tres formas:

  1. Usando un balanceador que soporte SSL offloading, en cuyo caso no se necesita configurar nada en el servidor web o servidor de aplicaciones.
  2. Activando HTTPS en el frontal web (Apache) y conectando a Alfresco por AJP (mod_proxy_ajp) o mod_Jk, en este caso deberíamos desactivar el acceso al puerto 8080 de Alfresco para evitar accesos no cifrados y obligar a los usuarios de la red local que accedan por el frontal web. Más información sobre los conectores aquí y como activar SSL en Apache aquí aunque hay miles de recurso en Internet disponibles para configuralo.
  3. Activando HTTPS en Tomcat o en el servidor de aplicaciones que tengas, para Tomcat también hay muchos recursos disponibles, por ejemplo aquí, y en este blog (sección CONFIGURING SSL FOR ALFRESCO TOMCAT). Si Alfresco Share está en una capa por delante de Alfresco habría que hacer la tarea en el frontal de Share y opcionalmente en el repositorio y cambiar la configuración de Share para el acceso a los puertos SSL del repositorio. Este artículo te ayudará a entender como separar en capas y su configuración.

Otra recomendación interesante en este punto puede ser el uso en el frontal web del módulo de Apache mod_security, que es un Web Application Firewall que permite filtrar y eliminar cierto tráfico malicioso hacia nuestro servidor como tráfico SQL injection o XSS e infinidad de otros ataques. Aquí un buen recursos para aprender a implementarlo:

http://www.jpereira.net/gestion-documental/alfresco-y-apache-proxy-security

  • FTP -> FTPS:

Permitiremos a los usuarios conectar mediante FTP cifrando la autenticación y la transferencia de contenidos. Es importante que el cliente FTP soporte FTPS, algo que la gran mayoría de clientes lo tienen superado. Es muy sencilla su configuración está bien explicada en la documentación oficial.

  • SharePoint -> SharePoint SSL:

Como comenté en el correspondiente webinar, la implementación Share Point de Alfresco se hace mediante un servidor de aplicaciones embebido en Alfresco llamado Jetty, que escucha por el puerto 7070 TCP. La configuración por defecto no está cifrada, de hecho, eso hace que tengamos que “parchear” el registro de Windows de los clientes para que funcione MS Office correctamente, como vimos en el webinar, o lidiar con la solicitud de contraseña varias veces. Si activamos SSL no es necesario modificar el registro en los clientes. Además, recuerda que se usará SSL en el mismo puerto (7070 TCP) y no estará disponible la comunicación no cifrada.

Aquí se pueden ver los pasos a para su activación:

http://docs.alfresco.com/4.0/index.jsp?topic=%2Fcom.alfresco.enterprise.doc%2Ftasks%2FSharePoint-HTTPS-setup.html

  • SMTP -> SMTP SSL:

Correo saliente (notificaciones):

En este caso si hablamos de la conexión con el MTA de la organización para que Alfresco envíe notificaciones, no hay problema, podemos configurar Alfresco para que se conecte al servidor de correo remoto mediante SMTPS con autenticación y mediante TLS para cifrado. En el blog hablé de esto, puedes ver un ejemplo aquí, aunque en la versión 3.4 y superior es más sencillo, abajo vemos un ejemplo de parámetros para alfresco-global.properties usado con GMail:

[bash]
### Outbound mail SMTP ###
mail.host=smtp.gmail.com
mail.port=465
mail.protocol=smtps
mail.smtps.auth=true
[email protected]
mail.password=Contraseña
mail.encoding=UTF-8
[email protected]
mail.smtp.starttls.enable=true
[/bash]

Correo entrante:

Del correo entrante también hablé aquí. Hasta la versión 4.0 no está soportado SMTP TLS en Alfresco, como puedes ver en este bug reportado en Jira. En la wiki está bien explicado como configurarlo y en docs.alfresco.com también hay información útil.

  • JGroups -> JGroups SSL:

Aunque si usamos interfaces dedicadas para el tráfico entre nodos no sería necesario, JGroups soporta encriptación en el tráfico entre nodos del cluster, aunque en Alfresco no está contemplada esta opción, se podía hacer: http://www.jgroups.org/javadoc/org/jgroups/protocols/ENCRYPT.html

  • IMAP -> IMAPS:

IMAPS (993 TCP) no está soportado por Alfresco, pero se puede poner una capa por delante a modo de proxy e implementarlo. Existen varias soluciones genéricas como stunnel y algunas específicas como PerditionNginx. En este enlace se puede ver más información: https://issues.alfresco.com/jira/browse/ENH-1152

  • SOLR:

En la versión 4.0, que incorpora SOLR, la comunicación entre repositorio y motor de indexación está cifrada y la autenticación también, además es mutua. Todo ese tráfico es HTTPS. Para otro artículo dejo el uso de los keystores por defecto usados para la protección de la comunicación y acceso a SOLR, que este caso usa claves RSA y certificados x.509. Así como para el cifrado de metadatos con la nueva característica de la versión 4.0, el nuevo tipo “d:encrypted” que permite indicar que una propiedad de un nodo se puede cifrar. De cualquier forma podéis encontrar más info aquí.

Persistencia en las credenciales JMX de Alfresco

Aunque esta es una funcionalidad activada y útil sobre todo para Alfresco Enterprise, creo que es una recomendación de seguridad necesaria y a tener muy en cuenta para entornos en producción. Sobre todo si no filtras los puertos con un firewall. Además así evitarás que alguien modifique la configuración de Alfresco.
Vamos a ver cómo cambiar usuarios y contraseñas de acceso JMX por defecto que vienen en Alfresco y que no se sobreescriban cuando actualizamos la versión y siempre tengamos protegido de forma segura el acceso a la consola de configuración y monitorización de Alfresco.
La receta es muy sencilla:
  • Para ello debemos copiar los ficheros alfresco-jmxrmi.access y alfresco-jmxrmi.password que podemos encontrar por defecto en el directorio tomcat/webapps/alfresco/WEB-INF/classes/alfresco/ y los copiamos por ejemplo en tomcat/shared/classes/.
  • Una vez copiados, podemos editarlos y modificarlos a nuestro gusto, los ficheros están muy bien comentados y no dan lugar a dudas.
  • En el fichero alfresco-jmxrmi.access encontramos los nombres de usuario disponibles y el rol asignado:

[bash]
monitorRole   readonly
controlRole   readwrite
[/bash]

  • En el fichero alfresco-jmxrmi.password podemos cambiar la contraseña de cada uno de los usuarios disponibles:

[bash]
monitorRole  mi-nuevo-password1
controlRole  mi-nuevo-password2
[/bash]

  • Por último deberemos añadir la siguiente linea en alfresco-global.properties y reiniciar el servidor de aplicaciones:

[bash]
alfresco.jmx.dir=/directorio/instalacion/tomcat/shared/classes
[/bash]

Por lo tanto, usaríamos el usuario monitorRole para monitorización (aplicaciones externas como Hyperic o Nagios) y el usuario controlRole para acceder mediante jconsole y configurar Alfresco. De eso ya hablé aquí.

Video del webinar sobre “Subsistemas y Autenticación en Alfresco”

Los subsistemas de Alfresco permiten tener más control y modularidad sobre la aplicación, también nos aportan flexibilidad y facilidad de administración. Durante este webinar vamos a aprender qué son, cómo funcionan internamente y cómo se crean. Revisaremos opciones de configuración del servidor de ficheros, aplicaciones externas y profundizaremos en el subsistema de autenticación y sincronización.

Transfer Service: la respuesta de Alfresco a la federación de repositorios

Algo que se venía demandando desde hace tiempo a Alfresco es la posibilidad de federar repositorios o espacios. Si analizamos el roadmap del 2010 podemos ver esa opción en la versión 3.3, prevista para el Q2 (tanto Community como Enterprise).

Haciendo una traducción libre de la entrada sobre este tema en la Wiki de Alfresco, vamos a ver qué es y para qué sirve el Transfer Service.

A través del Transfer Service podremos enviar información desde un repositorio de Alfresco a uno o varios targets definidos, siendo estos targets otros Alfrescos (por ahora).

Como en otros casos, lo podremos hacer a través de la configuración de unos beans que encontraremos en el fichero transfer-service-context.xml. También incorporará una API que permitirá las siguientes características:

  • Registrar un nuevo target.
  • Enviar un nodo nuevo por primera vez (sin que exista en el target).
  • Enviar un nodo que ya exista en la misma ruta del target.
  • Enviar una actualización a un nodo existente en un target.
  • Enviar múltiples nodos.
  • Enviar un nodo borrado o restaurado.
  • Especificar que tipos de asociaciones hay que tener en cuenta para una transferencia.
  • Localizar targets disponibles.
  • Configurar los targets para usar HTTP o HTTPS.
  • Cancelar una transferencia.
  • Verificar los detalles de un target.
  • Ver un registro de los intentos de transferencias.
  • Ver registros de transferencias de un target determinado.
  • Posibilidad de hacer transferencias asíncronas bajo demanda.
  • Editar los atributos de un target.
  • Ver el estado de una transferencia.
  • Restringir una transferencia por clase de contenido.
  • Eliminar targets configurados.

En resumen, el Transfer Service nos permitirá transferir nodos (contenidos) de un repositorio a otro. Alfresco deja las puertas abiertas a nuevas características en este sentido ya que se podrían soportar en el futuro otros elementos e incluso otros tipos de targets como por ejemplo un filesystem cualquiera, etc. Esta nueva característica permitirá a Alfresco dar un salto importante en cuanto a nivel de implantación en entornos con grandes necesidades de replicación y geograficamente distribuidos.

Alfresco: configuración de Single Sign On (SSO) con NTLM vía Active Directory. Parte 2 de 3

En esta segunda parte veremos como “Activar el SSO en Alfresco Share con Active Directory (NTLM)“:

Hasta aquí, hemos conseguido acceder autenticados automáticamente a Alfresco Explorer y Alfresco Webdav, pero ¿qué pasa con Alfresco Share? Si probáis acceder en este momento tras la configuración anterior , veréis que os pide usuario y contraseña para poder acceder de forma normal, por lo que no está el SSO activado, vamos a ver como se configura.

Ficheros que intervienen:

  • web.xml -> dentro de WEB-INF de share.war (ya desplegado)
  • webscript-framework-config-custom.xml -> dentro de web-extension en el shared

En web.xml descomentar las dos secciones filter y filter-mapping que hacen referencia a NTLM.

En el fichero webscript-framework-config-custom.xml añadir dentro de la etiqueta alfresco-config la siguiente configuración:

<config evaluator=”string-compare” condition=”Remote”>
<remote>

<endpoint>
<id>alfresco</id>
<name>Alfresco – user access</name>
<description>Access to Alfresco Repository WebScripts that require user authentication</description>
<connector-id>alfresco</connector-id>
<endpoint-url>http://yourserver:8080/alfresco/wcs</endpoint-url>
<identity>user</identity>
<external-auth>true</external-auth>
</endpoint>

</remote>
</config>


Donde vemos yourserver debemos especificar localhost que es desde donde Share ve a Alfresco (esto es importante, si no sabes qué poner deja localhost). Reiniciamos Alfresco y listo.