跳至内容

authelia - nginx 鉴权的最佳搭档

2026-04-06 21:17:42

authelia 可用于 Nginx 等反代的鉴权,比如有个 hugo 的静态页面,它本身不具备鉴权的能力,可我们希望它具备,此时最简单的办法是 Nginx 的 basic auth,但存在一些缺陷,比如:没有持久化,浏览器重启,鉴权丢失;界面不美观;

authelia 可解决这类问题,且具备一个站点登录,所有子站点共享登录态的能力,下面是 authelia 的基本信息:

  1. 开源地址:https://github.com/authelia/authelia
  2. 官方文档:https://www.authelia.com

本文仅记录简单的安装以及与 Nginx 的集成。

安装 authelia

  1. 从 GitHub 下载对应的二进制包,解压后备用;
  2. 创建配置文件,内容大致如下:
conf.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
server:
  address: 'tcp://localhost:9091'

log:
  level: 'info'

identity_validation:
  reset_password:
    jwt_secret: '你的随机密码 1'

authentication_backend:
  file:
    path: '/xxx/users_database.yml'

access_control:
  default_policy: 'bypass'
  rules:
    - domain: "*.xxx.xxx"
      resources:
        - "^/manifest\\.json$"
        - "^/favicon\\.ico$"
        - "^/.*\\.(png|jpg|jpeg|gif|svg|webp)$"
      policy: bypass
    - domain: 'a.xxx.xxx'
      policy: 'one_factor'
    - domain: 'a2.xxx.xxx'
      resources:
        - "/search"
      policy: 'one_factor'

session:
  secret: '你的随机密码 2'

  cookies:
    - name: 'authelia_session'
      domain: 'xxx.xxx'  # Should match whatever your root protected domain is
      authelia_url: 'https://auth.xxx.xxx'
      expiration: '1 hour'  # 1 hour
      inactivity: '5 minutes'  # 5 minutes
      default_redirection_url: 'https://www.xxx.xxx'

  redis:
    host: '127.0.0.1'
    port: 6379
    timeout: '5 seconds'
    max_retries: 3
    database_index: 1
    maximum_active_connections: 8
    minimum_idle_connections: 5

regulation:
  max_retries: 3
  find_time: '2 minutes'
  ban_time: '5 minutes'

storage:
  encryption_key: '你的随机密码 3'
  local:
    path: '/xxx/db.sqlite3'

notifier:
  filesystem:
    filename: '/xxx/notification.txt'

该文件配置的鉴权规则有:

  1. 默认不需要鉴权;
  2. manifest.json、favicon.ico、png、jpg、jpeg、gif、svg、webp 不需要鉴权;
  3. a.xxx.xxx 全域需要鉴权,a2.xxx.xxx 仅 /search 开头的路由需要鉴权;

账号和密码是存到 users_database.yml 中,其中密码需要通过如下命令来生成:

./authelia crypto hash generate argon2 --password 你的密码

该文件示例如下:

users_database.yml
1
2
3
4
5
6
7
8
users:
  你的用户名:
    disabled: false
    displayname: '显示的名称'
    password: 'xxx'
    email: 'xxx@xxx.xxx'
    groups:
      - 'admins'

现在,就可以通过 ./authelia –config ./conf.yaml 来启动了,稍微调整下内置的 authelia.service 就可以正常使用 systemd 来启动了。

authelia 和 Nginx 集成

这一共需要 3 个文件:auth.conf、authelia-authrequest、authelia-location

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
server {
    listen 80;
    server_name auth.xxx.xxx;
    server_tokens off;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name auth.xxx.xxx;
    add_header Access-Control-Allow-Origin $http_origin;
    add_header Access-Control-Allow-Methods '*';
    add_header Access-Control-Allow-Credentials true;
    charset uft-8;
    location / {
        proxy_pass http://localhost:9091;
        proxy_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Host $http_host;
        #proxy_set_header Upgrade $http_upgrade;
        #proxy_set_header Connection "upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    ssl_certificate_key /xxx/xxx.xxx.key;
    ssl_certificate /xxx/xxx.cer;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
    ssl_prefer_server_ciphers on;
}

使用时,只需要 include 上面的配置即可,比如下面的第 5 和 第 8 行,如需鉴权,第 5 行就必须要有,第 8 行仅在需要鉴权的 location 下添加:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
    listen 443 ssl http2;
    server_name a2.xxx.xxx;
    charset UTF-8;
    include /xxx/authelia-location;

    location /search {
      include /xxx/authelia-authrequest;
      root /xxx/public;
      index index.html;
      error_page 404 /404.html;
    }
    
    location / {
      root /xxx/public;
      index index.html;
      error_page 404 /404.html;
    }
    
    ssl_certificate_key /xxx/xxx.xxx.key;
    ssl_certificate /xxx/xxx.cer;
    ssl_session_timeout 10m;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
}
最后更新于