Authentification des clients de services Web avec un jeton de nom d'utilisateur
WebSphere Application Server Liberty prend en charge la spécification OASIS Web Services Security UsernameToken Profile 1.1. Cette spécification décrit la façon dont un client de service Web fournit un jeton de nom d'utilisateur pour l'identification du demandeur à l'aide d'un nom d'utilisateur, et en option à l'aide d'un mot de passe ou de l'équivalent d'un mot de passe au fournisseur de services Web. L'environnement d'exécution de la sécurité de services Web (WS-Security) dans Liberty qui traite la règle pour le fournisseur de services Web peut utiliser ces données d'identification afin d'authentifier l'utilisateur.
L'exigence relative au jeton de nom d'utilisateur est exprimée par l'un des jetons de support dans la règle de sécurité de services Web. Vous pouvez ajouter une exigence de jeton de nom d'utilisateur en tant que jeton requis dans l'une des assertions de jeton de support, notamment SupportingTokens, SignedSupportingTokens, SignedEndorsingSupportingTokens, SignedEncryptedSupportingTokens et EncryptedSupportingTokens.
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken11 />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
En plus de l'exigence de nom d'utilisateur et de mot de passe, vous pouvez configurer une règle afin d'inclure un horodatage nonce et created dans un jeton de nom d'utilisateur.
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken11 />
<sp13:Created />
<sp13:Nonce />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken11 />
<sp:HashPassword />
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
Pour plus d'informations sur nonce, created et les différents types de mot de passe, voir OASIS WS-Security policy 1.3 specification.
Spécification d'un nom d'utilisateur et d'un mot de passe dans un client de service Web
La fonction de sécurité de services Web dans Liberty fournit plusieurs méthodes pour spécifier le nom d'utilisateur et le mot de passe d'une application client lors de la génération d'un jeton de nom d'utilisateur. Vous pouvez définir le nom d'utilisateur et le mot de passe à l'aide d'un programme ou dans le fichier server.xml.
Un client peut générer un jeton de nom d'utilisateur avec le nom d'utilisateur et le mot de passe spécifiés dans le fichier server.xml. Le nom d'utilisateur et le mot de passe qui se trouvent dans le fichier server.xml constituent la configuration par défaut et sont remplacés par les informations fournies dans la partie RequestContext pour l'appel de service Web du client.
<wsSecurityClient id="default"
ws-security.username="alice"
ws-security.callback-handler="com.acme.PasswordCallback"
</wsSecurityClient>
- ws-security.username - nom d'utilisateur
- ws-security.password - mot de passe de l'utilisateur si ws-security.callback-handler n'est pas défini
- ws-security.callback-handler - classe d'implémentation du gestionnaire d'appel utilisée pour obtenir les mots de passe
Map<String, Object> requestCtx = ((BindingProvider)port).getRequestContext();
requestCtx.put("ws-security.username", "bob_username");
requestCtx.put("ws-security.password", "bob_password");
Consommation d'un jeton de nom d'utilisateur dans un fournisseur de services Web
Lorsqu'un jeton de nom d'utilisateur est reçu, la sécurité de services Web utilise automatiquement le registre d'utilisateurs de la sécurité de Liberty pour valider le nom d'utilisateur et le mot de passe, si le mot de passe est requis. Si le type de mot de passe dans le jeton de nom d'utilisateur est PasswordDigest ou utilise des clés dérivées, vous devez fournir l'implémentation ws-security.callback-handler d'un gestionnaire d'appel de mot de passe en la configurant dans le fichier server.xml. Ce gestionnaire d'appel doit renvoyer des mots de passe valides pour tous les noms d'utilisateur prévus, pour que l'environnement d'exécution de la sécurité de services Web puisse calculer des valeurs de synthèse en vue de leur comparaison avec la valeur figurant dans le message SOAP. Si la comparaison des valeurs de synthèse aboutit, le nom d'utilisateur et le mot de passe sont validés dans le registre d'utilisateurs.
<wsSecurityProvider id="default"
ws-security.callback-handler="com.acme.PasswordCallback"
</wsSecurityProvider>
Gestionnaire d'appel de mot de passe
Le gestionnaire d'appel de mot de passe est utilisé par la sécurité de services Web pour extraire le mot de passe d'un utilisateur. Dans Liberty, cette classe de gestionnaire d'appel de mot de passe peut être conditionnée sous forme de fonction Liberty. Pour plus d'informations sur le gestionnaire d'appel de mot de passe, voir Développement d'un gestionnaire d'appel de mot de passe pour la sécurité de services Web.
Pour plus d'informations sur les exigences et les limitations d'une implémentation de gestionnaire d'appel, voir la section "Gestionnaire d'appel de mot de passe de clé privée" de la rubrique Protection des services Web avec un jeton X.509.
Protection d'un jeton de nom d'utilisateur dans un message SOAP
<UsernameToken>
<Username>myusername</Username>
<Password
Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">
mypassword
</Password>
</UsernameToken>
Si vous voulez envoyer un jeton de nom d'utilisateur avec PasswordText, vous devriez envisager d'appliquer des protections supplémentaires au message. Par exemple, utilisez HTTPS ou chiffrez le jeton avec l'assertion de règle EncryptedSupportingToken. Pour plus d'informations sur l'imposition de l'utilisation du transport HTTPS dans la règle, voir Liberty : Assertions de règle de transport HTTPS pour la sécurité de services Web.
Dérivation de clé de jeton de nom d'utilisateur
Comme énoncé dans la spécification Web Services Security UsernameToken Profile 1.1 :
Le mot de passe associé à un nom d'utilisateur peut être utilisé pour dériver une clé confidentielle partagée afin d'assurer l'intégrité ou la confidentialité du contenu des messages.
Sachez que les mots de passe font l'objet de toute sorte d'attaques, qui peuvent mener à l'exposition des clés dérivées. Cette procédure de dérivation de clé a été conçue pour réduire le risque d'attaque des clés, dans la mesure du possible. Toutefois, son efficacité est limitée en raison de la faiblesse des mots de passe dont un être humain peut se souvenir et qui peuvent être tapés sur un clavier standard.
Deux éléments supplémentaires sont requis pour activer la dérivation d'une clé depuis un mot de passe. Il s'agit de <wsse11:Salt> et de <wsse11:Iteration>. Ces valeurs ne sont pas confidentielles et doivent être transmises dans le jeton de nom d'utilisateur lorsque la dérivation de clé est utilisée. Lorsque la dérivation de clé est utilisée, le mot de passe ne doit pas être inclus dans le jeton de nom d'utilisateur. Le récepteur utilise ses connaissances du mot de passe pour dériver la même clé que l'expéditeur.
Si un jeton de nom d'utilisateur utilise la dérivation de clé pour une application de fournisseur, vous devez fournir l'implémentation ws-security.callback-handler d'un gestionnaire d'appel de mot de passe en la configurant dans le fichier server.xml.
<sp:SymmetricBinding>
<wsp:Policy>
<sp:ProtectionToken>
<wsp:Policy>
<sp:UsernameToken
sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:WssUsernameToken10 />
<sp:RequireDerivedKeys />
</wsp:Policy>
</sp:UsernameToken>
<wsp:Policy>
</sp:ProtectionToken>
</wsp:Policy>
</sp:SymmetricBinding>
<wsse:UsernameToken wsse:Id="...">
<wsse:Username>...</wsse:Username>
<wsse11:Salt>...</wsse11:Salt>
<wsse11:Iteration>...</wsse11:Iteration>
</wsse:UsernameToken>