Hace poco leí la noticia de una señora de 45 años a la que grabaron tirando un gato a un cubo de basura.
Esta grabación se difundió por internet y comenzó la locura: se distribuyó su identidad, dirección postal y de correo electrónico, perfil en redes sociales, se crearon grupos que amenazaban a la señora de las formas más variopintas e que incluso pedían que se le despidiera de su trabajo.
Dejando al margen que fuera recriminable lo que la señora hizo, podemos ver un claro caso de lo que puede llegar a suceder cuando los datos personales se encuentran desprotegidos: ¿deberían haberse difundido su dirección postal, dónde trabajaba, cuál era su perfil en las redes sociales o su edad? Y es más, ¿cómo pudieron obtener esa información desde internet?
Desde PRiSE os invitamos a pensar sobre esto: ¿Sabes qué datos tienes publicados en redes sociales, foros y otras páginas web y que son visibles por toda la red? ¿Qué información publicas en tu blog o microblog?
Una buena manera de saber qué hay publicado de tí en la red es poner tu nombre y apellidos entre comillas en tu buscador favorito. Puede llegar a sorprenderte la cantidad de información personal que tienes publicada en internet.
En uno de nuestros proyectos nos hemos encontrado con la situación de tener que unir dos federaciones PAPI, permitiendo que personas que pertenezcan a una federación puedan acceder a los recursos federados de otra federación.
La solución que hemos ideado ha llevado al desarrollo de un nuevo elemento en php que implementa el protocolo PAPI, al cual le hemos denominado ASProxy.
Este elemento permite conectar dos GPoAs, cada uno de una federación diferente. Para la federación que protege los recursos, el ASProxy actúa como un AS normal, pero para el GPoA de la federación a la que pertenece el usuario, el ASProxy se comporta como un PoA.
Cuando un ASProxy recibe un mensaje ATTREQ de un GPoA, traduce esa petición en un mensaje CHECK, almacenando en la sesión información necesaria para cuando esa petición sea contestada. En esa petición ATTREQ se envíará el parámetro PAPIHLI con el valor del AS de la federación 2 al que pertenece, pudiendo así evitar el paso de que el usuario tenga que seleccionar de nuevo en un WAYF a qué institución pertenece.
Cuando a un ASProxy le llega un mensaje CHECKED de respuesta proveniente del GPoA de la federación 2, éste deberá transformar este mensaje, descifrándolo con la clave pública del GPoA de la federación 2, modificando la información necesaria y cifrándolo con su clave privada para que el GPoA de la federación 1 pueda comprender la respuesta.
Esta será un mensaje CHECKED de tipo AS->GPoA, distinto del recibido anteriormente, de tipo GPoA->PoA.
Como una extensión futura a este componente, estamos pensando la forma más adecuada de enviar, dentro de la aserción obtenida, el AS de la federación 2 donde el usuario se ha autenticado para que así, en la federación 1, puedan realizar filtros con esta información.
Desde PRiSE seguiremos informando de cómo evoluciona este componente.
Recientemente hemos finalizado un proyecto que hemos llevado a cabo con la Universidad de Sevilla para actualizar y migrar a nuevas versiones su actual despliegue de PAPI en sus instalaciones.
Gracias a este proyecto y su apoyo hemos podido desarrollar dos nuevos componentes PAPI con licencia GPL. Estos son los siguientes:
Todavía no hay mucha documentación de ambos proyectos, y es que estamos trabajando en la nueva web de PAPI donde estamos escribiendo ya cómo instalarlos y cómo configurarlos, además de mucha más información del resto de los componentes.
Si quieres ir probándolos, puedes descargarlos utilizando los siguientes repositorios Mercurial:
Hemos añadido una breve descripción del proyecto que hemos realizado en los pasados meses con la Consejería de Economía, Innovación y Ciencia de la Junta de Andalucía, junto con la empresa Opentia.
En esta ocasión hemos diseñado y desarrollado un Servicio de Token de Seguridad (STS) conformes al estándar WS-Trust 1.4 para dicha Consejería. El objetivo era permitir la transmisión de información entre aplicaciones de dicha consejería a través de SAML 2 en un escenario donde no existía un Proveedor de Identidad único.
De esta forma, las aplicaciones utilizan SAML 2 para transmitir información entre ellas para lo cual hemos tenido que definir 5 tipo de perfiles en el proyecto, uno por cada tipo de autenticación que nos encontramos en dicha Consejería:
Como vemos, no es necesario que haya desplegado un Proveedor de identidad SAML 2 o un Single Sign-On para que las aplicaciones de una empresa u organismo disfruten de las ventajas de trabajar con dicha tecnología.
El 20 de Abril del 2009 fue un mal día para las organizaciones (y el software libre en general, aunque es mi opinión personal y ya hablaré de esto en otro momento) que utilizaban OpenSSO: Oracle decidió comprar Sun Microsystems.
Uno de los problemas que han surgido a raíz de dicha compra es el estado “incierto” que están sufriendo aquellos usuarios de OpenSSO. ¿Ha dejado de ser un proyecto libre? O mejor dicho, ¿ha dejado de ser un proyecto en activo?
Ahora hay que registrarse en Oracle y solicitar una cuenta de cliente con ellos para descargarlo, mientras que los agentes de política (los módulos de openSSO que se instalaban en un servidor web para proteger una zona) han desaparecido misteriosamente sin comunicar nada en su página web.
Como muchos de sus usuarios están evaluando alternativas para migrar a otro producto, nosotros queremos proponerles que migren a PAPI. Gracias a OpenSSO2PAPI podrán migrar a una infraestructura basada en PAPI sin necesidad de cambiar la tecnología que usaban para proteger las aplicaciones.
OpenSSO2PAPI es un software a través del cual PAPI puede ofrecer la API que OpenSSO provee para gestionar la cesión de datos de identidad y atributos a las aplicaciones que estén protegidas con dicha tecnología, implementando el comportamiento y las APIs que dichas aplicaciones esperan.
Podemos dividir la arquitectura de OpenSSO en dos grandes bloques:
Hemos implementado en Opensso2PAPI un conjunto de pantallas y APIs tipo REST y hemos comprobado que funciona perfectamente con aplicaciones protegidas con OpenSSO.
La idea es que OpenSSO2PAPI utiliza un PoA (utilizando phpPoA) para obtener de una infraestructura PAPI, o de un Servidor de autenticación en concreto a través del parámetro PAPIHLI, la identidad del usuario y sus atributos. De esta forma, es como si el OpenSSO delegara en PAPI la gestión de la identidad del usuario.
Cambiando tan sólo las URLs que tenemos definidas en nuestras aplicaciones, la cual hemos protegido con OpenSSO, por la nueva dirección donde está desplegado OpenSSO2PAPI, habremos migrado a PAPI sin necesidad de realizar cambios en dichas aplicaciones con un coste elevado.
Ya está disponible la primera versión del conector PAPI para CAS. Éste es un sistema para autenticar usuarios en una institución desarrollado inicialmente por la Universidad de Yale y que posteriormente pasó a ser gestionado por la Jasig, un consortium de universidades norteamericanas.
Aunque CAS tiene su propio protocolo, ha sido diseñado de manera que pueda implementar otros protocolos, trayendo ya en la distribución oficial el interfaz de SAML 1.1, su única forma de emitir atributos, u OpenID.
Tras un acuerdo con la Valencian International University (VIU), PRiSE ha desarrollado un conector PAPI para CAS, con licencia GPL, para que un CAS pueda actuar como proveedor de identidad dentro de una infraestructura basada en PAPI.
La última versión está disponible en su página en la Forja y el código fuente está disponible en el repositorio de Mercurial http://www.prise.es/hg/papi-cas.
Parece que OpenID está ganando poco a poco la confianza de las administraciones públicas en otros países a la hora de utilizarlo para autenticar a sus ciudadanos.
Como la mayoría sabréis, el pasado Septiembre’09 el gobierno americano anunció que comenzaría a incluir dicha tecnología en alguna de sus agencias gubernamentales y es ahora el gobierno japonés quien anuncia que va a permitir la autenticación de los usuarios en un portal del Ministerio de Economía, Comercio e Industria.
El portal, que se llama IdeaBox, es una iniciativa para conocer la opinión del ciudadano japonés con respecto a las iniciativas de dicho ministerio y que además, pueden proponer y votar, nuevas ideas. Aunque por ahora sólo van a confiar en 4 proveedores de identidad de OpenID:
Enhorabuena al gobierno japonés por dicha iniciativa y estamos seguro que no tardaremos en ver en otros portales gubernamentales de otros países tecnologías como OpenID u OAuth.
Apache, como consecuencia de la vulnerabilidad CVE-2003-0020, escapa todos los logs de errores, con el fin de evitar que un atacante pueda insertar secuencias de caracteres de escape, y provocar vulnerabilidades en emuladores de terminal.
Pues bien esto hace que todos los caracteres de control sean impresos en los ficheros de log de errores con su representación visual (i. e. ‘\n’, \t’, etc), en vez de actuar como tales. Por lo que depurar mensajes de error generados por cualquier componente externo a Apache, como por ejemplo aplicaciones PHP, scripts-cgi o handles mod_perl, es muy poco agradable, ya que te encuentras con mensajes de error de 10 o 15 líneas condensadas en una sola.
Como en mi día a día tengo que tratar con PAPI (desarrollado en mod_perl2) sufro bastante esta desconsideración de Apache al escribir los mensajes de debug que genera PAPI, vamos que tengo que manejar mensajes de debug de PAPI con el siguiente formato:
[Thu Mar 11 11:19:52 2010] [debug] ApachePoA.pm(105): [client 130.206.6.37]
PAPI-DEBUG#20069_1268302792_sirgpoa: Parameters initialized:$VAR1 = bless( {\n
'Filtered' => 1,\n 'Accept_File' =>
/aaaa/bbbb/cccc/dddd.ddddd/conf/papi/gpoa/shim.gif',\n
'String' => /GPoA',\n 'attrList' => [],\n 'filte
rs' => [],\n 'PxCkSize' => 320768,\n ApacheReq
uest' => bless( do{\\(my $o = 11921096)}, 'Apache2::RequestRec' ),\n 'useHcoo
k' => 0,\n 'Type' => 'Location',\n 'Hcook_Ha
ndler' => undef,\n 'registerKey' => '',\n 'MxNonc
eErr' => 3,\n 'PoARw' => [\n {\n
'value' => 'check=false,$1,',\n
Lo que como se puede ver es inmanejable. Por esto un día decidí hacer uso de la capacidad que tiene el Apache para enviar los logs a un programa externo que recibirá estos logs por entrada estándar. Siendo en este programa externo donde reemplazo los caracteres de control (i.e. su representación visual) por su valor. Con lo que consigo log de debug de PAPI con el siguiente formato:
[Wed Mar 10 15:51:52 2010] [debug] ApachePoA.pm(105): [client 130.206.6.51]
PAPI-DEBUG#29900_1268232712_simplepoa: Parameters initialized:
$VAR1 = bless( {
'Filtered' => 1,
'Accept_File' => '/etc/apache2/papi/global/images/image_ok.png',
'String' => '/simplePoA',
'attrList' => [],
'filters' => [
{
'reg' => '.*',
'act' => 'accept'
}
],
'PxCkSize' => 320768,
'ApacheRequest' => bless( do{\\(my $o = 155158008)},
'Apache2::RequestRec' ),
'useHcook' => '1',
'Type' => 'Location',
'registerKey' => '',
'Hcook_Handler' => '.*',
'MxNonceErr' => 3,
'URL_Timeout' => '600',
'PoARw' => [],
Una mejora considerable ¿no?
El truco que hay que hacer consiste en definir el ErrorLog así:
ErrorLog "|/usr/local/bin/splitApacheLog.pl /path/papi_error.log /path/error.log"
Donde el progrma Perl splitApacheLog.pl consiste en:
1 #!/usr/bin/perl
2
3 my $papi = shift @ARGV;
4 my $error = shift @ARGV;
5 my $line = '';
6 #$|=1;
7
8 open(PAPI_OUT,">>$papi")
9 or die("No se puede abrir el fichero $papi\n$!\n");
10 open(ERROR_OUT,">>$error")
11 or die("No se puede abrir el fichero $error\n$!\n");
12
13 while (defined($line = )){
14 if ($line =~ /PAPI/){
15 $line =~ s/\\n/\n/g;
16 do {
17 use bytes;
18 my $size=length($line);
19 syswrite(PAPI_OUT, $line, $size);
20 }
21 }else{
22 $line =~ s/\\n/\n/g;
23 do {
24 use bytes;
25 my $size=length($line);
26 syswrite(ERROR_OUT, $line, $size);
27 }
28 }
29 }
Con esto conseguimos dos ficheros de log, uno para PAPI y otro para Apache, como se puede ver discriminamos con la expresión regular de la línea 14 según la cual enviamos la salida al fichero PAPI o al fichero de Apache.
El código es muy simple y intuitivo, por lo que modificarlo para que se ajuste a las necesidades de cualquiera no debe ser muy complicado.
Por último comentar, que se puede compilar Apache sin esta característica tan molesta de los mensajes de log escapados. Para ello sólo debéis hacer uso de la directiva de compilación DAP_UNSAFE_ERROR_LOG_UNESCAPED, tal y como os muestro a continuación:
CFLAGS=-DAP_UNSAFE_ERROR_LOG_UNESCAPED ./configure
Obviamente no recomiendo esta práctica, sólo informo de ella.
El componente icGPoA de PAPI está experimentando un auge de popularidad en los últimos meses gracias a la labor de RedIRIS en su federación de identidad digital SIR.
Pero, ¿qué es un icGPoA?. Éste es un componente sencillo, extremadamente sencillo (y en cuanto se complique dejará de tener éxito), que permite actuar como GPoA o AS.

Así, el icGPoA sólo es capaz de responder a los siguientes mensajes:
Para generar estas respuestas, el icGPoA sólo necesita una lista de atributos del usuario y una clave privada para firmarla (sobre esto ya hablaremos otro día…). En PHP tiene la siguiente “complejidad”:
if (isset($_REQUEST["ACTION"])) {
$theRef = $_REQUEST["DATA"];
}
else {
$theRef = $_REQUEST["PAPIPOAREF"];
}
$assertion = “attrA=val1,attrB=val2|val3@ID_AS”;
$now = time();
$ext = $now + 3600;
$reply = $assertion . “:” . $ext . “:” . $now . “:” . $theRef;
$safe = openssl_encrypt($reply, $pKey);
Aunque ya está siendo utilizado por más de 30 organizaciones, no existe una versión “oficial” que descargarse. Esperemos que en breve podamos anunciar una URL en este blog.
Un perfil en OAuth especifica las credenciales que deben enviarse al Servidor de Autenticación y cómo las obtendrá el Cliente.
Dentro de los perfiles ya establecidos existen dos tipos: Perfiles de Clientes Autónomos (Autonomous Client Profiles), donde el Cliente actúa en su nombre y Perfiles de Delegación del Usuario (User Delegation Profiles), donde el Cliente actúa en nombre de un usuario determinado.
Los perfiles de Clientes Autónomos son dos:
Perfil de cuenta de Cliente con contraseña (Client Account and Password Profile):
Este perfil se utiliza cuando el Cliente es una aplicación que necesita un Recurso Protegido en nombre de una organización y el Servidor de Autorización acepta cuentas y contraseñas como método de autenticación.
Perfil de Aserción: (Assertion Profile)
Este perfil autoriza al cliente con una aserción, ya sea SAML u otro tipo que reconozca el Servidor de Autorización. El cliente presenta esta aserción al Servidor de Autorización y se intercambiarán por el Token de Acceso que permitirá acceder al recurso protegido.
Existen tres tipos de perfiles de Delegación del Usuario:
Perfil denombre de usuario y contraseña (Username and Password Profile):
El usuario da su nombre de usuario y contraseña a la aplicación Cliente que tiene instalada en su dispositivo. Con estos datos, el Cliente presenta sus credenciales al Servidor de Autorización para así intercambiarlas por un Token de Acceso que le permita acceder al recurso protegido.
Perfil Aplicación Web (Web App Profile)
Consiste en que el usuario se autentique de alguna forma determinada establecida de antemano en la aplicación web Cliente. Este perfil se utiliza cuando el Cliente es una aplicación web que accede al Recurso Protegido en nombre del usuario sin necesidad de adquirir las credenciales de los mismos.
Rich App Profile:
Se utiliza cuando el Cliente es una aplicación que el Usuario ha instalado en un dispositivo y está disponible en él un navegador web, pero el usuario no desea dar su nombre de usuario y contraseña a una aplicación o no necesita estos parámetros para autenticarse en el Servidor de Autorización.