Saltar al contenido

SSO con SAML, Keycloak y Nextcloud

Ya no necesitas investigar más por todo internet ya que has llegado al sitio perfecto, poseemos la respuesta que quieres sin complicarte.

Solución:

Requisito previo:

Para usar esta respuesta, deberá reemplazar domain.com con un real dominio tu propio. Además, reemplace [email protected] con su dirección de correo electrónico de trabajo.

Se supone que tiene Docker y Docker-compose instalados y en ejecución.

Configura tus servicios con Docker

Además de keycloak y nextcloud utilizo:

  • nginx como un proxy inverso
  • letencyrpt para generar los certificados SSL para los subdominios.

Estoy configurando todos los servicios necesarios con docker y docker-compose. Así es como el docker-compose.yml Se ve como esto:

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

Pongo mis archivos de la ventana acoplable en una carpeta docker y dentro de esta carpeta una carpeta específica del proyecto. Aquí keycloak. Créelos con:

mkdir -p ~/docker/keycloak

Crea el docker-compose.yml-Archivo con su editor preferido en esta carpeta. Inicie los servicios con:

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

Espere un momento para que los servicios se descarguen y comiencen. Compruebe si todo está funcionando con:

docker-compose ps

Si un servicio no se está ejecutando. Emita un segundo docker-compose up -d y vuelva a comprobar.

Configurar Keycloak, agregar un nuevo reino

Abra un navegador y vaya a https://kc.domain.com. Haga clic en Consola de administración. Como se especifica en su docker-compose.yml, El nombre de usuario y la contraseña son admin.

En la parte superior izquierda de la página, debe crear un nuevo Reino. Hacer clic Add. Ingresar mi-reino como el nombre. Hacer clic Save.

Clickea en el Keys-pestaña. Mira el RSA-entrada. Necesitaremos copiar el Certificado de esa línea. Haga clic en Certificate y copie y pegue el contenido en un editor de texto para su uso posterior.

Prepare una clave privada y un certificado para Nextcloud

Abra una terminal y emita:

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

Esto crea dos archivos: private.key y public.cert que necesitaremos más adelante para el servicio nextcloud.

Configurar Nextcloud

Abra un navegador y vaya a https://nc.domain.com. Como se especifica en su docker-compose.yml, El nombre de usuario y la contraseña son admin.

Necesita activar el SSO & Saml Authenticate que está deshabilitado por defecto.

Importante A partir de aquí no cierres tu Actual ventana del navegador hasta que se pruebe la configuración y se ejecute. Si cierra el navegador antes de que todo funcione, probablemente ya no podrá cambiar su configuración en nextcloud. En tal caso, deberá detener el contenedor nextcloud- y nextcloud-db-container, eliminar sus carpetas respectivas, volver a crearlas y comenzar de nuevo.

Haga clic en el símbolo de engranaje superior derecho y luego en el + Apps-firmar. A la izquierda ahora ve una barra de menú con la entrada Security. Pinchalo. Ahora verá todas las aplicaciones relacionadas con la seguridad. Clickea en el Activate botón debajo del SSO & SAML authentication App.

Haga clic en el símbolo de engranaje superior derecho nuevamente y haga clic en Admin. Haga clic en SSO & SAML authentication.

Utilice los siguientes valores:

  • Atributo para mapear UID a: nombre de usuario
  • Habilite “Usar autenticación SAML para los clientes de escritorio de Nextcloud (requiere una nueva autenticación del usuario)”
  • Copia el contenido de public.cert en el campo ‘Certificado X.509’
  • Copia el contenido de private.key en el campo ‘Clave privada del proveedor de servicios’.
  • Identificador del IdP: https://kc.domain.com/auth/realms/my-realm
  • Destino de URL del IdP donde el SP enviará el mensaje de solicitud de autenticación: https://kc.domain.com/auth/realms/my-realm/protocol/saml
  • Ubicación URL del IdP donde el SP enviará la solicitud de SLO: https://kc.domain.com/auth/realms/my-realm/protocol/saml
  • Certificado público X.509 del IdP: copie el certificado de Keycloak del Keys-pestaña de my-realm. Deberá agregar ‘—– BEGIN CERTIFICATE —–‘ delante de la clave y ‘—– END CERTIFICATE —–‘ al final.
  • Datos del proveedor en servicio:
    • Atributo, nombre para mostrar: nombre de usuario
    • Atributo, dirección de correo electrónico: Email
      Hacer clic Download metadata XML y guarde el archivo para el siguiente paso.
  • Configuraciones de seguridad, habilitar las siguientes opciones:
    • Indica si se firmarán los mensajes samlp: AuthnRequest enviados por este SP. [Metadata of the SP will offer this info]
    • Indica si se firmarán los mensajes samlp: logoutRequest enviados por este SP.
    • Indica si se firmarán los mensajes samlp: logoutResponse enviados por este SP.
    • Indica un requisito para que se firmen los elementos samlp: Response, samlp: LogoutRequest y samlp: LogoutResponse recibidos por este SP.
    • Indica un requisito para la firma de los elementos saml: Assertion recibidos por este SP. [Metadata of the SP will offer this info]
  • Compruebe que hay un Metadata valid al lado de Download metadata XML-Botón
    Esta parte de la configuración debería verse así
  • Haga clic en el Download metadata XML-Botón. Esto genera y envía un archivo XML. Guárdalo.

Configurar Keycloak, Cliente

Vuelva a acceder a la Consola del administrador. Haga clic en Clients y en la parte superior derecha, haga clic en el Create-Botón.

Junto a Importar, haga clic en el Select File-Botón. Seleccione el archivo XML que ha creado en el último paso en Nextcloud.

Cambio:

  • Punto final SAML del cliente: https://kc.domain.com/auth/realms/my-realm

y haga clic en Save.

Se le presenta una nueva pantalla. Cambie los siguientes campos:

  • Nombre: Nextcloud
  • URI de redireccionamiento válidos: https://nc.domain.com/ *
  • Hacer clic Save

En la pestaña Matters:

  • Hacer clic Delete-Botón en el preasignado role list
  • Hacer clic Create
    • Nombre: nombre de usuario
    • Tipo de mapeador: Propiedad del usuario
    • Propiedad: nombre de usuario
    • Nombre de atributo SAML: nombre de usuario
    • Nombre del atributo SAML Formato: Básico
    • Hacer clic Save
  • Hacer clic Create
    • Nombre: Email
    • Tipo de mapeador: Propiedad del usuario
    • Propiedad: Email
    • Nombre de atributo SAML: Email
    • Nombre del atributo SAML Formato: Básico
    • Hacer clic Save
  • Hacer clic Create
    • Nombre: Roles
    • Tipo de mapeador: Lista de roles
    • Nombre del atributo de función: Roles
    • Nombre amigable: roles
    • Nombre del atributo SAML Formato: Básico
    • Atributo de rol único: activado
    • Hacer clic Save

Configurar Keycloak, agregar usuario

  • En el lado izquierdo, haga clic en Users
  • En la esquina superior derecha, haz clic en Add users
  • Establezca los siguientes valores:
    • Nombre de usuario: usuario
    • Correo electrónico: [email protected]
    • Hacer clic Save
  • En la pestaña Credentials:
    • Nueva contraseña: usuario
    • Confirmación de contraseña: usuario
    • Temporal: Apagado
    • Hacer clic Reset Password
  • Aparece una ventana:
    • Hacer clic Change Password

Prueba de funcionamiento

Abra una nueva ventana del navegador en modo incógnito / privado. P.ej. para prensa de google-chrome Ctrl-Shift-N, en Firefox presione Ctrl-Shift-P. Guardar la otra ventana del navegador con la página de configuración de nextcloud abierto. De lo contrario, podría encerrarse.

Acceda a https://nc.domain.com con la ventana de incógnito / navegador privado. Se le presenta la página de nombre de usuario / contraseña de keycloak. Ingresar user como nombre y contraseña. Debería ser recibido con la pantalla de bienvenida de nextcloud.

Reconocimiento

  • Esta guía no hubiera sido posible sin la maravillosa entrada de blog http://int128.hatenablog.com/entry/2018/01/16/194048. Lo leí con el traductor de google en inglés.
  • Gracias también a RMM. Su entrada en la wiki me permitió crear claves correctas para nextcloud y habilitar la firma de mensajes, mejorando así esta respuesta.

Aquí hay una versión ligeramente actualizada para nextcloud 15/16:

Abra un navegador y vaya a https://kc.domain.com. Haga clic en Consola de administración. Como se especifica en su docker-compose.yml, el nombre de usuario y la contraseña son admin.

En la parte superior izquierda de la página, debe crear un nuevo Reino. Haga clic en Agregar. Ingrese mi-reino como nombre. Clic en Guardar.

Haga clic en la pestaña Teclas. Mira la entrada RSA. Necesitaremos copiar el Certificado de esa línea. Haga clic en Certificado y copie y pegue el contenido en un editor de texto para su uso posterior. Prepare una clave privada y un certificado para Nextcloud

Abra una terminal y emita:

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

Esto crea dos archivos: private.key y public.cert que necesitaremos más adelante para el servicio nextcloud. Configurar Nextcloud

Abra un navegador y vaya a https://nc.domain.com. Como se especifica en su docker-compose.yml, el nombre de usuario y la contraseña son admin.

Debe activar SSO y Saml Authenticate, que está deshabilitado de forma predeterminada.

Importante A partir de aquí, no cierre la ventana actual del navegador hasta que la configuración esté probada y en ejecución. Si cierra el navegador antes de que todo funcione, probablemente ya no podrá cambiar su configuración en nextcloud. En tal caso, deberá detener el contenedor nextcloud- y nextcloud-db-container, eliminar sus carpetas respectivas, volver a crearlas y comenzar de nuevo.

Haga clic en el símbolo de engranaje superior derecho y luego en el signo + Aplicaciones. A la izquierda, ahora verá una barra de menú con la entrada Seguridad. Pinchalo. Ahora verá todas las aplicaciones relacionadas con la seguridad. Haga clic en el botón Activar debajo de la aplicación de autenticación SSO y SAML.

Haga clic en el símbolo de engranaje superior derecho nuevamente y haga clic en Administrador. Haga clic en autenticación SSO y SAML.

Utilice los siguientes valores:

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.

Configurar Keycloak, Cliente

Acceda de nuevo a la Consola del administrador. Haga clic en Clientes y en la parte superior derecha haga clic en el botón Crear.

Junto a Importar, haga clic en el botón Seleccionar archivo. Seleccione el archivo XML que ha creado en el último paso en Nextcloud.

Cambio:

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

y haga clic en Guardar.

Se le presenta una nueva pantalla. Cambie los siguientes campos:

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

En la pestaña Asuntos:

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

Haga clic en Crear

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

Haga clic en Crear

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

Configurar Keycloak, agregar usuario

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *