部署 Seafile 并集成 Authentik 实现 SAML 单点登录(SSO)

  • ~6.36K 字
  • 次阅读
  • 条评论

Seafile 是一款开源的企业云盘,注重可靠性和性能,支持全平台客户端。Seafile 内置协同文档 SeaDoc ,让协作撰写、管理和发布文档更便捷。

Authentik 是一个开源的身份管理和访问管理(IAM)平台,旨在帮助企业和开发者简化和安全地管理用户身份和访问控制。

在本教程中,我将讲解如何搭建 Seafile 和 Authentik 服务端并配置单点登录(SSO)

1. 部署 Seafile

本文章使用以下约定:

/opt/seafile-data是 Seafile 的目录,如果您将 Seafile 放在不同的目录中,请相应地调整所有路径。

Seafile 使用两个 Docker 卷来保存其数据库和 Seafile Docker 容器中生成的数据。 卷的主机路径分别是/opt/seafile-mysql/opt/seafile-data。 不建议更改这些路径。 如果您这样做,请在按照这些说明进行操作时考虑到这一点。

Seafile 和 Nginx 的所有配置和日志文件都存储在 Seafile 容器的卷中。

配置文件

创建一个新目录,例如 seafile,复制以下内容,命名为 docker-compose.yml ,然后根据您的实际环境修改该文件。尤其是以下几项重要配置:

  • MySQL root 用户的密码:MYSQL_ROOT_PASSWORDDB_ROOT_PASSWD (默认为 db_dev)
  • 默认管理员账号:SEAFILE_ADMIN_EMAIL (默认为 me@example.com)
  • 默认管理员密码:SEAFILE_ADMIN_PASSWORD (默认为 asecret)
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
services:
db:
image: mariadb:10.11
container_name: seafile-mysql
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=db_dev # Requested, set the root's password of MySQL service.
- MYSQL_LOG_CONSOLE=true
- MARIADB_AUTO_UPGRADE=1
volumes:
- /opt/seafile-mysql/db:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store.
networks:
- seafile-net

memcached:
image: memcached:1.6.18
container_name: seafile-memcached
restart: unless-stopped
entrypoint: memcached -m 256
networks:
- seafile-net

seafile:
image: seafileltd/seafile-mc:11.0-latest
container_name: seafile
restart: unless-stopped
ports:
- "80:80" # Seafile Port
# - "443:443" # If https is enabled, cancel the comment.
volumes:
- /opt/seafile-data:/shared # Requested, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=db_dev # Requested, the value should be root's password of MySQL service.
- TIME_ZONE=Asia/Shanghai # Optional, default is UTC. Should be uncomment and set to your local time zone.
- SEAFILE_ADMIN_EMAIL=me@example.com # Specifies Seafile admin user, default is 'me@example.com'.
- SEAFILE_ADMIN_PASSWORD=asecret # Specifies Seafile admin password, default is 'asecret'.
depends_on:
- db
- memcached
networks:
- seafile-net

networks:
seafile-net:

启动 Seafile 服务

执行以下命令启动 Seafile 服务

1
docker compose up -d

需要等待几分钟,等容器首次启动时的初始化操作完成后,您就可以在浏览器上访问http://<your_server_ip> 来打开 Seafile 主页。

image-20240702103115167

注意

如果 Seafile 登录提示 CSRF verification failed. Request aborted.,则需要在配置文件中添加信任域名,操作方法如下:

首先运行 docker ps 找到 Seafile 服务端容器,通常为 seafileltd/seafile-mc:11.0-latest ,复制前面的 CONTAINER ID,例如:cf8fe5af1f32

image-20240702102408328

然后执行 docker exec -it <CONTAINER_ID> bash 进入容器内部

接着输入 vim /opt/seafile/conf/seahub_settings.py 编辑配置文件

在文件最末尾添加 CSRF_TRUSTED_ORIGINS = ["https://<DOMAIN>"],并将 SERVICE_URLFILE_SERVER_ROOT 修改为自己的域名,如下图

image-20240702102832957

然后保存退出,执行 docker compose restart 重启容器

2. 部署 Authentik

部署前准备

创建一个新目录,例如 authentik,运行以下命令下载配置文件:

1
wget https://goauthentik.io/docker-compose.yml

然后运行以下命令生成数据库密码和 Secret Key 并启用错误报告:

1
2
3
echo "PG_PASS=$(openssl rand 36 | base64 -w 0)" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand 60 | base64 -w 0)" >> .env
echo "AUTHENTIK_ERROR_REPORTING__ENABLED=true" >> .env

配置邮件服务 (可选但推荐配置)

Authentik 会使用它们来通知您有关警报和配置问题。用户也可使用它们发送验证/恢复邮件。

要配置邮件服务,请将以下配置添加到 .env 文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# SMTP 服务器配置
AUTHENTIK_EMAIL__HOST=localhost
AUTHENTIK_EMAIL__PORT=25

# 邮箱账号密码 (部分邮箱可能需要使用厂商提供的授权码,例如 QQ邮箱 / 网易邮箱,具体请参考自己提供商的文档 / 密码不要加双引号)
AUTHENTIK_EMAIL__USERNAME=no-reply@example.com
AUTHENTIK_EMAIL__PASSWORD=ExamPleP@ssw0rD

# 使用 StartTLS (例如 Microsoft 365 Outlook / Google Workspace)
AUTHENTIK_EMAIL__USE_TLS=true

# Use SSL (例如 QQ邮箱 / 网易邮箱)
AUTHENTIK_EMAIL__USE_SSL=true
AUTHENTIK_EMAIL__TIMEOUT=10

# 邮件来源邮箱,例如 no-reply@zyglq.cn
AUTHENTIK_EMAIL__FROM=authentik@localhost

修改默认端口 (可选)

Authentik 默认监听 9000 和 9443 端口,如需修改请在 .env 文件中添加如下配置:

1
2
COMPOSE_PORT_HTTP=80
COMPOSE_PORT_HTTPS=443

启动 Authentik

1
2
docker compose pull
docker compose up -d

启动完成后需要在浏览器打开 http://<your_server_ip>:9000/if/flow/initial-setup/ 进行初始化,默认用户名为 akadmin

注意

如果浏览器打开后提示 Not Found 或直接跳转到了登陆页面,则证明服务端没有初始化完成,请等待1-2分钟后再次尝试

image-20240701193230420

3. 配置 Authentik 和 Seafile

配置 Authentik

登录 Authentik,进入管理员后台,在左侧选择 Applications - Applications ,点击中间的 Create with Wizard

Name 填写 Seafile 的名称,Slug 可以随意写,会展现在认证过程中的 URL,然后点击下一步

image-20240702103823038

在 Provider Type 中 选择 SAML (Security Assertion Markup Language),然后下一步

在 New Application 中

  • Name:随便写 不影响
  • Authentication flow:选 default-authentication-flow 或不选
  • Authorization flow:默认有两个可选
    • default-provider-authorization-explict-consent:明确同意,要求用户手动点击确认登录
    • default-provider-authorization-implict-consent:默示同意,如果已登录则直接登录,无需手动确认
  • ACS URL:https://<DOMAIN>/saml2/acs/
  • Issuer: https://<DOMAIN>/saml2/metadata/
  • Service Provider Binding:Post
  • Signing Certificate:选择默认的 authentik Self-signed Certificate即可,也可以自己签一个传上来

image-20240702104620293

配置完成后点击 Submit,提示 Your application has been saved 即可

点击左侧 Applications - Providers,找到你刚刚添加的 Provider 点进去,在 Related objects - Metadata 点击 Copy Download URL

点击左侧 System - Certificates ,找到默认生成的证书点击下载证书,无需下载私钥

image-20240702110251227

配置 Seafile

运行 docker ps 找到 Seafile 服务端容器,通常为 seafileltd/seafile-mc:11.0-latest ,复制前面的 CONTAINER ID,例如:cf8fe5af1f32

执行 docker exec -it <CONTAINER_ID> bash 进入容器内部

1. 安装 xmlsec1

1
2
apt update
apt install xmlsec1

2. 准备证书文件

1
2
mkdir -p /opt/seafile/seahub-data/certs
cd /opt/seafile/seahub-data/certs
  • 如果没有自签CA:

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout sp.key -out sp.crt

  • 如果有内网自签CA/已有自签证书:

​ 将证书上传至 /opt/seafile/seahub-data/certs 并命名为 sp.keysp.crt

将上一步获取到的 Authentik 证书重命名为 idp.crt,上传至该目录

至此,该目录下应该有 sp.key sp.crt idp.crt 三个文件

3. 配置 Seafile

接着输入 vim /opt/seafile/conf/seahub_settings.py 编辑配置文件

如果 Authentik 访问使用的是自签证书还需要信任自签CA,这里不再赘述

添加以下配置,然后重启 Seafile:

1
2
3
4
5
6
7
8
ENABLE_ADFS_LOGIN = True
LOGIN_REDIRECT_URL = '/saml2/complete/'
SAML_REMOTE_METADATA_URL = '' # 上一步获取的 Metadata Download URL,例如 https://100.64.0.101/api/v3/providers/saml/2/metadata/?download
SAML_ATTRIBUTE_MAPPING = {
'name': ('ZYGLQ', ),
'mail': ('zyglqexplorer2333@gmail.com', ),
# 随便写 不影响
}

image-20240702111013991

4. 链接账户

用原账号密码登录 Seafile,点击右上角头像,进入 Settings, 在最下面找到 Social Login - SAML,选择 Connect 即可跳转到 Authentik 进行认证