Contents

Authelia 設定和 實作 2FA 登入驗證

我家本身有用 Traefik,想讓 traefik 可以做 SSO 控制。

官方簡單實作

需使用root帳號,參考Deployment - Lite - Authelia

1
2
3
4
git clone https://github.com/authelia/authelia.git
cd authelia/examples/compose/local #  這邊我是使用local
git checkout $(git describe --tags `git rev-list --tags --max-count=1`)# 或者用master也可以
sudo ./setup.sh # 他會加 hostname  特定網域如: *.example.com

記得改 configuration.yml 裡面 encryption_key,參考:SQLite - Authelia

啟動可以會遇到全權限問題,可以參考: docker 設定 user 文章

我的設定

設定 2FA

設定上非常簡單,這邊小記重點,下面有範例看。

測試用 mail

1
2
3
4
notifier:
  disable_startup_check: false
  filesystem:
    filename: /config/notification.txt

可以 less 查看 mail 內容。

Notifier - Authelia

產生 users_database.yml 的 hash密碼值

1
$(sudo docker run authelia/authelia authelia hash-password __你要加密的密碼__ | sed 's/Password hash: //g')

設定網路區域

1
2
3
4
5
6
7
access_control:
  networks:
  - name: internal # 設定區域網路 Range
    networks:
    - 10.0.0.0/8
    - 172.16.0.0/12
    - 192.168.0.0/18

運用在SERVER

樹莓派安裝

官方有做 arm 版本。所以直接docker run 可以正常運行。我使用local版本,因為是在樹莓派關係,人數也沒有很多人在用,所以使用local版本。官方有lite,kubernetes 版本可以看。

程式參考設定

authelia/configuration.yml 設定

簡單記錄重點

  1. 改多欄位key
  2. 可針對區域網路做設定
  3. rule 可設定多網域登入
 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
64
65
66
67
68
69

---
jwt_secret: must_change_secret_key # 改變
default_redirection_url: https://public.xxxx.com.tw

server:
  host: 0.0.0.0
  port: 9091

log:
  level: debug

totp:
  issuer: xxxx.org.tw # authentication 登入名稱

authentication_backend:
  file:
    path: /config/users_database.yml

access_control:
  networks:
  - name: internal # 設定區域網路 Range
    networks:
    - 10.0.0.0/8
    - 172.16.0.0/12
    - 192.168.0.0/18

  default_policy: deny
  rules:
    - domain: xxxxxx.com.tw  # 設定網站規則
      policy: bypass
      networks:
      - internal  # 區域網路不做驗證
    - domain: xxxxxx.com.tw  # 設定網站規則
      policy: two_factor   # 雙重驗證
    - domain: secure.xxxx.com.tw
      policy: one_factor   # 密碼驗證

session:
  name: authelia_session
  secret: must_change_secret_key
  domain: xxxx.com.tw  # Should match whatever your root protected domain is

regulation: # 失敗次數會做 動作
  max_retries: 3
  # find_time: 120
  # ban_time: 300

storage:
  encryption_key: must_change_secret_key# 須設定key
  local:
    path: /config/db.sqlite3

notifier:
  filesystem:
    filename: /config/notification.txt # 沒有SMTP,可以到這邊看
...


authelia/users_database.yml
```yaml
users:
  user:
    displayname: "user"
    password: "取代 hash值"
    email: user@example.com
    groups:
      - admins
      - dev

docker 設定

authelia

 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
version: '3.3'

networks:
  traefik_network:
    external: true

services:
  authelia:
    image: authelia/authelia
    container_name: authelia
    volumes:
      - ./authelia:/config
    networks:
      - traefik_network
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.authelia.rule=Host(`authelia.xxxxx.xxxxx.org`)'
      - 'traefik.http.routers.authelia.tls=true'
      - 'traefik.http.routers.authelia.tls.options=default'
      - 'traefik.http.middlewares.authelia.forwardauth.address=http://authelia:9091/api/verify?rd=https://authelia.xxxxx.xxxxx.org'  
      - 'traefik.http.middlewares.authelia.forwardauth.trustForwardHeader=true'
      - 'traefik.http.middlewares.authelia.forwardauth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email' 
    expose:
      - 9091
    restart: unless-stopped
    healthcheck:
      disable: true
    environment:
      - TZ=Asia/Taipei

服務設定label

主要重點只有一個traefik.http.routers.ncp.middlewares=authelia@docker,請參考下面設定。

 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
version: "3"

services:
  nextcloudpi:
#    image:  ownyourbits/nextcloudpi
#    後來發現 nextcloudpi 有 nextcloudpi-armhf image
    image: ownyourbits/nextcloudpi-armhf
    command: "192.168.1.202"
    networks:
        - traefik_network
    labels:
      - "traefik.backend=ncp"
      - "traefik.http.routers.ncp.rule=Host(`xxx.xxx.xxx.org`)"
      - "traefik.http.routers.ncp.tls=true"
      - "traefik.http.services.ncp.loadbalancer.server.port=80"
      - 'traefik.http.routers.ncp.middlewares=authelia@docker'
    restart: always
    ports:
      #- "1180:80" # 暫時使用
      #- "11443:443" # 暫時使用
      - "4443:4443"
    volumes:
      - /media/USBdrive/ncp2:/data
      - /etc/localtime:/etc/localtime:ro
    environment:
      - "UMASK=002"

networks:
  traefik_network:
    external: true