đȘ đșïž ProtĂšge ton back-office avec un prĂ©fixe unique
Si tu utilises Active Admin, Rails Admin, Administrate ou si tout simplement si tu as un back-office sur ton application Rails alors il faut le rendre secret. Parce que, oui, utiliser la route /admin pour ton back-office, câest presque du mĂȘme niveau quâutiliser password comme mot de passe.
Au programme :
Pourquoi rendre son back-office secret
Tests unitaires
Préfixer des routes
authenticate
vsauthenticated
Bonjour et bienvenue sur la 5Úme édition de Ruby Biscuit.
Vous ĂȘtes maintenant 77 abonnĂ©s đ„ł Si vous nâĂȘtes pas dĂ©jĂ inscrit :
Pourquoi rendre son back-office secret
Il y a quelques annĂ©es un client nous Ă demandĂ© sâil Ă©tait possible que lâon change lâURL de son back-office pour ne pas y accĂ©der aussi simplement quâavec /admin
. En faisant ce changement nous nous sommes rendus compte que lâidĂ©e Ă©tait bonne et quâelle permettait de maniĂšre trĂšs simple de sĂ©curiser davantage nos plateformes. En effet nous ne souhaitons pas que nâimporte qui puisse atterrir sur la page de connexion dâun back-office. La nouvelle rĂšgle est donc : toutes les routes des back-offices seront prĂ©fixĂ©es par un mot âatypiqueâ qui doit ĂȘtre quasiment introuvable pour quiconque nâaurait pas besoin dây avoir accĂšs.
RĂ©sultat : Lors d'un rĂ©cent audit de sĂ©curitĂ©, notre back-office n'a pas Ă©tĂ© dĂ©tectĂ© par des tests d'intrusion en boite noire et boite grise đ”ïž
Câest plutĂŽt pratique pour Ă©viter une infiltration par la porte arriĂšre đȘ
Je vais vous montrer les changements rĂ©alisĂ©s sur nos plateformes et nos choix dâimplĂ©mentation.
Voici Ă quoi ressemble notre fichier config/routes.rb
actuellement :
Nous avons les routes de Devise pour notre admin, les routes Active Admin et aussi une route pour quâun administrateur connectĂ© puisse accĂ©der au tableau de bord de Sidekiq.
Tests unitaires
Pour lâexemple je pars dâune application Rails avec Devise, Active Admin et Rspec.
Comme le veut la bonne pratique et afin de documenter et guider notre implémentation, commençons par écrire nos tests.
Je veux mâassurer que la page de connexion du back-office soit introuvable avec lâURL /admin
mais quâen revanche tout fonctionne avec mon prĂ©fixe.
Nous choisirons le prĂ©fixe ârubyscuitâ pour lâexemple đ
Je souhaite Ă©galement que mon tableau de bord Sidekiq ne me redirige pas vers la page de connexion du back-office lorsquâaucun administrateur nâest connectĂ©. Nous reviendrons sur cette partie plus en dĂ©tails. En attendant voici les tests :
Préfixer des routes
LâidĂ©e ici est de donc de prĂ©fixer les routes Active Admin et Devise du back-office, pour quâelles soient introuvables.
Pour cela nous avons dĂ©cidĂ© de prĂ©fixer nos routes. Nous aurions pu choisir de les modifier, mais nous avons prĂ©fĂ©rĂ© garder la notion dâadmin.
Pour préfixer un groupe de route avec Rails il existe différentes options dont les namespaces et les scopes.
Il est important de comprendre la différence car elle affecte la structure de notre application.
Le namespace va prĂ©fixer le chemin de lâURL et va chercher Ă localiser un contrĂŽleur sous un module nommĂ© de la mĂȘme maniĂšre que le prĂ©fixe choisi.
Avec le code suivant dans config/routes.rb
Voici un exemple des routes que lâon obtient :
Nos routes ont Ă©tĂ© prĂ©fixĂ©es par ârubyscuitâ dans le chemin URI et Rails s'attend Ă ce que nos controllers (exceptĂ© ceux de Devise) soient dans un module du mĂȘme nom : Rubyscuit::Admin::Dashboard#index
.
Le scope est diffĂ©rent car il nâaffecte pas le chemin des ressources.
Voici les routes générées :
Comme on peut le voir /rubyscuit
a Ă©tĂ© ajoutĂ© comme prĂ©fixe, mais nos contrĂŽleurs n'ont pas besoin d'ĂȘtre dans un module.
Nous avons donc fait le choix dâutiliser les scopes pour ne pas surcharger lâapplication avec des modules non nĂ©cessaires. Notre but Ă©tant uniquement que le chemin du back-office ne se devine pas. Câest maintenant chose faite.
Grace Ă ce scope, mon URL pour la page de connexion est maintenant : /rubyscuit/admin/login
et mis Ă part vous, personne ne le devinera !
authenticate
vs authenticated
Ce nâest pas terminĂ© ! Rappelez-vous que nous avons cette route /sidekiq
pour accĂ©der au tableau de bord de Sidekiq lorsque nous sommes connectĂ©s en tant quâadministrateur.
Cette route frĂ©quemment utilisĂ©e sur les applications Rails dotĂ©es de Sidekiq nous pose un souci : lorsquâune personne non connectĂ©e essaye dây accĂ©der, elle renvoie automatiquement vers la page de connexion du back-office. Câest au helper authenticate
de Devise que nous devons ce comportement.
Toutes les personnes essayant dâaccĂ©der au tableau de bord, seront en mesure dâatterrir sur la page de connexion du back-office et donc de dĂ©couvrir lâURL prĂ©fixĂ©e.
La premiĂšre solution pourrait ĂȘtre de mettre cette route dans notre scope ârubyscuitâ.
Chez Capsens certains le font, dâautres non. Ceux qui ne le font pas considĂšrent que malgrĂ© le fait que le tableau de bord ne soit accessible que par un administrateur, il nâest pas Ă mĂ©langer aux routes de notre back-office, mais aussi par envie de garder cette route simple /sidekiq
. Libre à vous de choisir votre stratégie.
En partant du principe que nous ne souhaitons pas mettre cette route dans notre scope, nous allons simplement changer le helper authenticate
par un autre : authenticated
.
La différence est simple, authenticated
permet dâaccĂ©der Ă une route en fonction de l'authentification de notre administrateur. En dâautres termes : tant quâil nây a pas dâadministrateur, il nây pas a de route. En essayant dây accĂ©der nous ne serons plus redirigĂ©s mais nous tomberons sur une 404.
Les helpers Devise en question
Version finale de nos routes :
Maintenant, plus aucune chance de trouver le back-office !
Pour découvrir des nouveaux tips Ruby on Rails tous les mercredis à 16h, ne cherche plus, tu es au bon endroit !
Rendez-vous la semaine prochaine đ
Mélanie