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.