Archive

Archive for the ‘IAM’ Category

LSC Use Case: synchronize telephoneNumber from Sun LDAP to Active Directory

July 21st, 2010 1 comment

At work, we are using two directories. The first one, a damn old Sun Directory 5.2, used by the mail system and VOIP. The second directory is an Active Directory used by … everything which run on Windows. At the moment, we don’t have some Identity Provisionning products, so users are created by hand in both directories. I want to make this synchronization automatic, however since it’s a complex and dangerous thing, I want to start by synchronize few attributes. The first one is the telephoneNumber, available in the Sun Directory with format “21xxx” (the internal phone number), while the one store in active directory is the public one (014070xxx), so I need to transform the attribute before sending it in AD.

Some friends of mine start the LSC Project(LDAP Synchronization Connector) few years ago, a tool to synchronize directories! Here the configuration file I used for my use case:

Define the source


src.java.naming.provider.url = ldap://sun_hostname:389/dc=rtl,dc=fr
src.java.naming.security.authentication = none
src.java.naming.security.principal =
src.java.naming.security.credentials =
src.java.naming.referral = ignore
src.java.naming.ldap.derefAliases = never
src.java.naming.factory.initial = com.sun.jndi.ldap.LdapCtxFactory
src.java.naming.ldap.version = 3

Define the target


dst.java.naming.provider.url = ldap://ad_hostname:389/dc=activedirectory,dc=domain
dst.java.naming.security.authentication = simple
dst.java.naming.security.principal = userwithenoughperms@activedirectory.domain
dst.java.naming.security.credentials = secret
dst.java.naming.referral = ignore
dst.java.naming.ldap.derefAliases = never
dst.java.naming.factory.initial = com.sun.jndi.ldap.LdapCtxFactory
dst.java.naming.ldap.version = 3

Define the task to manage telephoneNumber attribute


lsc.tasks = FirstTask
lsc.tasks.FirstTask.srcService = org.lsc.jndi.SimpleJndiSrcService
lsc.tasks.FirstTask.srcService.baseDn = ou=People
lsc.tasks.FirstTask.srcService.filterAll = (inetUserStatus=ACTIVE)
lsc.tasks.FirstTask.srcService.pivotAttrs = mail
lsc.tasks.FirstTask.srcService.filterId = (mail={mail})
lsc.tasks.FirstTask.srcService.attrs = mail telephoneNumber
lsc.tasks.FirstTask.srcService.requestNameForList = getAllPeoplePivots
lsc.tasks.FirstTask.srcService.requestNameForObject = getOnePerson
lsc.tasks.FirstTask.dstService = org.lsc.jndi.SimpleJndiDstService
lsc.tasks.FirstTask.dstService.baseDn = ou=Pole radio,dc=activedirectory,dc=domain
lsc.tasks.FirstTask.dstService.filterAll = (&(sn=*)(objectClass=inetOrgPerson))
lsc.tasks.FirstTask.dstService.pivotAttrs = mail
lsc.tasks.FirstTask.dstService.filterId = (mail={mail})
lsc.tasks.FirstTask.dstService.attrs = telephoneNumber
lsc.tasks.FirstTask.bean = org.lsc.beans.SimpleBean
lsc.tasks.FirstTask.dn = ""
lsc.syncoptions.FirstTask = org.lsc.beans.syncoptions.PropertiesBasedSyncOptions
lsc.syncoptions.FirstTask.default.action = K
lsc.syncoptions.FirstTask.default.delimiter = $
lsc.syncoptions.FirstTask.telephoneNumber.action = F
lsc.syncoptions.FirstTask.telephoneNumber.force_value = StringUtils.replaceFromMap(srcBean.getAttributeValueById("telephoneNumber"), "telephone.csv")

I think most of properties are self-meaning, however here some explanations about few of thems

  • default.action = K, meaning the attribute is not overriden if the value is ok
  • telephoneNumber.action = F, force the attribute to be updated
  • lsc.syncoptions.FirstTask.telephoneNumber.force_value= StringUtils.replaceFromMap(srcBean.getAttributeValueById(“telephoneNumber”), “telephone.csv”) is the code to compute the new value of the telephoneNumber attribute. In that case, I use a CSV files where I specify two fields: the pattern, and the value to replace if the pattern is found. (i.e. “^21,014070”)

Output in dryrun mode


% ./bin/lsc -n -f etc -s FirstTask
juil. 21 16:24:43 - WARN - Starting sync for FirstTask
juil. 21 16:24:43 - INFO - Connecting to LDAP server ldap://sun_hostname:389/dc=rtl,dc=fr anonymously
juil. 21 16:24:44 - INFO - Connecting to LDAP server ldap://ad_hostname:389/dc=activedirectory,dc=domain as admin@activedirectory.domain
juil. 21 16:24:44 - WARN - The method getAttributeValueById() is deprecated and will be removed in a future version of LSC. Please use getAttributeFirstValueById() instead.
juil. 21 16:24:44 - DEBUG - Update condition false. Should have modified object CN=BONFILS Bruno,OU=Users,DC=activedirectory,DC=DOMAIN
dn:: CN=BONFILS Bruno,OU=Users,DC=activedirectory,DC=DOMAIN
changetype: modify
replace: telephoneNumber
telephoneNumber: 0140704049

juil. 21 16:24:44 - INFO - All entries: 1, to modify entries: 0, modified entries: 0, errors: 0

Categories: IAM Tags:

OpenSSO strict cookie value

February 22nd, 2010 1 comment

At my work, we’re currently working on a new J2EE platform to host our webapp applications, based on Tomcat 6 (6.0.24 to be precise). After deployed few fully public webapps without any issue, we start to deploy some other webapps with an authenticated part. The authentication is based on OpenSSO, using REST APIs. The cookie is created to OpenSSO, then set (client side) by one of our own webapplication. This cookie is validate using isValidToken REST API on every application the user goes. However, we’re not able to get authentication working on the preproduction environment, while it working perfectly on the dev environment. After some investigations with the developpers, we notice the OpenSSO’s cookie value was truncated.

After reading this post on the tomcat’s user mailing list, we start to configure tomcat. Few hours after, I was thinking about change the tomcat configuration is only a workaround, without fixing the original problem. Thanks to the OpenSSO’s IRC channel, someone (Allan Foster) pointed me to com.iplanet.am.cookie.c66Encode configuration variable. You can enable it in the console, Configuration, servers and sites, click on default paramaters, and then advanced tab. Set the value to true, and voila! Everything is now working good!

Categories: IAM, SSO Tags:

OpenSSO, OpenID and Yubikey, the perfect personal SSO: cheap, and secure

August 3rd, 2009 1 comment

As a new owner of an yubikey, I was looking the best way to integrate it with the web application I already use. While there is already an available OpenID provider which support Yubikey authentication, I prefer to manage my own system, using OpenSSO for sure ūüôā
Yubikey
First, let me introduce the yubikey. This USB key act as an OTP (One Time Password) device, each time you press the button, the key compute a new password. This pasword must be verify, in the case of Yubikey, this is done by query a Webservices on a yubico (the company) server. Yubikey offers a lot of advantages than others classical OTP devices, including:

  • The yubikey is see as an USB keyboard (class HID), no driver required!
  • No battery, more longlife than anothers devices
  • Very cheap, around 20 euros (ordered by 10, from France), transport and taxes included

So, why choose OpenSSO? For few years know, OpenSSO provides an extension to act as an OpenID provider, and an authentication class is available for the Yubikey.

OpenSSO OpenID Yubikey

References:

Categories: IAM, Security, Sysadmin Tags: , ,

IAM track at LSM

May 4th, 2009 No comments

As a member of the LSM staff, I organize a track about IAM. The schedule is almost closed, including:

  • Pat Patterson, from OpenSSO, the famous Access Manager (SSO) of Identity Federation tool from Sun (english)
  • Ludovic Poitou, from OpenDS, the future Sun’s Directory Server (english or french)
  • Cl√©ment Oudot, from LemonLDAP::NG, an opensource Web SSO (english or french
  • Tomas Gustavsson, from EJBCA, the most famous opensource PKI product (english)
  • Jonathan Clarke, from LSC, a tool to synchronize directory from JDBC or LDAP (english or french)
  • Myself, introducing about IAM, especially the provisionning (french)

This day is planned for July, the 10th, at Nantes. Check LSM website to register in a near future (registration are not opened yet). For OpenDS, LemonLDAP::NG and LSC talks, the language will be choosen according the audience.

Categories: IAM, PKI, Social, SSO, Sysadmin Tags:

Petite surprise en LDAP: last successful bind

April 28th, 2009 2 comments

Un rapide poste qui je l’esp√®re fera suite √† d’autres pour exposer une petite surprise que j’ai eu avec LDAP (enfin de mani√®re plus pr√©cises avec les serveurs). Lors d’un projet pour mon nouvel employeur, on me demanda d’installer un OpenSSO pour authentifier des utilisateurs et obtenir leurs attributs LDAP. Bon, jusqu’ici rien d’anormal. N√©anmoins, dans les attributs utilisateurs, il est demand√© un attribut fournissant la date de la derni√®re connexion d’un utilisateur (en pratique la date d’un dernier bind op√©r√© avec succ√®s). Sur le moment, je n’ai pas percut√©. Ce n’est qu’au moment de revenir sur mon poste, et par acquis de conscience, que j’ai commenc√© √† me renseigner.

Et quelle ne fut pas ma surprise lorsque je me suis rendu que :

  • OpenSSO ne le permet pas de base. Apr√®s une rapide rechercher, il semblerait qu’une mani√®re simple (c’est tout relatif) est d’√©crire une classe (Java) qui sera ex√©cut√©e apr√®s une authentification utilisateur.
  • Active Directory semble fournir cette fonctionnalit√© de base (via l’attribut lastlogon)
  • Sun Directory Directory Server Entreprise Edition (DSEE pour faire court) ne semble √† priori pas le supporter dans toutes ses versions (>= 6.2 de m√©moire, √† prendre avec grande pr√©caution) (tests en court)
  • OpenDS le supporte (tests en court)
  • Sun iPlanet 5.x ne le supporte tout simplement pas
  • Je n’ai pas regard√© pour les autres serveurs, si jamais vous avez des retours dessus, je suis preneur.

√Čvidemment, je vous laisse deviner quel serveur j’utilise. Donc, je me suis retrouv√© √† √©crire un plugin (en C) pour iPlanet, j’avoue que cela est assez int√©ressant (enfin il y a bien pire comme t√Ęche :). Je vais mettre √† disposition le code de ce plugin d’ici quelques jours, m√™me si je doute qu’en Avril 2009 cela int√©resse encore beaucoup de gens !

Pour information, pour obtenir cette fonctionnalit√© avec DSEE et OpenDS, il faut utiliser les password policies, et n’activer que la partie concern√©e. Cela va mettre √† jour le champ ds-pwp-last-login-time (au moins vrai pour OpenDS).

N√©annmoins, j’avoue que je suis assez surpris que cela ne soit pas de base, partout, dans tous les serveurs LDAP. Certes, cela demande un minimum de performances suppl√©mentaires. En effet, cela provoque une √©criture (op√©ration consid√©r√©e comme lente sur un annuaire LDAP) √† chaque op√©ration d’authentification r√©ussie (mais on pourrait imaginer de vouloir l’√©quivalent pour un last failure). Mais au point de vue gestion d’identit√©, c’est quand m√™me une information qui peut √™tre tr√®s int√©ressante. Au hasard, sur un portail public, d’obtenir rapidement, et simplement, la liste des utilisateurs qui ne se sont pas connect√©s depuis une ann√©e.

Categories: IAM, Security, Sysadmin Tags: ,

Article sur la mise en place de l’authentification X509 avec OpenSSO et EJBCA

April 3rd, 2009 No comments

Suite √† mon article et la cr√©ation d’une imageVMWare pour d√©montrer l’utilisation d’EJBCA et d’OpenSSO pour faire de l’authentification X509 client, Pat ma gentiment demand√© si je pouvais √©crire un article √† ce sujet. Et c’est maintenant chose faite, l’article est disponible ici. En route pour la deuxi√®me partie !

Categories: IAM, PKI, Security, SSO Tags: ,

Ça bouge chez Sun !

March 15th, 2009 No comments

Malgr√© une sant√© √©conomique plus ou moins bonne, des licenciements, (mais a contrario une bonne publicit√©) √ßa bouge beaucoup chez Sun, notamment dans le domaine de l’IAM. Pour preuve, il suffit de regarder l’activit√© autour d’OpenSSO, et de WebSpaces

OpenSSO

Pour OpenSSO, comme le montre la roadmap, il y a des choses fort int√©ressantes en pr√©vision. Comme par exemple un mandataire inverse (reverse proxy) avec la possibilit√© de g√©rer des accr√©ditations secondaires. En pratique, cela permet de prot√©ger une application o√Ļ il est impossible d’installer un agent, et qui ne supporte pas SAMLv2. De mani√®re concr√™te, cela se traduit par de l’injection de formulaires (fillform) du login/mot de passe de l’utilisateur. La solution d’un mandataire inverse permet de rendre plus faible (et surtout plus quantifiable avant vente) les co√Ľts d’int√©gration d’une application dans un SSO.

D’autres points notables concernant OpenSSO r√©sident dans l’avanc√© du support d’OpenDS (avec reset du mot de passe), et la cr√©ation d’une fedlet en .Net.

WebSpaces

Je n’ai encore pris longtemps pour faire un billet sur WebSpace, mais je tacher de r√©sumer de mani√®re rapide. Glassfish WebSpace est le fruit du partenariat entre Sun et Liferay, avec pour objectif de cr√©er une nouvelle version de Sun Portal Server (ce qui d’ailleurs, ne fais pas que des heureux parmi les clients actuels, √† juste titre). WebSpace est fourni avec un certain nombre de porlet existantes, dont certaines orient√©es enterprise. Je m’int√®resse particuli√®rement √† la porlet Workflow, qui permet de cr√©er des petits processus (workflows) simples, comme par exemple la gestion des notes de frais (c’est l’exemple fourni). Pour ma part, j’ai comme objectif de cr√©er une porlet de demande de cong√© (avec double approbation). J’en dirais plus dans un prochain billet !

Categories: IAM, SSO Tags:

An IRC channel about IAM

January 15th, 2009 No comments

Few days ago, I thought it was a pity there is no place to discuss about IAM. Well, ok, there are some places like Sun IDM’s forums, the #opensso channel, etc. however all this place are related to a specific product. For example I don’t think the Sun IDM’s forum is a good place to ask question about pros and cons of Sun IDM vs Novell IDM ūüôā Well, you can, but there is a big chance that all answers leads you on Sun IDM ! ūüôā

So, as you probably ever guessed, I create an IRC channel, so you can join us (there are already some very interesting people!) on the freenode network (irc.freenode.net), on the channel ##iam, note the double # is not a typo.

Hope to see you on the channel!

Categories: IAM, Social Tags:

Configurer la servlet SPML2 dans IDM

September 20th, 2008 No comments

Dans un pr√©c√©dent message, j’ai expos√© rapidement ce que c’√©tait SPML. Je vous propose maintenant de d√©couvrir comment l’activer dans Sun Identity Manager, qui comme son nom l’indique, est un outil de gestion d’identit√© (IAM donc). La m√©thode pr√©sent√© est normalement valable aussi bien pour les versions 7 et 8 d’IDM.

Créer un fichier XML (depuis votre poste de travail) avec le contenu suivant :

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Waveset PUBLIC 'waveset.dtd' 'waveset.dtd'>
<Waveset>
   <ImportCommand  name='include' file='sample/spml2.xml'/>
</Waveset>

Puis connecter vous sur l’interface d’administration d’IDM (en configurator), puis cliquer sur le menu Configure, puis Import Exchange File. Choisissez le fichier pr√©alablement cr√©er, puis valider. Si tout se passe correctement, vous devriez normalement obtenir un message √©quivalent √† cette illustration.

Vous pouvez d√©sormais envoyer vos requ√™tes SPML (via un transport SOAP) √† l’url /idm/servlet/openspml2.

Categories: IAM Tags:

IDM, EJBCA, SPML, et Groovy, ca y est !

August 26th, 2008 No comments

J’en r√™vais, alors je l’ai fais ! Mon id√©e √©tait de disposer d’un ensemble d’outils pour g√©n√©rer facilement des requ√™tes SPML, j’ai donc cr√©er une petite biblioth√®que Java, et √©cris quelques scripts groovy associ√©s, en pratique cela donne :

import net.asyd.iam.spml.AddRequest
 
AddRequest request = new AddRequest()
 
request.init("http://localhost:8080/SPMLServer/openspml2")
request.createPsoId("easyspmlDemo")
request.addAttribute("emailAddress", "bbonfils@gmail.com")
request.proceed()
request.dumpResponse()

Comme vous pouvez le constater, cela deviens tr√®s simple. De plus, dans ma lanc√©, je me suis dis pourquoi ne pas cr√©er une servlet recevant des requ√™tes SPML pour les traduires dans des WebServices EJBCA. C’est maintenant chose faite. Bien que je n’impl√©mente actuellement que la m√©thode addRequest, cela me permet de provisionner des entit√©s depuis un producteur SPML, comme par exemple Sun Identity Manager. La “traduction” entre SPML et la couche EJBCA se fais au travers d’un script groovy (et oui, encore du groovy, groovy c’est le bien !), de la mani√®re suivante :

import java.util.HashMap
import net.asyd.iam.FinalAddEntity
import org.ejbca.core.protocol.ws.UserDataVOWS
 
public class FinalAddEntitySample implements FinalAddEntity {
 
    def id
    def attributes
    def buffer
    def ejbcaEntity
 
    public void init(String id, HashMap attributes, UserDataVOWS ejbcaEntity) {
        this.id = id
        this.attributes = attributes
        this.ejbcaEntity = ejbcaEntity
    }
 
    public void preprocess() {
        buffer = ",UID=" + id + ",OU=staff,O=asyd dot net,C=FR"
    }
 
    public String getSubjectDN() {
        return "CN=" + id + buffer
    }
 
    public boolean proceed() {
        ejbcaEntity.setUsername(id)
        ejbcaEntity.setEmail(attributes.get("emailAddress"))
        ejbcaEntity.setSubjectDN(getSubjectDN())
 
        ejbcaEntity.setCaName("DemoCA")
        ejbcaEntity.setCertificateProfileName("ENDUSER")
        ejbcaEntity.setEndEntityProfileName("EE_SPML_USER")
        ejbcaEntity.setTokenType("P12")
        ejbcaEntity.setSendNotification(true)
 
        return true
    }
}

Plus d’information disponible sur devel.asyd.net :

Actuellement le code est plut√īt un POC que production ready, mais avec un peu de chance cela ne saurait tarder, et apr√®s tout ca permet d√©j√† de faire des choses sympas !

Categories: IAM, PKI Tags: ,