Progettazione di un sistema Single SignOn che permette l'accesso tramite tipi diversi di credenziali Ludwig Bargagli Comune di Grosseto, Jug Toscana, GuruAtWork
Java e OS nella PA Protocollo ICI Anagrafe Polizia Municipale Archiviazione sostitutiva Stipendi Molte molte altre cose...
Java e OS nella PA Stiamo sviluppando un SSO Open Source
SSO Molte applicazioni devono consentire l'accesso solo ad utenti autenticati ed autorizzati 4
5
Single Sign-on (SSO) Autenticazione: processo per verificare l'identità dell'utente (in genere: username e password, in alcuni casi: smart card ecc..) Autorizzazione: verifica se l'utente ha il permesso per ottenere la risorsa richiesta 6
Single Sign-on (SSO) Il processo di autenticazione deve essere ripetuto ogni qualvolta un utente richieda di utilizzare una diversa risorsa. Il procedimento può essere tedioso (e insicuro!) per un utente con diversi accessi a diverse risorse e ancor più per gli amministratori dei sistemi, che sono obbligati a ricordare o trascrivere la propria lista di username/password. L obiettivo a cui una struttura dovrebbe tendere è quello di fornire all utenza gli strumenti per l accesso trasparente e sicuro ad ogni risorsa, semplificando la gestione di tali processi da parte degli amministratori dei sistemi. In altre parole, implementare un meccanismo di 7
Single Sign-on (SSO) 1. è un meccanismo che consente all utente di autenticarsi una sola volta, ovvero di utilizzare un unica credenziale per avere accesso a tutte quelle risorse in cui è autorizzato. 2. prevede che la parte client di un sistema venga riconosciuta solo una volta nel corso di una sessione al momento di accesso ad una applicazione basata su server: questa abilitazione iniziale offre all utente la possibilità di accedere a tutti i server a cui il client è autorizzato dall amministratore, senza quindi bisogno di imputare successivi login. 8
Meccanismi di autenticazione HTTP Basic authentication HTTP Digest authentication HTTP FORM-based authentication Altri (HTTPS) che vedremo più avanti 9
HTTP Basic Athentication E' usata, ad esempio, da Tomcat per accedere a Tomcat Manager 10
HTTP Basic Athentication 11
Autorizzazione Dichiarativa - basata su HTTP basic, digest... - supporto fornito dal contenitore Programmatica - gestita direttamente dal programmatore 12
Soluzione dichiarativa basata sul contenitore Il contenitore permette di impostare accessi autorizzati Le impostazioni vengono specificate dichiarativamente in file gestiti dal contenitore Alcune risorse (URL) sono dichiarate protette: l'accesso è permesso solo ad utenti autenticati e con un ruolo preciso L'elenco degli utenti, con le loro password e i loro ruoli è memorizzato in un file, in un db o in una struttura più adatta Quando è richiesta una risorsa protetta, il contenitore richiede le credenziali di autenticazione dell'utente Se l'utente dispone di credenziali (username, password e ruolo) corrette, allora può accedere alla risorsa 13
LDAP Lightweight Directory Access Protocol (LDAP) è un protocollo di accesso, in modalità client-server, a servizi di directory 14
OpenLDAP OpenLDAP (http://www.openldap.org) è un progetto open source che ha prodotto e mantiene: Server LDAPv2 (openldap 1.x) Server LDAPv3 (openldap 2.x) SDK in C per i client LDAP Libreria Java per LDAP (contributo di Novell) Bridge JDBC/LDAP (contributo di OctetString acquisita da Oracle) 15
E gli altri linguaggi??? Con J2EE possiamo utilizzare l'autorizzazione dichiarativa e quella programmatica E' sufficiente inserire poche righe di codice nel web.xml dell'applicazione I contenitori sono facilmente configurabili Ma cosa accade se usiamo PHP, Python, ASP ecc.??? 16
Autenticazioni sicure HTTPS Client authentication HTTPS Server authentication HTTPS Mutual authentication Con l uso della Basic Authentication il Server richiede l autenticazione dell utente tramite username e password ma queste informazioni, come tutte le altre scambiate tra client e server non sono criptate. Per ottenere un livello di sicurezza più elevato è necessario utilizzare il protocollo SSL (Secure Socket Layer) che prevede l autenticazione tra le parti mediante lo scambio di certificati che contengono una chiave pubblica (chiave simmetrica) ed una chiave privata (chiave asimmetrica). 17
Solo Username e password? E le smart card? Per eseguire la procedura di autenticazione possiamo usare le smart card: CIE CNS Ma occorre creare strati software personalizzati per risalire all'utente (CF, ID...) 18
Altri metodi? Biometria? Se funzionano si possono integrare con i sistemi di autenticazione esistenti 19
Open Portal Guard Open Portal Guard protects the sensitive services of your portal through a * single-sign-on authentication system that can use o username/password (for legacy reasons) o SSL client authentication with X.509 certificates and keys on file or various types of smartcards * centralized declarative access control http://www.comune.grosseto.it http://openportalguard.sourceforge.net/ 20
www.porvoo12.net 21
OPG: For more details Presentations from Porvo 7...11 & http:// openportalguard.sourceforge.net 22
Intranet 23
International standards Open Portal Guard uses existing and proven standards as much as possible. This includes: * SSL/TLS for channel security and authentication of both client and server * the API (but not mechanism) of HTTP Basic authentication towards application servers and applications 24
Open source & Free Sw The implementation reuses as much existing and proven open source software as possible. This includes: * Apache with lots of existing functionality * OpenLDAP for managing user and token data 25
Lang: Java Role-based authorization protects resources by only making them available to users who have been assigned to the appropriate role. JEE provides a standard way of implementing this, using both declarative and programmatic techniques. The configuration file is the web.xml of the application Application server configuration is easy 26
Gli altri linguaggi Con J2EE possiamo utilizzare l'autorizzazione dichiarativa e quella programmatica E' sufficiente inserire poche righe di codice nel web.xml dell'applicazione I contenitori sono facilmente configurabili 27
Open Portal Guard Open Portal Guard protects the sensitive services of your portal through a " single-sign-on authentication system that can use username/password (for legacy reasons) SSL client authentication with X.509 certificates and keys on file or various types of smartcards centralized declarative access control 28
Smart cards the Electronic ID Card (Carta d'identità Elettronica or CIE) by the Ministry of the Interior and issued by Towns the National Service Card (Carta Nazionale dei Servizi or CNS) by the Ministry of Innovation and Technology that is issued by regional governments (including Lombardia, Lazio, Tuscany) and others. 29
Configurazione di Apache Il nuovo Authenticator, invece di cercare i gruppi a cui appartiene un utente su LDAP o su database, li riceve direttamente dall'apache a frontend attraverso il RequestHeader. Per configurare l'access handler di Apache, occorre modificare il file /etc/apache2/sites-available/ssl NameVirtualHost *:443 <VirtualHost *:443>... <Location /provaludo> SSLRequireSSL SSLUserName SSL_CLIENT_S_DN_X509 SSLOptions +StdEnvVars +ExportCertData +FakeBasicAuth +StrictRequire SetHandler mod_python PythonPath "sys.path+['/var/www']" PythonAccessHandler opg PythonFixupHandler opg PythonDebug On order deny,allow deny from all allow from all RequestHeader set OPG_USERNAME %{OPG_USERNAME}e RequestHeader set OPG_USERROLES %{OPG_USERROLES}e ProxyPass http://xxxx.prova.it:0000/test ProxyPassReverse http://xxxx.prova.it:0000/test </Location>... </VirtualHost> 30
New Tomcat Authenticator We use standard JEE access control We developed a new authenticator for Apache Tomcat in collaboration with Comune di Trento 31
New JBoss Authenticator We are developing a new JBoss authenticator 32
33
Authenticators.properties sorgente (apache-tomcat-5.5.20-src.zip): apache-tomcat-5.5.20-src\container\catalina\src\share\ binario (apache-tomcat-5.5.20.zip): apache-tomcat-5.5.20\apache-tomcat-5.5.20\server\lib\catalina.jar org\apache\catalina\startup\authenticators.properties BASIC=org.apache.catalina.authenticator.BasicAuthenticator CLIENT-CERT=org.apache.catalina.authenticator.SSLAuthenticator DIGEST=org.apache.catalina.authenticator.DigestAuthenticator FORM=org.apache.catalina.authenticator.FormAuthenticator NONE=org.apache.catalina.authenticator.NonLoginAuthenticator OPG=.HeaderAuthenticator it.prova.authenticator
BasicAuthenticator.java sorgente (apache-tomcat-5.5.20-src.zip): apache-tomcat-5.5.20-src\container\catalina\src\share\ binario (apache-tomcat-5.5.20.zip): apache-tomcat-5.5.20\apachetomcat-5.5.20\server\lib\catalina.jar org\apache\catalina\authenticator\basicauthenticator.java Package org.apache.catalina.authenticator;... // Validate any credentials already included with this request String username = null; String password = null; MessageBytes authorization = request.getcoyoterequest().getmimeheaders().getvalue("authorization"); if (authorization!= null) { authorization.tobytes(); ByteChunk authorizationbc = authorization.getbytechunk(); if (authorizationbc.startswithignorecase("basic ", 0)) { authorizationbc.setoffset(authorizationbc.getoffset() + 6); CharChunk authorizationcc = authorization.getcharchunk(); Base64.decode(authorizationBC, authorizationcc); // Get username and password int colon = authorizationcc.indexof(':'); if (colon < 0) { username = authorizationcc.tostring(); } else { char[] buf = authorizationcc.getbuffer(); username = new String(buf, 0, colon); password = new String(buf, colon + 1, authorizationcc.getend() - colon 1); } authorizationbc.setoffset(authorizationbc.getoffset() - 6); } principal = context.getrealm().authenticate(username, password); if (principal!= null) { register(request, response, principal, Constants.BASIC_METHOD, username, password); return (true); } }...
SSLAuthenticator.java sorgente (apache-tomcat-5.5.20-src.zip): apache-tomcat-5.5.20-src\container\catalina\src\share\ binario (apache-tomcat-5.5.20.zip): apache-tomcat-5.5.20\apachetomcat-5.5.20\server\lib\catalina.jar org\apache\catalina\authenticator\sslathenticator.java package org.apache.catalina.authenticator;... // Retrieve the certificate chain for this client if (containerlog.isdebugenabled()) containerlog.debug(" Looking up certificates"); X509Certificate certs[] = (X509Certificate[]) request.getattribute(globals.certificates_attr); if ((certs == null) (certs.length < 1)) { request.getcoyoterequest().action (ActionCode.ACTION_REQ_SSL_CERTIFICATE, null); certs = (X509Certificate[]) request.getattribute(globals.certificates_attr);} if ((certs == null) (certs.length < 1)) { if (containerlog.isdebugenabled()) containerlog.debug(" No certificates included with this request"); response.senderror(httpservletresponse.sc_bad_request, sm.getstring("authenticator.certificates")); return (false); } // Authenticate the specified certificate chain principal = context.getrealm().authenticate(certs);...
HeaderAuthenticator.java sorgente (apache-tomcat-5.5.20-src.zip): apache-tomcat-5.5.20-src\container\catalina\src\share\ binario (apache-tomcat-5.5.20.zip): apache-tomcat-5.5.20\apachetomcat-5.5.20\server\lib\catalina.jar org\apache\catalina\authenticator\headerathenticator.java package it.grosseto.gol.elisa.catalina.authenticator;... String headeruser = request.getcoyoterequest().getheader("opg_username"); String headeruserroles = request.getcoyoterequest().getheader("opg_userroles"); Vector roles = new Vector(); roles = getroles(headeruserroles); principal = new GenericPrincipal(context.getRealm(), headeruser, null, roles);...
Cosa serve
Cosa serve
Esempio di conf: Firefox
Esempio di conf: Firefox
Ludwig Bargagli Sviluppatore e sistemista presso i Servizi Informatici del Comune di Grosseto http://www.comune.grosseto.it Collaboratore di riviste di informatica e sistemi operativi Collaboratore di Java Italian Portal http://www.javaportal.it Java User Group Toscana http://www.jugtoscana.org GuruAtWork (G@W) Linux User Group Grosseto Joomla User Group http://www.guruatwork.com Email: ludwig.bargagli@gmail.com Rispondo sempre (basta avere molta pazienza)