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

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

前言#

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去跑

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

Terminal window
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

2025.10.10更新:现在已经迁移到K8s 后面教程应该是一样的 这里附上K8s的YAML

authentik:
secret_key: "填写Openssl生成的经过base64编码的60位密码"
# This sends anonymous usage-data, stack traces on errors and
# performance data to sentry.io, and is fully opt-in
error_reporting:
enabled: true
postgresql:
password: "填写Openssl生成的经过base64编码的36位密码"
server:
ingress:
# Specify kubernetes ingress controller class name
ingressClassName: nginx
enabled: true
hosts:
- authentik.k8s.lan
postgresql:
enabled: true
auth:
password: "填写Openssl生成的经过base64编码的36位密码"
redis:
enabled: true

然后在master节点上

Terminal window
helm repo add authentik https://charts.goauthentik.io
helm repo update
helm upgrade --install authentik authentik/authentik -f values.yaml

可以看到他会跑起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
0e177960-3ca6-4e98-829f-248dd4d6d555.png

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

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

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

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

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

QQ_1759617203484.png
QQ_1759617203484.png

QQ_1759617212724.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
86be608c-c677-4349-b548-4ff181fbe89b.png

折腾俩小时我的表情:

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

SSL证书自签#

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

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

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

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

这里都可以单独写一篇了 详细请看下一篇

有了HTTPS我们再试试

chrome_E09JKK5uME.jpg
chrome_E09JKK5uME.jpg

嗯~~舒服了

服务的挂载#

理论来说支持单点登陆的服务有很多 Gitlab vCenter Openlist

实际上的话只要支持OIDC或者SAML 都是很好配置的

OpenList#

我们先用Openlist做演示 因为他很简陋( 但又能用

主要还是参考他的官方文档 其实都有说

chrome_74XbvB3uJ8.png
chrome_74XbvB3uJ8.png

然后退出登录

这时候登陆界面多了一个单点登录的按钮

chrome_DZ6uKRVBqb.png
chrome_DZ6uKRVBqb.png

点一下就可以拉起Authentik 完美

vCenter#

我受不了vCenter每次登录都要输入administrator@后面一长串东西了 我还老是忘记

盘他

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

基于authentik的局域网单点登录与通行密钥的配置与部署
https://cainongw.github.io/posts/authentik-buildup/
作者
Cainong
发布于
2025-10-04
许可协议
CC BY-NC-SA 4.0
相关文章 智能推荐
1
Certd的搭建与证书自动部署与通知
Kubernetes 前言 前段时间去办了商宽,可算是有公网IP了 CloudFlare Tunnel实在太慢了 然后我白嫖了免费的pp.ua域名托管到了CF 现在只需要定期给域名申请证书就好了
2
记一次filebrowser的搭建
Kubernetes 起因 我以为这个就是写个Deployment然后挂载NFS就得了 本来都不打算写blog的 结果后面发现折腾了我几个小时才好 还是有一点坑的 所以就写一下
3
基于Gitlab Runner的CI/CD搭建
Kubernetes 前言 我已经搭建了很多七七八八的服务 应该是完全满足DevOps的需求了 但我还完全没有体验过整个流程呢 刚好我自己给Aqua的前端改了点代码 我决定搞一个自动部署
4
记一次基于small-step对局域网内证书的自签名
HomeLab 我们已经解决了K8s内集群的证书 现在需要解决我们直接跑在虚拟机上的一些服务的证书签名了 之前是自己签名 现在发现可以用根证书+ACME统一签名 因为是根证书 实际上可以在Ingress里设置任何一个域名(即使他已经存在) 甚至可以把baidu换成google(
5
记一次局域网内.lan域名的证书自签名并挂载到Ingress
HomeLab 前言 在Authentik的折腾中由于我们没有https导致passkey无法使用 并且想使用passkey必须要可用的证书 Chrome提示什么不安全的连接即使有https也是无法使用的 所以我们需要给.lan域名签一个证书并信任他
随机文章 随机推荐
Profile Image of the Author
Cainong
Caiw there 👋
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
站点统计
文章
38
分类
16
标签
48
总字数
57,650
运行时长
0
最后活动
0 天前

文章目录