SIU-Guarani/version3.20.0/interfaces/saml
Configuración SAML para vincular SIU-Guaraní Gestión con 3w
A lo largo de los pasos se debe reemplazar:
- <path al idp>: por el path donde se instaló el IdP
- <path proyecto Gestión>: por el path donde está instalado el proyecto SIU-Guaraní Gestión
- <path proyecto 3w>: por el path donde está instalado el proyecto SIU-Guaraní 3w
- <siglas institución>: por las siglas correspondientes a la institución
- 3.20.x: por la versión correcta del sistema
Requisitos
Contar con una instalación funcional de SIU-Guaraní Gestión y 3w
Configuración
- Descargar IdP
- mkdir <path al idp>
wget https://simplesamlphp.org/res/downloads/simplesamlphp-1.13.2.tar.gz -O idp.tar.gz && tar zxvf idp.tar.gz -C <path al idp> --strip 1
- Descargar módulo SAML Guaraní
- svn checkout https://colab.siu.edu.ar/svn/guarani3/nodos/<siglas institución>/gestion/trunk/3.20.x/saml_module <path al idp>/modules/authguarani
- Contenido de config/authsources.php, completar con los datos de la instalación actual
- <?php
$config = array(
'guarani-sql' => array(
'authguarani:SQLBCRYPT',
'dsn' => 'pgsql:host=localhost;port=5432;dbname=gestion_trunk',
'schema' => 'negocio',
'username' => 'postgres',
'password' => 'postgres',
'query' => "SELECT mdp_personas.clave,
mdp_personas.autenticacion,
mdp_personas.usuario as usuario
FROM mdp_personas
WHERE mdp_personas.usuario = :username
",
),
);
- Crear el archivo saml.ini a partir del template y configurarlo. Dentro de la carpeta <path al idp>/modules/authguarani/conf:
- <path al idp>/modules/authguarani/conf$ cp saml_template.ini saml.ini
- En config/config.php modificar:
- Setear la entrada 'baseurlpath' a 'simplesaml/'
- Cambiar la contraseña de admin modificando la entrada auth.adminpassword
- Activar idp saml20 poniendo en true la entrada enable.saml20-idp
- Activar la entrada enable.http_post
- Setear la entrada 'theme.use' a 'authguarani:guarani'
- Asegurarse que la entrada 'language.available' contenga 'es'
- Setear la entrada 'language.default' a 'es'
- En metadata/saml20-idp-hosted.php
- En la entrada auth poner guarani-sql
- Descomentar el bloque indicado por el siguiente comentario Uncomment the following to use the uri NameFormat on attributes.
- El archivo metadata/saml20-sp-remote.php debe tener el siguiente contenido. Modificar las variables url_autogestion y url_sp por las que estén publicadas en la instalación
- <?php
// Ver en el archivo 'instalacion/alias.conf', es simplemente la URL a Autogestión
$url_autogestion = 'http://localhost/g3w3_sso';
$metadata[$url_autogestion.'/acceso'] = array(
'AssertionConsumerService' => $url_autogestion.'/acceso?auth=saml',
'SingleLogoutService' => $url_autogestion.'/acceso/logout?auth=saml',
);
// Ver en el archivo 'instalacion/toba.conf' donde dice #Configuracion del SP de SAML
$url_sp = 'http://localhost/toba_2.6_sp';
$metadata[$url_sp.'/module.php/saml/sp/metadata.php/default-sp'] = array (
'entityid' => $url_sp.'/module.php/saml/sp/metadata.php/default-sp',
'contacts' =>
array (
),
'metadata-set' => 'shib13-sp-remote',
'SingleLogoutService' => $url_sp.'/module.php/saml/sp/saml2-logout.php/default-sp',
'AssertionConsumerService' =>
array (
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => $url_sp.'/module.php/saml/sp/saml2-acs.php/default-sp',
'index' => 0,
),
1 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:1.0:profiles:browser-post',
'Location' => $url_sp.'/module.php/saml/sp/saml1-acs.php/default-sp',
'index' => 1,
),
2 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact',
'Location' => $url_sp.'/module.php/saml/sp/saml2-acs.php/default-sp',
'index' => 2,
),
3 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:1.0:profiles:artifact-01',
'Location' => $url_sp.'/module.php/saml/sp/saml1-acs.php/default-sp/artifact',
'index' => 3,
),
),
);
- Configurar alias idp, crear el archivo <path al idp>/idp.conf
- Alias /simplesaml <path al idp>/www
<Directory <path al idp>/www>
<IfModule mod_authz_core.c>
Order allow,deny
Allow from all
</IfModule>
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
</Directory>
- Linkear el archivo a sites-enabled de Apache:
- sudo ln -s <path al idp>/idp.conf /etc/apache2/sites-enabled
- Reiniciar Apache
- sudo service apache2 restart
- Luego de seguir estos pasos ya se debería poder acceder a http://localhost/simplesaml utilizando las credenciales de Administrador definidas anteriormente.
- Generar certificados del server
- mkdir <path al idp>/cert
cd <path al idp>/cert
openssl req -new -x509 -days 3652 -nodes -out server.crt -keyout server.pem
Configurar SIU-Guaraní 3w
- En <path proyecto 3w>/instalacion/login.php agregar la entrada saml:
- ...
'saml' => array(
'activo' => true,
'clase' => 'modelo\\autenticacion\\auth_saml',
'parametros' => array(
'settings_file' => \siu\bootstrap::get_dir_instalacion() . '/saml/settings.php',
'saml_uid' => 'usuario',// 'urn:oid:0.9.2342.19200300.100.1.1', //se matchea con local_uid
'local_uid' => 'usuario' //puede ser 'persona'
),
),
...
- Crear el archivo <path proyecto 3w>/instalacion/saml/settings.php con el siguiente contenido, modificando las variables $url_autogestion y $url_idp. También hay que setear el fingerprint que se puede obtener con el siguiente comando:
- openssl x509 -noout -in <path al idp>/cert/server.crt -fingerprint
- <?php
//settings y advanced_settings de la libreria de saml.
$url_autogestion = 'http://localhost/g3w3_sso';
$url_idp = 'http://localhost/simplesaml';
return $settings = array (
// If 'strict' is True, then the PHP Toolkit will reject unsigned
// or unencrypted messages if it expects them signed or encrypted
// Also will reject the messages if not strictly follow the SAML
// standard: Destination, NameId, Conditions ... are validated too.
'strict' => false,
// Enable debug mode (to print errors)
'debug' => false,
// Service Provider Data that we are deploying
'sp' => array (
// Identifier of the SP entity (must be a URI)
'entityId' => $url_autogestion.'/acceso',
// Specifies info about where and how the <AuthnResponse> message MUST be
// returned to the requester, in this case our SP.
'assertionConsumerService' => array (
// URL Location where the <Response> from the IdP will be returned
'url' => $url_autogestion.'/acceso?auth=saml',
// SAML protocol binding to be used when returning the <Response>
// message. Onelogin Toolkit supports for this endpoint the
// HTTP-Redirect binding only
'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
),
// Specifies info about where and how the <Logout Response> message MUST be
// returned to the requester, in this case our SP.
'singleLogoutService' => array (
// URL Location where the <Response> from the IdP will be returned
'url' => $url_autogestion.'/acceso/logout',
// SAML protocol binding to be used when returning the <Response>
// message. Onelogin Toolkit supports for this endpoint the
// HTTP-Redirect binding only
'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
),
// Specifies constraints on the name identifier to be used to
// represent the requested subject.
// Take a look on lib/Saml2/Constants.php to see the NameIdFormat supported
'nameIdFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
// Usually x509cert and privateKey of the SP are provided by files placed at
// the certs folder. But we can also provide them with the following parameters
// 'x509cert' => file_get_contents(\siu\bootstrap::get_dir_instalacion() . '/saml/saml.crt'),
// 'privateKey' > file_get_contents(\siu\bootstrap::get_dir_instalacion() . '/saml/saml.pem'),
),
// Identity Provider Data that we want connect with our SP
'idp' => array (
// Identifier of the IdP entity (must be a URI)
'entityId' => $url_idp.'/saml2/idp/metadata.php',
// SSO endpoint info of the IdP. (Authentication Request protocol)
'singleSignOnService' => array (
// URL Target of the IdP where the SP will send the Authentication Request Message
'url' => $url_idp.'/saml2/idp/SSOService.php',
// SAML protocol binding to be used when returning the <Response>
// message. Onelogin Toolkit supports for this endpoint the
// HTTP-POST binding only
'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
),
// SLO endpoint info of the IdP.
'singleLogoutService' => array (
// URL Location of the IdP where the SP will send the SLO Request
'url' => $url_idp.'/saml2/idp/SingleLogoutService.php',
// SAML protocol binding to be used when returning the <Response>
// message. Onelogin Toolkit supports for this endpoint the
// HTTP-Redirect binding only
'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
),
// Public x509 certificate of the IdP
// 'x509cert' => \siu\bootstrap::get_dir_instalacion() . '/saml/saml.crt',
/*
*Instead of use the whole x509cert you can use a fingerprint
*(openssl x509 -noout -fingerprint -in "idp.crt" to generate it)
*/
'certFingerprint' => 'AF:E7:1C:28:EF:74:0B:C8:74:25:BE:13:A2:26:3D:37:97:1D:A1:F9',
),
//Advanced settings
// Security settings
'security' => array (
/** signatures and encryptions offered */
// Indicates that the nameID of the <samlp:logoutRequest> sent by this SP
// will be encrypted.
'nameIdEncrypted' => false,
// Indicates whether the <samlp:AuthnRequest> messages sent by this SP
// will be signed. [The Metadata of the SP will offer this info]
'authnRequestsSigned' => false,
// Indicates whether the <samlp:logoutRequest> messages sent by this SP
// will be signed.
'logoutRequestSigned' => false,
// Indicates whether the <samlp:logoutResponse> messages sent by this SP
// will be signed.
'logoutResponseSigned' => false,
/* Sign the Metadata
False || True (use sp certs) || array (
keyFileName => 'metadata.key',
certFileName => 'metadata.crt'
)
*/
'signMetadata' => false,
/** signatures and encryptions required **/
// Indicates a requirement for the <samlp:Response>, <samlp:LogoutRequest> and
// <samlp:LogoutResponse> elements received by this SP to be signed.
'wantMessagesSigned' => false,
// Indicates a requirement for the <saml:Assertion> elements received by
// this SP to be signed. [The Metadata of the SP will offer this info]
'wantAssertionsSigned' => false,
// Indicates a requirement for the NameID received by
// this SP to be encrypted.
'wantNameIdEncrypted' => false,
),
// Contact information template, it is recommended to suply a technical and support contacts
'contactPerson' => array (
'technical' => array (
'givenName' => 'CAMBIAR',
'emailAddress' => 'CAMBIAR'
),
'support' => array (
'givenName' => 'CAMBIAR',
'emailAddress' => 'CAMBIAR'
),
),
// Organization information template, the info in en_US lang is recomended, add more if required
'organization' => array (
'en-US' => array(
'name' => 'CAMBIAR',
'displayname' => 'CAMBIAR',
'url' => 'CAMBIAR.com'
),
),
);
Configurar SIU-Guaraní Gestión
- Copiar la configuración desde el Framework Toba a la librería simplesamlphp
- cp <path proyecto Gestión>/vendor/siu-toba/framework/php/3ros/simplesamlphp/metadata/* <path proyecto Gestión>/vendor/simplesamlphp/simplesamlphp/metadata
cp <path proyecto Gestión>/vendor/siu-toba/framework/php/3ros/simplesamlphp/config/* <path proyecto Gestión>/vendor/simplesamlphp/simplesamlphp/config
- En <path proyecto Gestión>/instalacion/instalacion.ini agregar la entrada:
- autenticacion = saml_onelogin
- Editar el archivo <path proyecto Gestión>/instalacion/saml_onelogin.ini descomentando y configurando el servidor IDP al que se quiere conectar, reemplazando <URL-IDP> por la url del idp correspondiente y <PATH-IDP> por el path de este servidor donde se encuentra el archivo server.crt generado anteriormente.
- [basicos]
atributo_usuario = usuario
permite_login_toba= 0
[sp]
auth_source = default-sp
session.phpsession.cookiename = TOBA_SESSID
idp = <URL-IDP>/saml2/idp/metadata.php
proyecto_login = guarani
[idp:<URL-IDP>/saml2/idp/metadata.php]
name = Your IdP
SingleSignOnService = <URL-IDP>/saml2/idp/SSOService.php
SingleLogoutService = <URL-IDP>/saml2/idp/SingleLogoutService.php
certFile = <PATH-IDP>/cert/server.crt
- Registrar el SP dentro del IDP. Si se usa simplesamlphp como IDP, editar el archivo metadata/saml20-sp-remote.php, agregando este contenido y completando $url_autogestion y $url_gestion
- <?php
$url_autogestion = 'http://localhost/3w';
$metadata[$url_autogestion.'/acceso'] = array(
'AssertionConsumerService' => $url_autogestion.'/acceso?auth=saml',
'SingleLogoutService' => $url_autogestion.'/acceso/logout?auth=saml',
);
$url_gestion = 'http://localhost/gestion';
$metadata["$url_gestion/default-sp"] = array(
'AssertionConsumerService' => "$url_gestion/?acs",
'SingleLogoutService' => "$url_gestion/?sls"
);
?>
IMPORTANTE
Debido a una particularidad de SimplesamlPHP, si el idp y sp se implementan con SimplesamlPHP DEBEN estar en diferentes hosts, si esto no es así el comportamiento no está determinado. Aquí está el link a la documentación de SimplesamlPHP https://simplesamlphp.org/docs/stable/simplesamlphp-idp#section_9_1. Una salida a este problema es definir un virtual host para el idp (en vez de un alias).