翻车的home server经验分享-sso+mfa[authelia
创作立场声明:仅个人折腾
这次又是翻的人仰马翻,原因和dns一样,那群
程序员又不把话说全。
介绍
SSO
先介绍下什么是sso(SingleSignOn)。就是你有很多服务,然后访问服务需要登陆对不,但是每更换一个服务就要重新输入账号密码登陆是不是很繁琐,那干脆把所有服务的登陆集中到同一个授权界面,那岂不是登陆一次就能访问全部服务了,单点登陆(sso)就是这样。举个不恰当的例子:租了一层楼当办公室,这层楼有一个大门,用传统钥匙锁,开起来要用钥匙,所以要给开门的人配钥匙。现在把传统钥匙锁换成电子锁,支持指纹解锁,已授权人员用指纹就能开锁了,是不是方便很多。虽然这例子的确不恰当,又不是所有员工都有大门钥匙。因为只有一种验证方式,那被突破了岂不是全完了,所以才出现了下面的mfa。嘛,我这只从井底爬上来跳进大海的青蛙实在是知识库欠乏,想不到更合适的了,还是画图来解释更清楚。
SSO听起来是不是很美好,那为什么翻车了,因为那群
程序员没说要服务支持了才能sso,他们把没有自带登陆界面的几个服务拿出来做演示,当然可以sso啦。
换jellyfin、qinglong、pihole这些不支持的试试,只是从一个登陆界面换到另一个登陆界面而已,虽然sso登陆过后就不用再验证了,我访问一个服务要登陆大于一次那还能叫sso吗。
MFA
再介绍下什么是mfa(Multi-Factor Authentication)。密码就是一层验证,所以算是1fa,那再加一层验证就成了2fa,再加一层验证就成了3fa,以此类推。验证不局限于密码,还有ldap、saml、one time password、hardware authentication,等等。这些验证和密码验证不在同个地方(网页),所以99.9%情况下,第三方不知道下一步在哪进行,就算知道了还要继续攻击下一个验证的地方。要把所有验证都通过才算是一次成功登陆,所以被爆破风险就减小了很多。其实各位都用过mfa的,登陆微信要短信验证码,登陆支付宝要短信验证码,登陆京东要短信验证码,没错,短信验证码就是一层验证。所以我是怎么翻车的。这就要从头说起了。
authelia
我不是在docker搭了web服务吗,虽然那些服务自带登陆界面,但是我怕被暴力破解,然后又碰巧在油管看到关于authelia的介绍,知道可以自建授权服务,用多重验证保护服务。
对了traefik还可以自己给没登陆界面的服务添加BasicAuth,这在traefik官网有介绍,我很懒所以没写。
我看完介绍就去搭了,也不是很难,看看authelia官网就能明白了。
安装和使用
首先要users_database.yml用来储存用户名和密码,然后准备configuration.yml用来配置authelia。
先来users_database.yml,要用这个命令创建密码:
docker run --rm authelia/authelia:latest authelia hash-password '新密码'
然后把hash后面的东西都复制下来。我写了几个当示范,写的email也是假的:
users:
!!userone:
!!!!displayname: "one"
!!!!password: "$argon2id$v=19$m=65536,t=3,p=4$b2FJYktMSSs3RVdha3dOUg$EzLWvm3CuOkLG5rnjdH0ZKwXOcWJ6AMNYSAsw1sG7Yk"
!!!!email: one@authelia.home
!!!!groups:
!!!!!!- admins
!!usertwo:
!!!!displayname: "two"
!!!!password: "$argon2id$v=19$m=65536,t=3,p=4$bGw5bXZRbzFJbDVPbE9vLw$0p61fv9XtRoH3RfNCICQZ0gwSYGBcFdGoQAGQzund2w"
!!!!email: two@authelia.home
!!!!groups:
!!!!!!- family
!!userthree:
!!!!displayname: "three"
!!!!password: "懒得搞新的了,假装这是密码"
!!!!email: three@authelia.home
用记事本把!全部替换成空格,下同。
然后就是configuration.yml,这文件是要重启才生效,初次启动authelia时会自己生成,所以只要改改就能用了,改完重启容器就好。不要被这么长的东西吓到,只需要改一部分的就行了,唯一需要自己会写的只有Access control,这官网写的很详细。我写了几个当示范了,参照官网看一下就能懂。因为authelia目前只支持单个域名,所以authelia和所有服务都需要在那个域名中,例如authelia在auth.lastview.duckdns.org,jellyfin在jellyfin.lastview.duckdns.org,同理在session的cookie域名就是lastview.duckdns.org了,看一看,了解一下就好:
## Access Control Configuration
default_policy: deny
networks:
- name: internal
networks:
- 192.168.0.0/24 #注意自己的网段
- name: test #这只是个示范,yaml的写法有很多种
networks: 10.0.0.0/16
rules:
#authelia
- domain:
- '子域名.duckdns.org'
policy: bypass
# jellyfin
- domain:
- 'jellyfin.子域名.duckdns.org'
policy: two_factor
subject:
- 'group:family'
# qinglong
- domain:
- 'qinglong.子域名.duckdns.org'
policy: two_factor
subject:
- 'group: admins'
# friend
- domain:
- 'friend.子域名.duckdns.org'
policy: one_factor
# something need authentication but also need api passthrough
- domain:
- 'something.子域名.duckdns.org'
policy: one_factor
subject:
- 'group: family'
- domain:
- 'something.子域名.duckdns.org'
policy: bypass
resources:
- '^/api'
# hide can only be visited in local network
- domain:
- 'hide.子域名.duckdns.org'
policy: two_factor
subject:
- 'group: admins'
networks:
- 'internal'
剩下的就jwt_secret填下,default_redirection_url填下,default_2fa_method改成totp,session domain填:子域名.duckdns.org,secret填下,encryption_key填下,Storage Provider选择local。就这么多需要改的,如果你们真的要用,记得先去官网看完configuration再弄。
然后就是docker-compose了:
version: '3'
services:
!!authelia:
!!!!image: authelia/authelia
!!!!container_name: authelia
!!!!volumes:
!!!!!!- /home/用户名/docker/authelia/config:/config
!!!!networks:
!!!!!!- traefik_proxy
!!!!ports:
!!!!!!- 9091:9091
!!!!restart: unless-stopped
!!!!environment:
!!!!!!- TZ=Asia/Shanghai
!!!!healthcheck:
!!!!!!disable: true #默认是false,想了解,自己看官网去
networks:
!!traefik_proxy:
!!!!external: true
然后是rp- authelia.yml:
http:
!!routers:
!!!!authelia-http:
!!!!!!entryPoints:
!!!!!!!!- web
!!!!!!rule: "Host(`auth.子域名.duckdns.org`)"
!!!!!!middlewares:
!!!!!!!!- https-redirectscheme
!!!!!!service: authelia authelia-https:
!!!!!!entryPoints:
!!!!!!!!- websecure
!!!!!!!!- public
!!!!!!rule: "Host(`auth.子域名.duckdns.org`)"
!!!!!!middlewares:
!!!!!!!!- default-headers
!!!!!!!!- auth
!!!!!!tls: {}
!!!!!!service: authelia
!!services:
!!!!authelia:
!!!!!!loadBalancer:
!!!!!!!!servers:
!!!!!!!!!!- url: "http://authelia:9091"
!!middlewares:
!!!!auth:
!!!!!!forwardAuth:
!!!!!!!!address: http://authelia:9091/api/verify?rd=https%3A%2F%2F子域名.duckdns.org:666%2F
!!!!!!!!trustForwardHeader: true
!!!!!!!!authResponseHeaders:
!!!!!!!!!!- "Remote-User"
!!!!!!!!!!- "Remote-Groups"
!!!!!!!!!!- "Remote-Email"
!!!!!!!!!!- "Remote-Name"
没错,为了在外网也能用,我搞了个新entryPoint,然后authelia就能从https://auth.lastview.duckdns.org:666访问了,同时其它服务在进行mfa验证时也会跳转到666端口,例如https://nginx.lastview.duckdns.org:666跳转到https://auth.lastview.duckdns.org:666/api/verify?rd=https%3A%2F%2Fnginx.lastview.duckdns.org:666%2F。要让服务mfa就要在Access Control写好,然后在各服务的middlewares加- auth。像上面那样。
吐槽
我成功的在内网给nginx测试了mfa,然后又在外网成功测试了。前面用的notifier是file,然后就应该正式换成SMTP了,但是啊,我搞不定SMTP,完全没学过,又不知道去哪找相关教程。
然后换qinglong,正如开头所说,没办法sso。然后jellyfin之类的不是有app支持吗,这类服务除非支持,要不然不能给它们多一层验证,要不然在app端会无法登陆。然后更坑爹的是2fa,authelia提供了3给方案,但是完全依靠第三方服务。我可是花大量时间去测试的。
所以这自建授权服务完全就是脱裤子放屁,sso没法应用于全部服务,2fa依赖第三方服务,要第三方服务我直接找google不就行了吗。
总结:authelia is useless to me.
下一篇,翻车的fail2ban。
附件
docker-compose.yml for traefik-https














ferrets
校验提示文案
xdos
校验提示文案
某月的路人庚
校验提示文案
Interestingcn
校验提示文案
值友7736933919
校验提示文案
值友7736933919
校验提示文案
Interestingcn
校验提示文案
xdos
校验提示文案
某月的路人庚
校验提示文案
ferrets
校验提示文案