起因
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也很好看
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
我这里是这样写
大可不用按照我的来 主要是为了规范化
我们点进刚刚创建的Flows 然后点创建一个新的阶段
类型选择Authenticator Validation Stage 我这里是第一个
我这没有指定用什么设备限制 也没必要其实
下一步顺序我们填写10
然后完成
它后面说可以添加别的验证阶段 比如验证码之类的
但是我个人觉得没必要了 Passkey已经很安全了
如果你用过一些虚拟货币平台你会发现提币的时候需要输入邮箱+动态验证码 如果你有Passkey只需要一个Passkey验证
这是题外话了
接下来我们给这个流程绑定一个已有阶段 我们选择default-authentication-login 顺序写20
也就是说顺序是先用无密码认证Stage 没问题了我们就认为用户处于登录Stage
下一步我们需要修改原有的登录流程
我们去Flows里搜索Slug default-authentication-flow
也就是正常的认证流程
点击阶段绑定 我们需要编辑default-authentication-identification这个阶段
流程设置下面有一个无密码流程 我们选择我们刚刚创建的passwordless-webauthn-flow
更新之后我们Passkey的设置就完成了
其实是有点麻烦的 但这一套给我的感觉就是给Authentik带来了超高自由性
然后当我想测试的时候
折腾俩小时我的表情:
SSL证书自签
我立马想到,这可能是因为我们没有部署SSL证书 因为Passkey对安全的高标准要求 没有https加密大概是不给用的
我们需要一个自签证书的服务器,因为显然.lan域名我们不可能去找根证书服务商申请 我们只能自己给证书签名
啪的一下很快找到了名为Traefik的项目,它可以自动识别Docker 自动加域名自动给域名上https
虽然它不能给.lan域名申请证书,但我们自己创一份证书 信任一下就好了
这里都可以单独写一篇了