Sécurité du login
Bonjour à tous,
Nous développons une application avec FrontEnd (angular) et BackEnd (objectscript Iris), nous utilisons l'identification intégrée grâce à la route /login fournie par %CSP.REST. Nous n'utilisons pas IAM, nous attaquons l'API directement.
Pour éviter les attaques automatisées, nous avons mis une temporisation sur le login (1s entre chaque tentative). Cela protège donc l'API dans le cadre de son utilisation via l'application.
Toutefois, cela ne protège pas complètement l'API, il est possible d'enchainer les logins avec postman sans délai entre les tentatives.
Nous nous demandons donc s'il y a une protection interne à Iris, pour faire face à ce problème (nombre max de login infructueux, délai pour une autre tentative) et si oui comment l'activer.
Comments
Bonjour Pierre,
le meilleur moyen de protéger l'API est d'utiliser API Manager (IAM), qui permet de gérer à la fois l'authentification et une limite sur la fréquence d'appels.
Merci @Sylvain Guilbaud pour cette info, même si mon but est de me passer d'IAM ;-)
Bonjour @Pierre LaFay ,
Effectivement comme l'a mentionné @Sylvain Guilbaud IAM t'offrira pas mal de fonctionnalité.
Toutefois si tu veux juste forcer un "Hang 1" lors du login, tu peux t'en sortir une sous classe de %CSP.SessionEvents, ex:
Class dc.pierre.RestEvents Extends%CSP.SessionEvents
{
ClassMethod OnStartRequest() As%Status
{
#dim%requestAs%CSP.RequestSet^dc.pierre("OnStartRequest", "LastRequest") = $ZDT($Horolog, 3, 1) _ " " _ %request.URLSet loginURL = "/login"If$Extract(%request.URL, * - $Length(loginURL) + 1, *) = loginURL { ; Vérifie si l'url se termine par /loginHang1
}
Quit$$$OK
}
}
Il faut alors configurer l'application Web pour utiliser cette classe d'évènements.
Cela peut se paramétrer via le portail admin gestion de la sécurité -> Application Web, ex : .png)
Lorenzo.
Merci @Lorenzo Scalese pour ta réponse qui correspond à ce que je souhaite faire.
J'ai peut-être un complément : Je crois comprendre que la méthode OnStartRequest() va être appelée avant le login proprement dit.
Ne devrais-je pas utiliser plutôt OnLogin() ou OnEndRequest() pour exécuter mon code après le login ?
Je vais faire quelques tests ce matin
Bonjour @Pierre LaFay ,
Avec plaisir!
Pour le OnLogin, je n'ai pas essayé, mais pour le OnEndRequest j'ai tenté le coup et ce fut un échec :D
Malgré que le OnEndRequest soit bien exécuté, j'ai l'impression qu'il est "asynchrone" ou plutôt qu'il est exécuté après que la réponse soit envoyée au client. Donc même si on fait Hang dans le OnEndRequest, c'est déjà trop tard malheureusement.
N'hésite pas à partager tes découvertes :)