SSO与SAML,Keycloak和Nextcloud

时间:2018-01-23 11:37:41

标签: single-sign-on saml keycloak nextcloud

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

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

3 个答案:

答案 0 :(得分:24)

Prerequisit

要使用此答案,您需要将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。单击管理控制台。根据{{​​1}}中的规定,用户名和密码为docker-compose.yml

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

点击Save - 标签。查看Keys - 条目。我们需要复制该行的证书。单击RSA并将内容复制粘贴到文本编辑器中以供日后使用。

为Nextcloud准备私钥和证书

打开终端并发出:

Certificate

这会创建两个文件:openssl req -nodes -new -x509 -keyout private.key -out public.cert private.key,稍后我们将需要这些文件用于nextcloud服务。

配置Nextcloud

打开浏览器并转到https://nc.domain.com。根据{{​​1}}中的规定,用户名和密码为public.cert

您需要激活默认禁用的docker-compose.yml

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

点击右上角的齿轮符号,然后点击admin - 符号。在左侧,现在看到一个带有条目SSO & Saml Authenticate的菜单栏。点击它。您现在可以看到所有安全性的应用程序。点击+ Apps应用下方的Security按钮。

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

使用以下值:

  • 将UID映射到:用户名
  • 的属性
  • 启用"对Nextcloud桌面客户端使用SAML身份验证(需要用户重新身份验证)"
  • Admin的内容复制到' X.509证书' -field
  • SSO & SAML authentication的内容复制到服务提供商' -field的私钥中。
  • IdP的标识符: https://kc.domain.com/auth/realms/my-realm
  • URL将发送身份验证请求消息的IdP的目标: 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证书:从public.cert - private.key标签中复制来自Keycloak的证书。您需要添加“-----开始证书” - '在钥匙前面和-----结束证书-----'到最后。
  • 在服务提供商数据中:
    • 属性,显示名称:用户名
    • 属性,电子邮件地址:电子邮件 单击Keys并保存文件以进行下一步。
  • 安全设置,启用以下选项:
    • 指示此SP发送的邮件是否已签名。 [SP的元数据将提供此信息]
    • 指示此SP发送的邮件是否已签名。
    • 指示此SP发送的邮件是否已签名。
    • 表示要对此SP收到的元素和要素进行签名。
    • 表示要对此SP收到的元素进行签名。 [SP的元数据将提供此信息]
  • 检查my-realm - 按钮旁边是否有Download metadata XML This part of the configuration should look like this
  • 点击Metadata valid - 按钮。这将生成并发送XML文件。保存它。

配置Keycloak,客户端

再次访问Administror控制台。点击Download metadata XML,然后点击右上角的Download metadata XML - 按钮。

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

更改:

然后点击Create

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

在标签Save上:

  • 点击预先指定的Save
  • 上的Matters - 按钮
  • 点击Delete
    • 名称:用户名
    • 映射器类型:用户属性
    • 属性:用户名
    • SAML属性名称:用户名
    • SAML属性NameFormat:基本
    • 点击role list
  • 点击Create
    • 姓名:电子邮件
    • 映射器类型:用户属性
    • 财产:电子邮件
    • SAML属性名称:电子邮件
    • SAML属性NameFormat:基本
    • 点击Save

配置Keycloak,添加用户

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

试运行

以隐身/私密模式打开新的浏览器窗口。例如。对于google-chrome按Reset Password,在Firefox中按Change Password。使用nextcloud设置页打开 保持其他浏览器窗口。否则你可能会把自己锁在外面。

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

确认

答案 1 :(得分:0)

以下是nextcloud 15/16的稍微更新的版本:

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

您需要在页面的左上方创建一个新的Realm。单击添加。输入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身份验证。

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

单击右上角的齿轮符号,然后单击+ Apps-sign。现在在左侧看到带有条目安全性的菜单栏。点击它。现在,您将看到所有已实现安全性的应用程序。单击SSO和SAML身份验证应用程序下方的“激活”按钮。

再次单击右上角的齿轮符号,然后单击Admin。点击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

配置密钥斗篷,添加用户

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

答案 2 :(得分:-3)

不幸的是我无法评论@MadMike的回复(声望点不够),所以我只是给出一个答案。使用他的解决方案,您可以从keycloak中复制私人证书,这是您绝对不应该做的事情。最后你甚至不用证书签署任何东西...... 但您可能希望身份提供(keycloak)和服务提供商(Nextcloud)签署请求和响应。为了确保他们是他们声称的人,我对SAML不太了解,确实应该签署哪些内容,以及我们不关心的内容。所以我只是让它尽可能地签字;-)。 我描述了整个过程here。您应该可以轻松地将其调整到您的网址。