LOADING

加载过慢请开启缓存 浏览器默认开启

基于authentik的局域网单点登录与通行密钥的配置与部署

2025/10/4

起因

Passkey(通行密钥)作为一种新的身份验证方式近几年开始慢慢流行起来了

该说不说 真的很好用

其安全且方便,理论来说Passkey的安全性是高于传统的2FA的(尤其是有生物认证的情况下)

但是目前只有一些大厂 比如Google Github 或者一些虚拟货币平台支持

国内几乎没有厂商支持 为数不多支持的微信还要求你用非+86的手机注册才可以用

我就在想,我局域网一些设备用的是弱密码 首先这不安全 其次这导致我需要记住几个不同的密码

有点麻烦 何况很多时候Chrome的密码补全是不工作的

有时候我root都输完了Chrome才提示让我填入密码 那我手都输完了

我就在想,可不可以将局域网里面的一些服务比如ESXi vCenter TrueNAS。甚至是Windows远程桌面 SSH

用反代 让他们强行支持Passkey

况且前段时间我暴露的RDP服务老是被爆破 即使不是3389端口 我用了几万后的端口也会被扫到

所以我需要一个局域网内的身份验证服务

而且我们可以通过身份验证服务去搭建防火墙 给局域网所有以后可能需要暴露在公网的管理后台(比如OpenWRT 1Panel 宝塔)进行第一步认证 从而大幅度提高安全性

开始折腾

其实同类的竞品有很多 比如Keycloak Duo Authelia

Keycloak对于LDAP支持不是很完善 后面两个太简陋了

找了一下发现一个名为Authentik的解决方案很好 UI也很好看

地址在这里https://goauthentik.io/

Authentik的搭建

他推荐是用docker compose去跑

k8s他也有相应的教程,我暂时还没有k8s的刚需,我们先用docker compose去跑

按照他的文档跑起来就好了

mkdir authentik
cd authentik/
wget https://docs.goauthentik.io/docker-compose.yml
echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env
docker compose pull
docker compose up -d

可以看到他会跑起worker server postgres redis四个容器,跑起来之后等待他显示服务为healthy就可以进入http://<服务器ip>:9000/if/flow/initial-setup/去进行初始化设置

这里的密码请设置复杂一点

跑起来之后我们就可以来研究Authentik了

我们不难看到Authentik为了高度自定义,他将管理界面分为应用 流程和阶段这几个板块

流程是Authentik比较特色的一个点

我的理解是将认证 授权拆分成了Stage 某个特定操作(比如授权给某个应用 登录 找回密码之类的)就可以是一个Flow

先设置Passkey

首先记得我一开始的目标 先设置个Passkey先

那么我们的Passkey在Authentik里叫Passwordless 无密码登录

文档是这个https://docs.goauthentik.io/add-secure-apps/flows-stages/stages/authenticator_validate/

如果要通行密钥的话我们主要是看WebAuthn这个

好长一串英语 说白了就是我们首先需要去创建一个Flows

我这里是这样写

0e177960-3ca6-4e98-829f-248dd4d6d555.png

大可不用按照我的来 主要是为了规范化

我们点进刚刚创建的Flows 然后点创建一个新的阶段

类型选择Authenticator Validation Stage 我这里是第一个

我这没有指定用什么设备限制 也没必要其实

d12af258-3e1f-45da-a725-d812c1eeb8c7.png

QQ_1759617203484.png

QQ_1759617212724.png

下一步顺序我们填写10

然后完成

它后面说可以添加别的验证阶段 比如验证码之类的

但是我个人觉得没必要了 Passkey已经很安全了

如果你用过一些虚拟货币平台你会发现提币的时候需要输入邮箱+动态验证码 如果你有Passkey只需要一个Passkey验证

这是题外话了

接下来我们给这个流程绑定一个已有阶段 我们选择default-authentication-login 顺序写20

也就是说顺序是先用无密码认证Stage 没问题了我们就认为用户处于登录Stage

下一步我们需要修改原有的登录流程

我们去Flows里搜索Slug default-authentication-flow

也就是正常的认证流程

点击阶段绑定 我们需要编辑default-authentication-identification这个阶段

流程设置下面有一个无密码流程 我们选择我们刚刚创建的passwordless-webauthn-flow

更新之后我们Passkey的设置就完成了

其实是有点麻烦的 但这一套给我的感觉就是给Authentik带来了超高自由性

然后当我想测试的时候

86be608c-c677-4349-b548-4ff181fbe89b.png

折腾俩小时我的表情:

ed3039d4-1bcd-4c6c-92f9-90505c9a7700.png

SSL证书自签

我立马想到,这可能是因为我们没有部署SSL证书 因为Passkey对安全的高标准要求 没有https加密大概是不给用的

我们需要一个自签证书的服务器,因为显然.lan域名我们不可能去找根证书服务商申请 我们只能自己给证书签名

啪的一下很快找到了名为Traefik的项目,它可以自动识别Docker 自动加域名自动给域名上https

虽然它不能给.lan域名申请证书,但我们自己创一份证书 信任一下就好了

这里都可以单独写一篇了