【问题标题】:SSO with SAML, Keycloak and NextcloudSSO 与 SAML、Keycloak 和 Nextcloud
【发布时间】:2018-07-02 05:15:49
【问题描述】:

我正在尝试将 Keycloak 设置为 IdP(身份提供者)和 Nextcloud 作为服务。我想设置 Keycloak 以显示 SSO(单点登录)页面。

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

【问题讨论】:

    标签: single-sign-on saml keycloak nextcloud


    【解决方案1】:

    先决条件:

    要使用此答案,您需要将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,添加一个新的 Realm

    打开浏览器并转到 https://kc.domain.com 。点击管理控制台。正如您在docker-compose.yml 中指定的那样,用户名和密码为admin

    在页面的左上角,你需要创建一个新的Realm。点击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 的菜单栏。点击它。您现在可以看到所有与安全相关的应用程序。点击SSO & SAML authentication应用下方的Activate按钮。

    再次单击右上角的齿轮符号,然后单击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 证书:从 my-realmKeys 选项卡从 Keycloak 复制证书。您需要在密钥前面添加 '-----BEGIN CERTIFICATE-----' 并在其末尾添加 '-----END CERTIFICATE-----'。
    • 服务提供商数据:
      • 属性,显示名称:用户名
      • 属性,电子邮件地址:email
    • 安全设置,启用以下选项:
      • 指示是否将对该 SP 发送的 samlp:AuthnRequest 消息进行签名。 [SP 的元数据将提供此信息]
      • 表示是否会对该 SP 发送的 samlp:logoutRequest 消息进行签名。
      • 表示是否会对该 SP 发送的 samlp:logoutResponse 消息进行签名。
      • 表示要求对此 SP 接收到的 samlp:Response、samlp:LogoutRequest 和 samlp:LogoutResponse 元素进行签名。
      • 表示要求对此 SP 接收到的 saml:Assertion 元素进行签名。 [SP 的元数据将提供此信息]
    • 检查Download metadata XML 按钮旁边是否有Metadata valid
    • 单击Download metadata XML-按钮。这会生成并发送一个 XML 文件。保存以供下一步使用。

    配置 Keycloak,客户端

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

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

    变化:

    然后点击Save

    您将看到一个新屏幕。更改以下字段:

    在标签Mappers

    • 在预分配的role list(如果存在)上单击Delete-按钮
    • 点击Create
      • 姓名:用户名
      • 映射器类型:用户属性
      • 属性:用户名
      • SAML 属性名称:用户名
      • SAML 属性名称格式:基本
      • 点击Save
    • 点击Create
      • 姓名:电子邮件
      • 映射器类型:用户属性
      • 属性:电子邮件
      • SAML 属性名称:电子邮件
      • SAML 属性名称格式:基本
      • 点击Save
    • 点击Create
      • 名称:角色
      • 映射器类型:角色列表
      • 角色属性名称:角色
      • 友好名称:角色
      • SAML 属性名称格式:基本
      • 单角色属性:开启
      • 点击Save

    配置Keycloak,添加用户

    • 在左侧,点击Users
    • 点击右上角Add users
    • 设置以下值:
      • 用户名:用户
      • 电子邮件:user@domain.com
      • 点击Save
    • 在标签Credentials
      • 新密码:用户
      • 密码确认:用户
      • 临时:关闭
      • 点击Reset Password
    • 会弹出一个窗口:
      • 点击Change Password

    试运行

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

    使用隐身/私人浏览器窗口访问https://nc.domain.com。您将看到 keycloak 用户名/密码页面。输入user 作为名称和密码。您应该会看到 nextcloud 欢迎屏幕。

    致谢

    【讨论】:

    • 感谢您的精彩教程。不过,有一件事要提一下:如果您勾选"Enable "Use SAML auth for the Nextcloud desktop clients (requires user re-authentication),那么 Nextcloud 桌面客户端对我不起作用(卡在“重定向”屏幕上)。使用 ownCloud 客户端解决了这个问题,但给我们留下了另一个问题:用户每次退出客户端都必须重新进行身份验证,这真的很烦人。在 Windows 和 Ubuntu 18.04 上都会发生。 解决这个问题的方法就是不打勾。
    • @MadMike 您是如何将 Nextcloud 与 OIDC 连接起来的?
    • @srnjak 我还没有……还没有。我每天都在使用 nextcloud 和 keycloak+oidc 这两种技术。只是我在工作中私下使用nextcloud和keycloak+oidc。我在这里使用了 nextcloud+keycloak+saml 来获得一个完整的工作示例。那时我在工作中有更多的时间专注于sso的事情。不幸的是,从那以后这种情况发生了变化。它仍然是一个优先事项......以及一些新的优先事项:-|如果我可以建议:打开一个新问题并列出您的要求。我敢肯定,我不是唯一在这件事上有想法和专业知识的人。我保证会看一看。
    • Keycloak 4 和 nextcloud 17 beta:我没有预先指定的“角色列表”,我必须单击“添加内置”来添加“角色列表”。然后对其进行编辑并将“单一角色属性”切换为 TRUE。我猜默认情况下无论如何都会添加角色映射但不会显示。
    • 不是专家,但您指定的 openssl cli 会创建一个在 1 个月后过期的证书。我添加了“-days 3650”以使其有效期为 10 年 openssl req -nodes -new -x509 -days 3650 -keyout private.key -out public.cert
    【解决方案2】:

    这里是 nextcloud 15/16 的略微更新版本:

    打开浏览器并转到 https://kc.domain.com 。单击管理控制台。正如您在 docker-compose.yml 中指定的那样,用户名和密码是 admin。

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

    单击“键”选项卡。查看 RSA 条目。我们将需要复制该行的证书。单击证书并将内容复制粘贴到文本编辑器以供以后使用。 为 Nextcloud 准备私钥和证书

    打开终端并发出:

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

    这将创建两个文件:private.key 和 public.cert,我们稍后将需要它们用于 nextcloud 服务。 配置 Nextcloud

    打开浏览器并转到 https://nc.domain.com 。正如您在 docker-compose.yml 中指定的那样,用户名和密码是 admin。

    您需要激活默认禁用的 SSO 和 Saml Authenticate。

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

    单击右上角的齿轮符号,然后单击 + 应用程序符号。现在在左侧看到一个带有条目安全性的菜单栏。点击它。您现在可以看到所有安全相关的应用程序。单击 SSO 和 SAML 身份验证应用下方的激活按钮。

    再次单击右上角的齿轮符号,然后单击管理员。单击 SSO 和 SAML 身份验证。

    使用以下值:

    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.
    

    配置 Keycloak,客户端

    再次访问管理员控制台。单击客户端,然后单击右上角的创建按钮。

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

    变化:

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

    然后点击保存。

    您将看到一个新屏幕。更改以下字段:

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

    在选项卡上很重要:

    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
    

    点击创建

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

    点击创建

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

    配置Keycloak,添加用户

    On the left side, click on Users
    On the top-right, click Add users
    Set the following values:
        Username: user
        Email: user@domain.com
        Click Save
    On the tab Credentials:
        New Password: user
        Password Confirmation: user
        Temporary: Off
        Click Reset Password
    A Window pops up:
        Click Change Password
    

    【讨论】:

    • 唯一的编辑是角色,对吗?我建议将其作为主帖的编辑。
    猜你喜欢
    • 2014-07-04
    • 2021-12-02
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多