web-dev-qa-db-fra.com

SSO avec SAML, Keycloak et Nextcloud

J'essaie de configurer Keycloak en tant qu'IdP (fournisseur d'identité) et Nextcloud en tant que service. Je souhaite configurer Keycloak de manière à présenter une page SSO (authentification unique).

J'utilise un serveur Linux avec un processeur compatible Intel. Quelle est la bonne configuration?

9
MadMike

Prérequis

Pour utiliser cette réponse, vous devrez remplacer domain.com avec un domaine réel que vous possédez. Remplacez également [email protected] avec votre adresse e-mail de travail.

Il est supposé que Docker et Docker-compose sont installés et exécutés.

Configurez vos services avec Docker

En plus de keycloak et nextcloud j'utilise:

  • nginx comme proxy inverse
  • permet àencyency de générer les certificats SSL pour les sous-domaines.

J'installe tous les services nécessaires avec docker et docker-compose. C'est ainsi que le docker-compose.yml ressemble à ça:

version: '2'

  nginx-proxy:
    image: jwilder/nginx-proxy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/etc/nginx/vhost.d"
      - "./proxy-default.conf:/etc/nginx/conf.d/my-proxy.default.conf:ro"
      - "/usr/share/nginx/html"
      - "/var/run/docker.sock:/tmp/docker.sock:ro"
      - "./le-cert:/etc/nginx/certs:ro"
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"

  letsencrypt-nginx-proxy-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    restart: unless-stopped
    depends_on:
      - nginx-proxy
    container_name: le-proxy-companion
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./le-cert:/etc/nginx/certs:rw"
    volumes_from:
      - nginx-proxy

  keycloak:
    image: jboss/keycloak
    links:
      - keycloak-postgres:postgres
    ports:
      - 8080:8080
    volumes:
      - ./keycloak:/opt/jboss/keycloak
    environment:
      - KEYCLOAK_USER=admin
      - KEYCLOAK_PASSWORD=admin
      - "PROXY_ADDRESS_FORWARDING=true"
      - VIRTUAL_PORT=8080
      - VIRTUAL_Host=kc.domain.com
      - LETSENCRYPT_Host=kc.domain.com
      - [email protected]

  keycloak-postgres:
    image: postgres
    environment:
      - POSTGRES_DB=keycloak
      - POSTGRES_USER=keycloak
      - POSTGRES_PASSWORD=keycloak

  nextcloud:
    image: hoellen/nextcloud
    environment:
      - UPLOAD_MAX_SIZE=10G
      - APC_SHM_SIZE=128M
      - OPCACHE_MEM_SIZE=128
      - CRON_PERIOD=15m
      - TZ=Europe/Berlin
      - DOMAIN=nc.domain.com
      - ADMIN_USER=admin
      - ADMIN_PASSWORD=admin
      - DB_TYPE=mysql
      - DB_NAME=nextcloud
      - DB_USER=nextcloud
      - DB_PASSWORD=nextcloud
      - DB_Host=nc-db
    volumes:
      - ./nc/nc-data:/data
      - ./nc/nc-config:/config
      - ./nc/nc-apps:/apps2
      - ./nc/nc-themes:/nextcloud/themes
    environment:
      - VIRTUAL_Host=nc.domain.com
      - LETSENCRYPT_Host=nc.domain.com
      - [email protected]

  nc-db:
    image: mariadb
    volumes:
      - ./nc/nc-db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=nextcloud
      - MYSQL_PASSWORD=nextcloud
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

J'ai placé mes fichiers docker dans un dossier docker et dans ce dossier un dossier spécifique au projet. Ici keycloak. Créez-les avec:

mkdir -p ~/docker/keycloak

Créez le docker-compose.yml- Fichier avec votre éditeur préféré dans ce dossier. Démarrez les services avec:

cd ~/docker/keycloak
docker-compose up -d

Attendez un moment pour laisser les services se télécharger et démarrer. Vérifiez si tout fonctionne avec:

docker-compose ps

Si un service n'est pas en cours d'exécution. Émettez une seconde docker-compose up -d et vérifiez à nouveau.

Configurer Keycloak, ajouter un nouveau domaine

Ouvrez un navigateur et accédez à https://kc.domain.com . Cliquez sur Console d'administration. Comme spécifié dans votre docker-compose.yml, Le nom d'utilisateur et le mot de passe sont admin.

En haut à gauche de la page, vous devez créer un nouveau Realm. Cliquez sur Add. Entrez my-realm comme nom. Cliquez sur Save.

Cliquez sur l'onglet Keys-. Regardez l'entrée RSA-. Nous devrons copier le certificat de cette ligne. Cliquez sur Certificate et copiez-collez le contenu dans un éditeur de texte pour une utilisation ultérieure.

Préparer une clé privée et un certificat pour Nextcloud

Ouvrez un terminal et lancez:

openssl req  -nodes -new -x509  -keyout private.key -out public.cert

Cela crée deux fichiers: private.key et public.cert dont nous aurons besoin plus tard pour le service nextcloud.

Configurer Nextcloud

Ouvrez un navigateur et accédez à https://nc.domain.com . Comme spécifié dans votre docker-compose.yml, Le nom d'utilisateur et le mot de passe sont admin.

Vous devez activer le SSO & Saml Authenticate qui est désactivé par défaut.

Important A partir de là ne fermez pas votre actuel fenêtre du navigateur jusqu'à ce que l'installation soit testée et en cours d'exécution. Si vous fermez le navigateur avant que tout fonctionne, vous ne pourrez probablement plus modifier vos paramètres dans nextcloud. Dans un tel cas, vous devrez arrêter le conteneur nextcloud et nextcloud-db, supprimer leurs dossiers respectifs, les recréer et recommencer à nouveau.

Cliquez sur le symbole d'engrenage en haut à droite, puis sur le + Apps-signe. Sur la gauche, voyez maintenant une barre de menu avec l'entrée Security. Cliquez dessus. Vous voyez maintenant toutes les applications liées à la sécurité. Cliquez sur le bouton Activate sous le SSO & SAML authentication App.

Cliquez à nouveau sur le symbole d'engrenage en haut à droite et cliquez sur Admin. Cliquer sur SSO & SAML authentication.

Utilisez les valeurs suivantes:

  • Attribut pour mapper l'UID à: nom d'utilisateur
  • Activer "Utiliser l'authentification SAML pour les clients de bureau Nextcloud (nécessite une réauthentification de l'utilisateur)"
  • Copiez le contenu de public.cert dans le champ "Certificat X.509"
  • Copiez le contenu de private.key dans le champ "Clé privée du fournisseur de services".
  • Identifiant de l'IdP: https://kc.domain.com/auth/realms/my-realm
  • URL Cible de l'IdP où le SP enverra le message de demande d'authentification: https://kc.domain.com/auth/realms/my-realm/ protocole/saml
  • URL Emplacement de l'IdP où le SP enverra la demande SLO: https://kc.domain.com/auth/realms/my-realm/protocol/ saml
  • Certificat X.509 public de l'IdP: copiez le certificat de Keycloak depuis l'onglet Keys- de my-realm. Vous devrez ajouter '----- BEGIN CERTIFICATE -----' devant la clé et '----- END CERTIFICATE -----' à la fin de celle-ci.
  • Dans les données du fournisseur de services:
    • Attribut, nom d'affichage: nom d'utilisateur
    • Attribut, adresse e-mail: e-mail Cliquez sur Download metadata XML et enregistrez le fichier pour l'étape suivante.
  • Paramètres de sécurité, activer les options suivantes:
    • Indique si les messages envoyés par ce SP seront signés. [Les métadonnées du SP offrira cette info]
    • Indique si les messages envoyés par ce SP seront signés.
    • Indique si les messages envoyés par ce SP seront signés.
    • Indique une exigence pour le, et les éléments reçus par ce SP à signer.
    • Indique une exigence pour les éléments reçus par ce SP à signer. [Les métadonnées du SP offrira cette info]
  • Vérifiez qu'il y a un Metadata valid à côté de la Download metadata XML-Bouton This part of the configuration should look like this
  • Clique le Download metadata XML-Bouton. Cela génère et envoie un fichier XML. Sauvegarde le.

Configurer Keycloak, Client

Accédez à nouveau à la console d'administration. Cliquez sur Clients et en haut à droite cliquez sur le bouton Create-.

À côté de Importer, cliquez sur le Select File-Bouton. Sélectionnez le fichier XML que vous avez créé à la dernière étape de Nextcloud.

Changement:

et cliquez sur Save.

Un nouvel écran vous est présenté. Modifiez les champs suivants:

Sur l'onglet Matters:

  • Cliquez sur Delete- Bouton sur le pré-affecté role list
  • Cliquez sur Create
    • Nom: nom d'utilisateur
    • Type de mappeur: Propriété utilisateur
    • Propriété: nom d'utilisateur
    • Nom d'attribut SAML: nom d'utilisateur
    • Attribut SAML NameFormat: De base
    • Cliquez sur Save
  • Cliquez sur Create
    • Nom: email
    • Type de mappeur: Propriété utilisateur
    • Propriété: email
    • Nom d'attribut SAML: email
    • Attribut SAML NameFormat: De base
    • Cliquez sur Save

Configurer Keycloak, ajouter un utilisateur

  • Sur le côté gauche, cliquez sur Users
  • En haut à droite, cliquez sur Add users
  • Définissez les valeurs suivantes:
  • Dans l'onglet Credentials:
    • Nouveau mot de passe: utilisateur
    • Confirmation du mot de passe: utilisateur
    • Temporaire: Off
    • Cliquez sur Reset Password
  • Une fenêtre apparaît:
    • Cliquez sur Change Password

Essai

Ouvrez une nouvelle fenêtre de navigateur en mode navigation privée/privée. Par exemple. pour google-chrome, appuyez sur Ctrl-Shift-N, dans Firefox, appuyez sur Ctrl-Shift-P. Gardez l'autre fenêtre du navigateur avec la page de configuration de nextcloud ouverte . Sinon, vous pourriez vous enfermer.

Accès https://nc.domain.com avec la fenêtre de navigation privée/privée. La page Nom d'utilisateur/Mot de passe Keycloak s'affiche. Entrez user comme nom et mot de passe. Vous devriez être accueilli avec l'écran de bienvenue de nextcloud.

Reconnaissance

27
MadMike

Voici une version légèrement mise à jour pour nextcloud 15/16:

Ouvrez un navigateur et accédez à https://kc.domain.com . Cliquez sur Administration Console. Comme spécifié dans votre docker-compose.yml, le nom d'utilisateur et le mot de passe sont admin.

En haut à gauche de la page, vous devez créer un nouveau domaine. Cliquez sur Ajouter. Entrez mon domaine comme nom. Cliquez sur Enregistrer.

Cliquez sur l'onglet Clés. Regardez l'entrée RSA. Nous devrons copier le certificat de cette ligne. Cliquez sur Certificat et copiez-collez le contenu dans un éditeur de texte pour une utilisation ultérieure. Préparer une clé privée et un certificat pour Nextcloud

Ouvrez un terminal et lancez:

openssl req -nodes -new -x509 -keyout private.key -out public.cert

Cela crée deux fichiers: private.key et public.cert dont nous aurons besoin plus tard pour le service nextcloud. Configurer Nextcloud

Ouvrez un navigateur et accédez à https://nc.domain.com . Comme spécifié dans votre docker-compose.yml, le nom d'utilisateur et le mot de passe sont admin.

Vous devez activer l'authentification SSO et Saml qui est désactivée par défaut.

Important À partir d'ici, ne fermez pas la fenêtre de votre navigateur actuel jusqu'à ce que la configuration soit testée et en cours d'exécution. Si vous fermez le navigateur avant que tout fonctionne, vous ne pourrez probablement plus modifier vos paramètres dans nextcloud. Dans un tel cas, vous devrez arrêter le conteneur nextcloud et nextcloud-db, supprimer leurs dossiers respectifs, les recréer et recommencer à nouveau.

Cliquez sur le symbole d'engrenage en haut à droite, puis sur le signe + Applications. Sur la gauche, voyez maintenant une barre de menu avec l'entrée Sécurité. Cliquez dessus. Vous voyez maintenant toutes les applications liées à la sécurité. Cliquez sur le bouton Activer sous l'application d'authentification SSO et SAML.

Cliquez à nouveau sur le symbole d'engrenage en haut à droite et cliquez sur Admin. Cliquez sur Authentification SSO et SAML.

Utilisez les valeurs suivantes:

Attribute to map UID to:username
Enable "Use SAML auth for the Nextcloud desktop clients (requires user re-authentication)"
Copy the content ofpublic.cert into the 'X.509 Certificate'-field
Copy the content ofprivate.key into the 'Private key of Service Provider'-field.
Identifier of the IdP: https://kc.domain.com/auth/realms/my-realm
URL Target of the IdP where the SP will send the Authentication Request Message: https://kc.domain.com/auth/realms/my-realm/protocol/saml
URL Location of IdP where the SP will send the SLO Request: https://kc.domain.com/auth/realms/my-realm/protocol/saml
Public X.509 certificate of the IdP: Copy the certificate from Keycloak from the Keys-tab of my-realm. You will need to add '-----BEGIN CERTIFICATE-----' in front of the key and '-----END CERTIFICATE-----' to the end of it.
In Identity Provider Data:
    Attribute, displayname: username
    Attribute, email adress: email
    Attribute, Quota: nextcloudquota
    Click Download metadata XML and save the file for the next step.
Security Settings, enable the following options:
    Indicates whether the messages sent by this SP will be signed. [Metadata of the SP will offer this info]
    Indicates whether the messages sent by this SP will be signed.
    Indicates whether the messages sent by this SP will be signed.
    Indicates a requirement for the , and elements received by this SP to be signed.
    Indicates a requirement for the elements received by this SP to be signed. [Metadata of the SP will offer this info]
Check there is a Metadata valid beside the Download metadata XML-Button
Click the Download metadata XML-Button. This generate and send a XML file. Save it.

Configurer Keycloak, Client

Accédez à nouveau à la console d'administration. Cliquez sur Clients et en haut à droite sur le bouton Créer.

À côté de Importer, cliquez sur le bouton Sélectionner un fichier. Sélectionnez le fichier XML que vous avez créé à la dernière étape de Nextcloud.

Changement:

Client SAML Endpoint: https://kc.domain.com/auth/realms/my-realm

et cliquez sur Enregistrer.

Un nouvel écran vous est présenté. Modifiez les champs suivants:

Name: Nextcloud
Valid Redirect URIs: https://nc.domain.com/ *
Click Save

On the Tab Matters:

Click Delete-Button on the preassigned role list
Click Create
    Name: username
    Mapper Type: User Property
    Property: username
    SAML Attribute Name: username
    SAML Attribute NameFormat: Basic
    Click Save
Click Create
    Name: email
    Mapper Type: User Property
    Property: email
    SAML Attribute Name: email
    SAML Attribute NameFormat: Basic
    Click Save

Cliquez sur Créer

Name: Roles
Mapper Type: Role List
Role attribute name: Roles
Friendly Name: roles
SAML Attribute NameFormat: Basic
Single Role Attrubute: On
Click Save

Cliquez sur Créer

Name: nextcloudquota
Mapper Type: User Property
Property: nextcloudquota
SAML Attribute Name: nextcloudquota
SAML Attribute NameFormat: Basic
Click Save

Configurer Keycloak, ajouter un utilisateur

On the left side, click on Users
On the top-right, click Add users
Set the following values:
    Username: user
    Email: [email protected]
    Click Save
On the tab Credentials:
    New Password: user
    Password Confirmation: user
    Temporary: Off
    Click Reset Password
A Window pops up:
    Click Change Password
1
Matthew Frost