Depuis plusieurs années, j’utilise AWS avec mon compte personnel, notamment pour des projets présentés dans mes précédents articles de blog comme la création de mon blog ou encore le serverless redirector URL visant toujours à tirer les coûts vers 0.

Dans cet article de blog, nous verrons comment mettre AWS IAM Identity Center (anciennement AWS SSO) avec Auth0 sans frais en utilisant votre authentification fédérée au travers de Auth0 (dans mon cas, via Google).

TLTR: Le repository GitHub avec le readme

AWS SSO avec Auth0

Prérequis

Pour comprendre ce post, vous devez:

Pour reproduire l’exemple de ce blog, vous devez :

Information

La solution utilise Terraform et automatise un maximum les étapes. Ce blog post ne vise pas à décrire les actions manuelles à faire sur AWS ou Auth0 en détail.

Les premières difficultés

Comme la plupart des personnes utilisant un compte AWS personnel, on se retrouve vite avec un IAM user sachant qu’il n’y qu’un seul compte sur lequel se connecter. Cependant, je me retrouvais avec plusieurs problématiques au fil du temps:

  • Un IAM user avec username et password en plus de mes autres credentials
  • L’usage de l’Access et Private Keys entre plusieurs postes de travail doivent être partagées de façon sécurisée cependant ce n’est pas toujours le cas. Je ne parle même pas des défis qu’entraîne la rotation des keys.
  • Je souhaitais créer plusieurs comptes AWS pour séparer mes projets. Une configuration SSO simplifie la gestion des accès en automatisant l’« assume role » entre plusieurs comptes AWS.

J’ai donc voulu mettre en place AWS IAM Identity Center (anciennement AWS SSO) au travers de mon adresse email Google afin de centraliser et simplifier l’authentification de mon côté. Après quelques recherches, on remarque vite que l’intégration est faite pour Google Workspace. Mauvaise nouvelle car Google Workspace est une offre payante orientée entreprise, ce qui est un peu dommage pour “Monsieur Tout-le-Monde”, qui ne dispose que d’une adresse email personnelle.

meme of user trying to use AWS SSO with Google Workspace

Comment mettre en place AWS IAM Identity Center (anciennement AWS SSO) tout en utilisant l’authentification fédérée de Google ?

La solution Auth0

Après quelques recherches, Auth0 semblait être le candidat parfait car celui-ci permettait d’un côté de s’authentifier via les Social Connections incluant Google (Gmail dans mon cas) mais aussi bien d’autres comme Microsoft, GitHub, etc. Et de l’autre côté de mettre en place AWS IAM Identity Center (anciennement AWS SSO) avec Auth0 et de façon gratuite !

Le workflow est donc le suivant pour se connecter au compte AWS:

graph LR;
    A[Google/Gmail authentication] -->|Oauth 2.0| B(Auth0)
    B --> |SAML 2.0| C(AWS account)

Côté Auth0 et le pricing ?

De ce côté, nous avons de la marge puisque le Free plan inclut 25 000 utilisateurs actifs mensuels ce qui est largement suffisant pour un usage personnel ou encore de l’ordre d’une startup.

Au delà de cela, le pricing Auth0 sur le Free plan offre pas mal de feature intéressante: Auth0 free plan features

Déployer la solution

J’ai mis en place la solution au travers de Terraform afin d’automatiser le déploiement au maximum et vous pouvez vous plonger dans le repository GitHub pour les plus curieux d’entre vous.

Les Prérequis de la solution

Pour utiliser la solution, il vous faudra:

  1. Un compte AWS avec un utilisateur ayant toutes les permissions sur identitystore a minima et les credentials de l’utilisateur utilisable par Terraform. Vous pouvez vous appuyer sur la documentation du provider AWS
  2. Un tenant Auth0 avec un utilisateur ayant assez de permission pour manager les applications et utilisateurs du tenant. Vous devez aussi générer un token pour cet utilisateur, en vous appuyant sur la documentation du provider Auth0 (baser sur la documentation du provider Auth0).

Enfin, avant de démarrer les prochaines étapes, faites un GIT clone du repository GitHub

ClickOps

L’API AWS de AWS IAM Identity Center (anciennement AWS SSO) est (très) limité et ne permet pas de créer ou de récupérer certains éléments. Nous devons donc effectuer certaines actions manuelles qui sont:

  1. Aller sur votre account management AWS et sélectionner la region primaire que vous utilisez.
  2. Aller dans AWS IAM Identity Center (anciennement AWS SSO) et activer celui-ci.
  3. Configurer le external identity provider source
  4. Récupérer le AWS IAM Identity Center Assertion Consumer (ACS) Service URL et placer la valeur dans votre terraform.tfvars via la variable aws_acs_callback_url.
  5. Ne fermez pas la page AWS précédante quand il vous manquera les informations de la partie partie Identity provider metadata: AWS IdP Metadata
  6. Dans votre fichier terraform.tfvars, ajouter les valeurs pour les variables region (la région AWS primaire choisie) et auth0_domain qui represente votre tenant Auth0 (ex: doge.eu.auth0.com).

La page AWS doit rester ouverte et sera finalisée dans les prochaines étapes après le terraform apply.

Information

A ce stade, votre fichier terraform.tfvars doit contenir les variables suivantes:

  • aws_acs_callback_url
  • region
  • auth0_domain

Création des groupes, users et policies

Pour créer un groupe, il faudra utiliser la variable Terraform sso_groups dans votre fichier terraform.tfvars. Voici un exemple du contenu de la variable (garder a l’esprit que la variable représente une liste de groupe):

sso_groups = [
  {
    name = "DevOps"
    description = "The DevOps team",
    policy_arns = [
      "arn:aws:iam::aws:policy/CloudWatchLogsFullAccess" # Policy must exist in the target account
    ],
    account_ids = [
      "123456789012", # AWS account ID
    ]
    members = [
      "contact@mehdilaruelle.com",
    ],
  },
]

Dans l’exemple précédant, nous avons:

  • name: qui est le nom du groupe.
  • description: la description du groupe (toujours bon d’en avoir une).
  • account_ids: la liste des account IDs.
  • policy_arns: la liste des AWS managed policies. Il y a une limite de 10 policies par groupes. Vous pouvez ‘bypass’ cette limite via une inline policy.
  • members: une liste des identifiants de vos users. Vous devez utiliser les adresses email des utilisateurs pour autoriser leurs connexions.

Avertissement

Les AWS managed policies doivent exister sur les AWS account IDs au risque d’avoir une erreur que la policy n’existe pas. Utiliser de préférence une AWS managed policy présente sur l’ensemble des AWS Account au lieu des Customer managed policies.

Étape finale de configuration et résultat

Une fois les étapes précédentes, vous pouvez lancer un terraform apply. Celui-ci vous donnera des outputs que nous utiliserons par la suite.

Il est temps pour nous de finaliser la configuration:

  1. Utiliser la commande suivante terraform output -raw aws_sso_idp_metadata > /tmp/auth0_metadata.xml pour sauvegarder le fichier dans /tmp/auth0_metadata.xml
  2. Retourner sur la page AWS ouverte précédemment sur la partie external identity provider source et uploader le fichier dans la section de la page Identity provider metadata: AWS IdP Metadata
  3. Retourner sur la page principale AWS IAM Identity Center (anciennement AWS SSO) et récupérer l’AWS access portal URL sur la section à droite de la page (à enregistrer dans vos favoris).

La configuration est finalisée. L’AWS access portal URL servira de lien de connexion à vos comptes AWS.

Vérification de la configuration

Si je prend la configuration exemple suivante:

sso_groups = [
  {
    name        = "Admin",
    description = "The admin group.",
    policy_arns = [
      "arn:aws:iam::aws:policy/AdministratorAccess"
    ],
    members = [
      "contact@mehdilaruelle.com"
    ],
    account_ids = [
      "123456789012"
    ],
  },
]

Je devrais pouvoir, avec mon adresse email, me connecter a un seul compte: 123456789012 via la permission Admin.

Pour vérifier cela (avec votre compte AWS), utiliser l’AWS access portal URL qui devrait vous rediriger sur une page Auth0: Step 1 to check the connectivity

Dans mon cas je me connecte via Google. Une seconde page apparait avec la liste des comptes (dans mon cas, un seul compte): Step 2 to check the connectivity Il suffit de cliquer sur Admin, ce qui vous redirigera vers votre compte avec les bons droits. 

Vous pouvez configurer votre AWS CLI avec le sso pour les lignes de commandes.

Et la suite ?

Le repository GitHub prend en compte la variable auth0_connection_name qui prend le nom d’une connection Auth0. Si cet input est fourni, les users créer dans AWS IAM Identity Center (anciennement AWS SSO) le seront aussi dans Auth0 dans la connexion Auth0 fournie.

Parmi les prochaines étapes possibles, l’implémentation du SCIM (System for Cross-domain Identity Management) peut être une idée d’amélioration même si souvent la feature est payante car vue comme une fonctionnalité entreprise.

Le repository est en cours de construction, si vous avez des idées ou suggestions d’amélioration, elles sont les bienvenues.

Conclusion

Nous avons vu comment implémenter le SSO dans AWS au travers de Auth0 et AWS IAM Identity Center (anciennement AWS SSO) tout en utilisant nos Social Connections telles que Google/Gmail et gratuitement.

Enfin, la solution est déployable au travers du repository GitHub même si certaines actions restent manuelles malheureusement par le manque d’API côté AWS.