To Dark Mode
Featured Images
Photo by charlesdeluvio on Unsplash

Authentik 教程系列:将应用通过 OIDC,SAML,LDAP 协议接入

Zhenghao Wu

Status: In Progress Confidence: highly likely

Post Details

This post is part 3 of 6 in the Authentik series.

Goto: First Post | Prev: Authentik 教程系列:反向代理的配置 | Next:Authentik 教程系列:通过反向代理和 ForwardAuth 接入任何应用

Table of Contents

搭建了统一登录平台之后,最重要的事情就是将应用接入。Authentik 支持五种协议接入,分别是 SAML 2.0OAuth 2.0/OpenID Connect (OIDC)LDAPSCIM,和 RADIUS,其中 OIDC,SAML,和 LDAP 能覆盖我们大多数的接入需求。在这篇文章我将用具体应用示例的方式演示如何将应用接入 Authentik。

Authentik 设计的架构(简化版)

我们先用一个很简化的模型来介绍我们会涉及到的几个概念。Authentik 内部维护有一个用户数据库。这之外还创建有应用程序(application)和提供程序(provider)。应用程序是程序的入口,记录了应用的名称、图标的信息;方便隔离各应用并设置其独立的权限。

大多数应用程序与提供程序一对一绑定,提供程序基于用户数据库与设定的规则(policy)一起提供登录鉴别和鉴权能力。

那么一个要接入的软件,我们会为他创建一个新的应用,根据软件支持的统一登录协议创建对应的提供程序。

下面配置的细节,基于 Authentik 2024.2.2,在内网的环境中进行的配置,按英文界面按钮文字进行说明。

应用程序创建

使用管理员账号登录,进入后台 Applications > Applications,点击 Create 会弹出一个填写新应用参数的窗口。

Authentik Application Creation Window

常用功能填写的参数包括:

用户界面设置中:

在应用创建的页面,官方也提供了一个创建向导,可以快速地同时创建应用和我们后面要提到的提供程序。创建好时,应用程序跟提供程序就已经被自动绑定了。

提供程序

提供程序的创建在后台 Applications > Provider 中。点击 Create 会弹出一个创建提供程序的向导。其中首先要选择的是提供程序的类型。

Authentik Provider select

OpenID Connect (OIDC) / OAuth 2.0

如果你要创建的是 OIDC 提供程序。选择类型之后,你能填入以下字段:

接下来的协议设置是 OIDC 协议专用的字段:

在 Authentik 里面都创建好之后,就可以在应用中做配置来进行接入了。一般接入的方式有两种,应用内创建认证源和启动时的配置。以下举 Gitea(创建认证源) 和 Grafana(启动时配置) 的例子来说明如何配置。

Gitea

Gitea OIDC Settings

Gitea 是一个轻量的版本控制平台。通过在启动的应用内创建认证源进行 OAuth2 的配置。入口是管理后台 > 身份及认证 > 认证源

用户首先需要创建一个新的用户源类型选择 OAuth2,提供程序选择 OpenID Connect认证名称图标 URL 是可以自定的,会显示在登录页的登录按钮上。

和 Authentik 对应提供程序相关的字段有客户端 ID客户端密钥,这个是签名创建提供程序时,Authentik 已经自动生成了的,只需要对应复制到 Gitea 中。

OpenID 配置一般还需要填写授权URL,令牌URL等信息告知应用程序,让授权时进行正确的跳转。Gitea 直接支持通过配置 URL 直接自动获取并解析。只需要进到 Authentik 的对应提供程序详情,就可以复制到 OpenID 配置 URL(格式是:https://<AUTHENTIK URL>/application/o/<APPLICATION SLUG>/.well-known/openid-configuration)。

最后还需要填写附加授权范围(Scopes)为:email profile。保存并启用这个认证源,那么配置就完成了。

Grafana

Grafana OIDC Settings

Grafana 是一个数据可视化的平台。它的 OAuth2 接入是通过启动时的环境变量进行配置。一下是启动的 docker-compose.yaml

services:
  grafana:
    image: grafana/grafana-oss
    container_name: grafana
    restart: unless-stopped
    ports:
      - '3000:3000'
    extra_hosts:
      - "auth.demo.ecwu.xyz:192.168.31.6"
    environment:
      GF_SERVER_ROOT_URL: "http://192.168.31.6:3000"
      GF_AUTH_GENERIC_OAUTH_ENABLED: "true"
      GF_AUTH_GENERIC_OAUTH_NAME: "authentik"
      GF_AUTH_GENERIC_OAUTH_CLIENT_ID: "x4el5XrUcfTZbm1hEmBHRx8KlvsoWV2MDLvKEEyG"
      GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET: "rXBIJdaCJXYX9D1DaCvw1oIFxhef22rv3CEgUHXohDafk3mX1aoZFzUfRBTZ4DtsJQ9BuTHlNy0Of15FiEg1oRlrFHls9lP2hKask6lLvdGJYSS6bPnrL1hFUFRxti2b"
      GF_AUTH_GENERIC_OAUTH_SCOPES: "openid profile email"
      GF_AUTH_GENERIC_OAUTH_AUTH_URL: "https://auth.demo.ecwu.xyz/application/o/authorize/"
      GF_AUTH_GENERIC_OAUTH_TOKEN_URL: "https://auth.demo.ecwu.xyz/application/o/token/"
      GF_AUTH_GENERIC_OAUTH_API_URL: "https://auth.demo.ecwu.xyz/application/o/userinfo/"
      GF_AUTH_SIGNOUT_REDIRECT_URL: "https://auth.demo.ecwu.xyz/application/o/grafana/end-session/"
      # Optionally enable auto-login (bypasses Grafana login screen)
      GF_AUTH_OAUTH_AUTO_LOGIN: "false"
      # Optionally map user groups to Grafana roles
      GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_PATH: "contains(groups, 'authentik Admins') && 'Admin' || 'Viewer'"

所有跟 OAuth 相关的配置都是以 GF_AUTH_GENERIC_OAUTH 开头的,可以看到和 Gitea 最大的区别就是,Grafana 并不支持 OpenID 配置 URL 自动获取配置。而是需要单独指定“授权”、“令牌”、“用户信息”和“登出” URL。

配置的时候有三个小细节需要注意:

  1. 需要写 GF_SERVER_ROOT_URL 环境变量来指示 Grafana 的 URL ,因为 Grafana 在处理 OAuth 请求写入重定向端点时是通过 ROOT_URL 确定的,如果写不对则无法正常跳转完成鉴权。
  2. 附加授权范围(Scopes)为:openid profile email
  3. GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_PATH 是根据用户的组信息来动态的绑定新登录用户的权限,yaml的例子是,如果用户存在组 authentik Admins 内(Authentik 默认管理员组的名字),就会授予 Grafana 管理员权限,否则只是普通的浏览者(Viewer)的权限。

创建新证书

有些应用要求 idP 对传输的信息进行签名,像一会要提到的 Cloudflare Zero Trust。Authentik 本身会默认创建有一张证书,你也可以直接选择来进行使用。但是我们这边介绍一下如何创建一张新的证书用于应用的签名。

首先进入证书创建的入口,System > Certificates 按钮有 CreateGenerate,第一个是你已经在其他地方生成了需要导入到 Authentik。Generate 则是直接在线生成一张新的证书。一般点 Generate 即可。创建时可以选择有效时间,默认为 365 天。但如果过期了则需要进行更换,可以偷懒创建个 3650 天(10年)的 :P。

SAML

如果在创建页选择了 SAML,你能看到以下字段:名称 Name,身份验证流程 Authentication flow,授权流程 Authorization flow 与 OIDC 是差不多的,根据需求设置即可。也有 SAML 特有的设置:

SAML 一般要求对请求进行签名,你需要展开 Advanced protocol settings 进行更多设置:

其他设置可以保持不变。

Cloudflare Zero Trust

TBA

Outposts

LDAP 配置

Article Card

For "Authentik 教程系列:将应用通过 OIDC,SAML,LDAP 协议接入"

Author Zhenghao Wu
Publish & Update Date 2024-04-21
Tags Homelab Docker Container Images Service Self-host Authentication SAML OIDC OpenID Connect
Extra Materials
  • Bilibili:Authentik 教程系列 3 - 将应用接入统一登陆 - OAuth 协议篇 - 以 Gitea 和 Grafana 为例
  • Bilibili:Authentik 教程系列 4 - 将应用接入统一登陆 - SAML 协议篇 - 以 Cloudflare Zero Trust 和 GitLab 为例
  • Bilibili:Authentik 教程系列 5 - 将应用接入统一登陆 - LDAP 协议篇 - 以 EMBY 为例
Comment Section disabled in draft mode

Related Posts