前言:
大家应该都没接触过authelia这个工具,也不了解SSO登录,其实就和我们在访问淘宝的时候,你在访问天猫会携带登录状态大致是一样的,我们家里的nas,会搭建很多服务,每个程序都会有一个前端页面,每个页面都会有一个账号和密码,或者是有的程序根本没有验证打开就是主界面,非常不安全,配置了authelia之后,大家都用一个账号密码,会记录登录状态,在打开其他程序时,不在需要输入密码,一段时间不操作,会自动退出,安全方面也是有很大的保证。
教程:
这里authelia要搭配Traefik,nginx,或者Apache来使用,并不能单独使用,因为我一直在用Traefik所以这里的教程也是针对Traefik来写的nginx和apache大家就不需要往下看了。
这里要注意一个问题就是,UNRAID因为HostName无法正常工作(本文章发布时尚未修复),所以配置方法和官方文档稍有区别,教程内我会演示unRAID和Linux(Ubuntu22.04.2)两个系统在docker下的配置方法。
Traefik的配置和部署这里我就不写了因为本站很早以前已经出过相关教程,大家可以自己去看一下
[ri-post id=”54748″ thumb=”right”]
UNRAID:
在安装之前,我们还需要部署数据库和Redis,数据库教程我已经出过,不需要写了,redis因为不需要数据持久化所以配置也不复杂。
Redis:
什么都不需要修改直接APPLY即可。
Mysql&Mariadb:
因为之前,做过教程就不在多余啰嗦,直接去看就可以了。
[ri-post id=”54553″ thumb=”right”]
数据库容器部署OK后,需要去手动创建一个数据库,这里大家可以用第三方工具或者命令,这里我演示一下用命令创建。
进入容器的ssh命令,un可以在docker界面快速进入,或者在SSH 界面输入docker exec -it Mariadb /bin/bash
。
输入命令: mysql -u root -p 登录数据库 输入密码,密码是隐匿的不可见,心中默念输入完成后Enter(回车) 创建数据库 create database authelia; 注意后面有;别丢了。 查看是否成功创建authelia。 show databases;
Authelia:
在UNRAID的APPS商店中搜索authelia。
直接APPLY就可以了,什么都不要改,但是因为配置文件并不会自动生成,所以容器是无法正常启动的,我们要去/mnt/user/appdata/autheila创建配置文件。
其他环境:docker-compose
............. ###Authelia Authelia: image: authelia/authelia container_name: "Authelia" restart: always volumes: - "/path/Authelia:/config" depends_on: - "redis" - "Mariadb" labels: - "traefik.http.routers.auth.rule=Host(`auth.example.com`)" - "traefik.enable=true" - "traefik.http.services.auth.loadbalancer.server.port=9091" ###Redis redis: image: redis container_name: "redis" restart: always network_mode: "host" volumes: - "/path/redis/databases:/data" ###Mariadb Mariadb: image: linuxserver/mariadb container_name: "Mariadb" restart: always network_mode: "host" environment: - "MYSQL_ROOT_PASSWORD=adminadmin123" - "PUID=1000" - "PGID=1000" - "TZ=Asia/Shanghai" volumes: - "/path/mysql:/config" ..........
注意,上面的配置中/path是需要求改为你的路径开头和结尾我这里都省略了,你们要把他填充才可以 ,上面的配置中并没有traefik的,我之前虽然写过traefik的教程,但是是针对unraid的,这里我在写一份docker-compose的。
###traefik traefik: image: traefik:latest container_name: "traefik" restart: always ports: - "80:80" - "443:443" volumes: - "/path/traefik/acme.json:/acme.json" - "/etc/localtime:/etc/localtime" - "/path/traefik/traefik.yml:/traefik.yml" - "/path/traefik//configurations:/configurations" - "/var/run/docker.sock:/var/run/docker.sock" environment: - "DNSPOD_API_KEY=241111,21bcb8e4f3aca123123125c4ccbaeacb59" labels: - "traefik.docker.network=bridge" - "traefik.http.routers.traefik-secure.rule=Host(`example.com`)" - "traefik.enable=true" - "traefik.http.routers.traefik-secure.entrypoints=websecure" - "traefik.http.routers.traefik-secure.middlewares=authelia@file" - "traefik.http.routers.traefik-secure.service=api@internal"
配套的配置文件下载路径https://file.lxg2016.com/assets/docker/traefik/traefik.zip 如果已经有traefik可以省略traefik的步骤。
配置Authelia:
经过上面的部署,大家都已经配置了基本的组件,但是authelia还不能启动,因为容器并没有自动填充默认配置文件,这里我们把配置文件写一下,然后启动。
配置文件有两个分别是configuration.yml和users_database.yml
configuration.yml是配置内容
users_database.yml是用户数据数据
在authelia的配置文件夹创建两个文件,这里我用的是命令。
进入authelia的配置路径。 cd /path/authelia 创建配置文件 touch ./configuration.yml 创建用户数据文件 touch ./users_database.yml
创建好后,我们先修改配置文件nano ./configuration.yml
---
###############################################################################
# Authelia Configuration #
###############################################################################
theme: dark
jwt_secret: "" ###Jwt密码,可以用密码生成器随便生成一个
server:
host: 0.0.0.0
port: 9091
path: ""
###4.37.0版本新参数
buffers:
read: 4096
write: 4096
###4.36.0后废弃
# read_buffer_size: 4096
# write_buffer_size: 4096
enable_pprof: false
enable_expvars: false
disable_healthcheck: false
tls:
key: ""
certificate: ""
log:
level: info
authentication_backend:
password_reset:
disable: false
refresh_interval: 5m
file:
path: /config/users_database.yml
password:
algorithm: argon2id
iterations: 1
key_length: 32
salt_length: 16
memory: 1024
parallelism: 8
access_control: ###策略规则
default_policy: one_factor
session:
name: RSG-人生观 ###验证时候页面显示的名字
domain: lxg2016.com ###主域名,这里要写根域名
same_site: lax
secret: "" ###与JWT密码相同即可
expiration: 1h
inactivity: 5m
remember_me_duration: 2M
redis:
host: 192.168.1.3 ###redis的ip
port: 6379 ###redis的端口
database_index: 0
maximum_active_connections: 10
minimum_idle_connections: 0
regulation:
max_retries: 3
find_time: 10m
ban_time: 12h
storage:
encryption_key: "" ###与JWT密码相同即可
mysql:
host: 192.168.1.3 ###数据库的IP
port: 3306 ###数据库端口
database: authelia ###数据库名字
username: root ###数据库账号
password: "rootpasswd" ###数据库密码
notifier:
disable_startup_check: false
smtp:
username: ###邮箱用户名
password: "" ###邮箱密码,注意QQ邮箱密码是独立的需要去设置内找SMTP密码
host: ###邮箱服务器的SMTP地址
port: ###邮箱服务器端口
sender: ###发件人
identifier: localhost
subject: "[Authelia] {title}"
startup_check_address: ###发件地址,与发件人同样即可
disable_require_tls: false
disable_html_emails: false
tls:
skip_verify: false
minimum_version: TLS1.2
...
根据注释写入内容并保存配置文件,nano的保存方法Ctrl+o 保存 Ctrl+X退出。
配置用户数据文件nano ./users_database.yml
users: rsg: ###用户名 displayname: "RSG-人生观" ###显示的名字 password: "123123123233333333333333333333333333333333333333333333333333322123" ####密码 email: email@lxg2016.com ###邮箱 groups: ###该用户所在的权限组 - admins - dev
看到这里有小伙伴可能不知道如何创建用户密码了,这里我教大家怎么生成。
打开SSH,输入命令docker run --rm authelia/authelia:latest authelia hash-password 'password'
复制命令,然后修改password的内容
复制返回的数据,粘贴到nano ./users_database.yml
文件中的对应用户名的passwod内即可生效,注意$之后的才是密码,包含$不要把digest:给复制了。
规则配置:
上面的配置文件我并没有写规则,因为我们不写的情况下,所有请求都会被转发到authelia进行验证,这里有一些具有API功能的程序就会出现通讯故障,所以我们要针对一些api程序写规则 比如sonarr radarr等工具进行处理。
access_control: default_policy: one_factor rules: - domain: - "auth.example.com" policy: bypass - domain: "*.example.com" resources: - "^/api([/?].*)?$" policy: bypass - domain: "*.example.com" networks: - "192.168.1.0/24" policy: bypass
我针对上面我写给规则进行一个简单的解释,方便大家理解。
- domain: - "auth.example.com" policy: bypass
这里是针对authelia的域名进行一个通过,不进行验证,如果验证就无线循环了,所以做了通过。
- domain: "*.example.com" resources: - "^/api([/?].*)?$" policy: bypass
这里是针对域名的路径中的API进行一个通过,路径中包含api的不进行验证。
- domain: "*.example.com" networks: - "192.168.1.0/24" policy: bypass
这个是针对内网整个ip段的一个通过,所有内网的机器在访问的时候不转发到authelia进行验证。
将自己的规则配置好以后,写入到configuration.yml
的配置文件内,配置完成后重启authelia。
配置traefik转发中间件:
在traefik的动态配置文件中末尾添加下面内容
authelia: forwardAuth: address: http://Authelia:9091/api/verify?rd=https://auth.example.com trustForwardHeader: true authResponseHeaders: - "Remote-User" - "Remote-Groups" - "Remote-Email" - "Remote-Name" authelia-basic: forwardAuth: address: http://Authelia:9091/api/verify?auth=basic trustForwardHeader: true authResponseHeaders: - "Remote-User" - "Remote-Groups" - "Remote-Email" - "Remote-Name"
对转发的地址我做一个简单的解释http://Authelia:9091/api/verify?rd=https://auth.example.com 这里红色的要写内部的通讯地址,比如docker的bridge的内部地址,或者容器网络切换到HOST,写宿主机的ip,绿色的要写公开能访问的地址,有端口号的需要携带端口号。
这里有个坑,如果是unraid的用户,请按照下面的配置进行部署。
authelia: forwardAuth: address: http://unip:9091/api/verify?rd=https://auth.example.com trustForwardHeader: true authResponseHeaders: - "Remote-User" - "Remote-Groups" - "Remote-Email" - "Remote-Name" authelia-basic: forwardAuth: address: http://unip:9091/api/verify?auth=basic trustForwardHeader: true authResponseHeaders: - "Remote-User" - "Remote-Groups" - "Remote-Email" - "Remote-Name"
把unip写为你unraid的宿主机ip,因为unraid的docker,hostname功能不正常,所以要适当调整,否者配置后所有程序全部404,authelia的容器最好也把网络切换到host。
在需要验证的后端服务的配置中增加authelia,这里分两种,一种是写traefik的动态配置,一种是在docker容器上写标签。
标签:
unraid:
docker-compose:
labels: - "traefik.http.routers.traefik-secure.middlewares=authelia@file"
动态文件:
xteve: service: xteve middlewares: - authelia rule: "Host(`auth.example.com`)"
红色区域就是动态新加入的内容。
测试访问:
访问地址,然后查看跳转url
这样就可以了。
结尾:
authelia是一个不错的工具部署之后,再也不用记忆那么多用户和密码了,妈妈再也不会因为密码忘记而担忧了,哈哈哈,不过这里要注意,authelia并不是取代了程序的验证方式,部署了authelia的程序要关闭本身的验证,否者你需要验证2次。
请登录后查看评论内容