我正在尝试将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.key
和public.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证书:从
Keys
的my-realm
选项卡中的Keycloak复制证书。您将需要在密钥前面添加“ ----- BEGIN CERTIFICATE -----”,并在其末尾添加“ ----- END CERTIFICATE -----”。在服务提供商数据中:
属性,显示名称:用户名
属性,电子邮件地址:电子邮件
单击
Download metadata XML
并保存文件以进行下一步。在“安全设置”中,启用以下选项:
指示是否将对此SP发送的消息进行签名。 [SP的元数据将提供此信息]
指示是否将对此SP发送的消息进行签名。
指示是否将对此SP发送的消息进行签名。
指示对此SP接收到的和元素进行签名的要求。
指示对此SP接收的元素进行签名的要求。 [SP的元数据将提供此信息]
检查
Metadata valid
-按钮旁边是否有Download metadata XML
单击
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/