SSO与SAML,Keycloak和Nextcloud

Mad*_*ike 9 saml single-sign-on keycloak nextcloud

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

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

Mad*_*ike 27

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
Run Code Online (Sandbox Code Playgroud)

我将docker-files放在一个文件夹中,docker并在此文件夹中放置一个项目特定的文件夹.在这里keycloak.创建它们:

mkdir -p ~/docker/keycloak
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml使用此文件夹中的首选编辑器创建-File.启动服务:

cd ~/docker/keycloak
docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

等一下,让服务下载并启动.检查一切是否正在运行:

docker-compose ps
Run Code Online (Sandbox Code Playgroud)

如果服务未运行.发出一秒钟docker-compose up -d并再次检查.

配置Keycloak,添加一个新的Realm

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

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

单击Keys-tab.看看RSA-entry.我们需要复制该行的证书.单击Certificate并将内容复制粘贴到文本编辑器以供以后使用.

为Nextcloud准备私钥和证书

打开终端并发出:

openssl req  -nodes -new -x509  -keyout private.key -out public.cert
Run Code Online (Sandbox Code Playgroud)

这将创建两个文件:private.keypublic.cert我们将在以后需要为nextcloud服务.

配置Nextcloud

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

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

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

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

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

使用以下值:

  • 将UID映射到的用户名:username
  • 启用"为Nextcloud桌面客户端使用SAML身份验证(需要用户重新身份验证)"
  • 将内容复制public.cert到"X.509证书"字段中
  • 将内容复制private.key到"服务提供商的私钥"字段中.
  • IdP的标识符:https://cc.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证书:从Keycloak证书从复制Keys的-Tab my-realm.您需要在密钥前添加"----- BEGIN CERTIFICATE -----",并在其末尾添加"----- END CERTIFICATE -----".
  • 在服务提供商数据中:
    • 属性,displayname:用户名
    • 属性,电子邮件地址:电子邮件 单击Download metadata XML并保存文件以进行下一步.
  • 安全设置,启用以下选项:
    • 指示此SP发送的消息是否已签名.[SP的元数据将提供此信息]
    • 指示此SP发送的消息是否已签名.
    • 指示此SP发送的消息是否已签名.
    • 表示要对此SP收到的元素和要素进行签名的要求.
    • 表示要对此SP接收的元素进行签名的要求.[SP的元数据将提供此信息]
  • 检查-Button Metadata valid旁边是否有Download metadata XML这部分配置应如下所示
  • 单击Download metadata XML-Button.这将生成并发送XML文件.保存.

配置Keycloak,客户端

再次访问Administror控制台.单击Clients并右键单击Create-Button.

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

更改:

并单击Save.

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

在标签上Matters:

  • 单击Delete预分配上的-Buttonrole list
  • 点击 Create
    • 名称:用户名
    • 映射器类型:用户属性
    • 属性:用户名
    • SAML属性名称:用户名
    • SAML属性NameFormat:基本
    • 点击 Save
  • 点击 Create
    • 姓名:电子邮件
    • 映射器类型:用户属性
    • 财产:电子邮件
    • SAML属性名称:电子邮件
    • SAML属性NameFormat:基本
    • 点击 Save

配置Keycloak,添加用户

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

测试运行

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

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

承认