single-sign-on - 具有SAML,Keycloak和Nextcloud的SSO

标签 single-sign-on saml keycloak nextcloud

我正在尝试将Keycloak设置为IdP(身份提供商)并将Nextcloud设置为服务。我想将Keycloak设置为呈现SSO(单点登录)页面。

我正在运行具有Intel兼容CPU的Linux服务器。什么是正确的配置?


Keycloak将以https://kc.domain.com的身份运行
Nextcloud将以https://nc.domain.com的身份运行

最佳答案

先决条件

要使用此答案,您需要将domain.com替换为您拥有的实际域。另外,将email@domain.com替换为您的工作电子邮件地址。

假设您已安装并正在运行docker和docker-compose。

使用Docker设置服务

除了keycloak和nextcloud之外,我还使用:


Nginx作为反向代理
letsencyrpt可以为子域生成SSL证书。


我正在使用docker和docker-compose设置所有必需的服务。 docker-compose.yml的外观如下所示:

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
      - LETSENCRYPT_EMAIL=email@domain.com

  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
      - LETSENCRYPT_EMAIL=email@domain.com

  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


我将docker-files放在文件夹docker中,在该文件夹中有一个项目特定的文件夹。在这里keycloak。使用以下方法创建它们:

mkdir -p ~/docker/keycloak


在此文件夹中使用首选编辑器创建docker-compose.yml-文件。通过以下方式启动服务:

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


请稍等片刻,让服务下载并启动。检查是否一切都在运行:

docker-compose ps


如果服务未运行。发出第二个docker-compose up -d并再次检查。

配置Keycloak,添加新领域

打开浏览器,然后转到https://kc.domain.com。单击管理控制台。按照docker-compose.yml中的指定,用户名和密码为admin

在页面的左上角,您需要创建一个新的领域。单击Add。输入my-realm作为名称。单击Save

单击Keys-选项卡。查看RSA条目。我们将需要复制该行的证书。单击Certificate,然后将内容复制粘贴到文本编辑器中,以备后用。

准备Nextcloud的私钥和证书

打开终端并发出:

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


这将创建两个文件:private.keypublic.cert,稍后我们需要nextcloud服务。

配置Nextcloud

打开浏览器,然后转到https://nc.domain.com。按照docker-compose.yml中的指定,用户名和密码为admin

您需要激活默认情况下禁用的SSO & Saml Authenticate

重要从此处开始,直到测试安装并运行之后,才关闭当前浏览器窗口。如果您在一切正常之前关闭浏览器,则可能无法再在nextcloud中更改设置。在这种情况下,您将需要停止nextcloud-和nextcloud-db-container,删除它们各自的文件夹,重新创建它们,然后重新开始。

单击右上角的齿轮符号,然后单击+ Apps符号。现在在左侧看到带有条目Security的菜单栏。点击它。现在,您将看到所有已实现安全性的应用。单击Activate应用程序下方的SSO & SAML authentication按钮。

再次单击右上角的齿轮符号,然后单击Admin。点击SSO & SAML authentication

使用以下值:


将UID映射到:用户名的属性
启用“对Nextcloud桌面客户端使用SAML身份验证(需要用户重新身份验证)”
public.cert的内容复制到“ X.509证书”字段中
private.key的内容复制到“服务提供商的私钥”字段中。
IdP的标识符:https://kc.domain.com/auth/realms/my-realm
SP将在其中发送身份验证请求消息的IdP的URL目标:https://kc.domain.com/auth/realms/my-realm/protocol/saml
SP将向其发送SLO请求的IdP的URL位置:https://kc.domain.com/auth/realms/my-realm/protocol/saml
IdP的公共X.509证书:从Keysmy-realm选项卡中的Keycloak复制证书。您将需要在密钥前面添加“ ----- BEGIN CERTIFICATE -----”,并在其末尾添加“ ----- END CERTIFICATE -----”。
在服务提供商数据中:


属性,显示名称:用户名
属性,电子邮件地址:电子邮件
单击Download metadata XML并保存文件以进行下一步。

在“安全设置”中,启用以下选项:


指示是否将对此SP发送的消息进行签名。 [SP的元数据将提供此信息]
指示是否将对此SP发送的消息进行签名。
指示是否将对此SP发送的消息进行签名。
指示对此SP接收到的和元素进行签名的要求。
指示对此SP接收的元素进行签名的要求。 [SP的元数据将提供此信息]

检查Metadata valid-按钮旁边是否有Download metadata XML
This part of the configuration should look like this
单击Download metadata XML-按钮。这将生成并发送XML文件。保存。


配置Keycloak,客户端

再次访问管理员控制台。单击Clients,然后在右上角单击Create-按钮。

在导入旁边,单击Select File-按钮。选择您在Nextcloud的最后一步中创建的XML文件。

更改:


客户端SAML端点:https://kc.domain.com/auth/realms/my-realm


然后单击Save

出现一个新屏幕。更改以下字段:


名称:Nextcloud
有效的重定向URI:https://nc.domain.com/ *
点击Save


在选项卡Matters上:


单击预先分配的Delete上的role list-按钮
点击Create


名称:用户名
映射器类型:用户属性
属性:用户名
SAML属性名称:用户名
SAML属性名称格式:基本
点击Save

点击Create


名称:电子邮件
映射器类型:用户属性
财产:电子邮件
SAML属性名称:电子邮件
SAML属性名称格式:基本
点击Save

点击Create


名称:角色
映射器类型:角色列表
角色属性名称:角色
友好名称:角色
SAML属性名称格式:基本
单一角色归属:开启
点击Save



配置Keycloak,添加用户


在左侧,单击Users
点击右上角的Add users
设置以下值:


用户名:user
电子邮件:user@domain.com
点击Save

在选项卡Credentials上:


新密码:用户
密码确认:用户
临时:关闭
点击Reset Password

弹出一个窗口:


点击Change Password



测试运行

以隐身/私人模式打开新的浏览器窗口。例如。对于google-chrome按Ctrl-Shift-N,在Firefox中按Ctrl-Shift-P。保持另一个浏览器窗口打开nextcloud设置页面。否则,您可能会被锁定。

使用隐身/私人浏览器窗口访问https://nc.domain.com。将显示给您密钥库用户名/密码页面。输入user作为名称和密码。应该用nextcloud欢迎屏幕打招呼。

致谢


如果没有精彩的http://int128.hatenablog.com/entry/2018/01/16/194048博客条目,本指南将是不可能的。我已经用google-translator用英语阅读过。
还要感谢RMM。他的wiki entry允许我为nextcloud创建正确的密钥并启用消息签名,从而改善了答案。

关于single-sign-on - 具有SAML,Keycloak和Nextcloud的SSO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48400812/

相关文章:

android - 授权用户通过谷歌服务使用 REST API

azure - 使用 AZURE B2C 身份验证的 Spring Boot OAuth2 服务器

google-app-engine - 云应用程序和单点登录(AD 集成)

wcf - 如何通过 SAML 断言从 ACS 获取访问 token ?

c# - .NET 2.0 的 SAML

.net - SSO 获取用户名/域

x509certificate - 如何创建签名的AuthNRequest?

freemarker - Freemarker 模板中的 Keycloak 访问 cookie 和/或 url 查询参数

keycloak - 为什么 'id'在 key 斗篷中称为 'sub'?

spring - 带有 Spring Cloud Gateway 的 Keycloak