May 13, 2025

[Home-K8S] #3 Authelia 구성

[Home-K8S] #3  Authelia 구성
Authelia serve login service

Authelia? Keycloak?

Authelia 는 웹 포털을 통해 애플리케이션에 이중 인증 및 싱글 사인온(SSO)을 제공하는 오픈 소스 인증 및 권한 부여 서버입니다. 저는 nginx를 통해 프록시를 할 때, authelia를 통해서 인증을 하고 사이트에 접속하게 하려고 사용합니다.
code-server나 n8n은 아무나 접속하면 안되잖아요? 그런데 왜 Authelia를 사용했냐

Authelia보다 KeyCloak이 훨씬 더 많은 기능을 제공합니다. 특히 Google이나 twitter 같은 소셜 로그인을 제공하는 게 가장 큰 장점이지요. 그 외에도 콘솔을 통한 관리, 커스터마이징 같은 기능들을 제공하지만, 저에게 필요한 기능은 아니였어요.
가볍고 빠른게 최고지요.

Authelia 구축

Authelia Docker Image: https://hub.docker.com/r/authelia/authelia

Authelia는 yaml 파일로 설정하고 user를 관리합니다.

Secret 생성

JWT_SECRET, SESSION_SECRET, STORAGE_ENCRYPTION_KEY 를 생성해야 합니다. 직접 생성하셔서 사용하셔도 되고, 권장하는 방법대로 authelia를 하나 띄우고 생성하셔도 됩니다.
하지만 나중에 user password를 생성할 때에도 사용할 수 있어 생성하시는 걸 추천드립니다.

JWT_SECRET:
openssl rand -base64 32       # 직접 생성
kubectl exec -it -n authelia authelia-pod -- authelia crypto rand --length 72 --charset rfc3986               # 권장 생성

SESSION_SECRET:
openssl rand -base64 32       # 직접 생성
kubectl exec -it -n authelia authelia-pod -- authelia crypto rand --length 64 --charset alphanumeric          # 권장 생성

STORAGE_ENCRYPTION_KEY:
openssl rand -base64 32       # 직접 생성
kubectl exec -it -n authelia authelia-pod -- authelia crypto rand --length 128 --charset ascii                 # 권장 생성

Create Secret for Authelia


configuration.yaml 파일 생성

이제 Authelia의 configuration.yaml 파일을 설정할 차례입니다. configuration.yaml 파일에는 서비스의 중요한 설정들이 포함됩니다. 여기서는 기본적인 설정을 설명합니다.

server:                         # Authelia 서버 설정
  host: 0.0.0.0
  port: 9091

log:                            # Authelia 로그 레벨
  level: info
  format: text

totp:                           # T-OTP 2단계 인증
  issuer: dogring.kr
  period: 30
  skew: 1

authentication_backend:          # user 정보 파일
  file:
    path: /config/users_database.yml
    watch: true
    password:                    # 패스워드 조건
      algorithm: argon2id
      iterations: 1
      key_length: 32
      salt_length: 16
      memory: 128
      parallelism: 8

access_control:                   # 서비스 접근 관리
  default_policy: deny
  rules:
    - domain: "app1.dogring.kr"   # app1에 대해 /webhook/ 경로는 bypass
      resources:
        - "^/webhook/.*$"
      policy: bypass
    - domain: "app1.dogring.kr"    # app1에 대해 Authelia 로그인 시 접속
      policy: one_factor
    - domain: "app2.dogring.kr"    # app2에 대해 user1 만 로그인 가능
      policy: one_factor
      subject: "user:user1"
    - domain: "app3.dogring.kr"    # app3에 대해 user2 만 로그인 가능
      policy: one_factor
      subject: "user:user2"

session:
  name: authelia_session           # 브라우저에 저장될 쿠키의 이름
  expiration: 24h
  inactivity: 1h
  remember_me: 48h
  same_site: lax
  cookies:
    - domain: dogring.kr
      authelia_url: https://auth.dogring.kr      # Authelia의 URL
      default_redirection_url: https://app1.dogring.kr   # 인증 후 Default리디렉션

regulation:                         # 로그인 120s 내에 3번 실패 시 300s 차단
  max_retries: 3
  find_time: 120s
  ban_time: 300s

storage:
  local:
    path: /config/db.sqlite3

identity_validation:
  reset_password:
    jwt_secret: /secrets/JWT_SECRET
    jwt_lifespan: 5m
    jwt_algorithm: HS256

notifier:
  filesystem:
    filename: /config/notification.txt

users_database.yaml 파일 설정

users_database.yml 파일은 인증할 사용자 정보를 포함하는 파일입니다.
user의 password는 authelia 내부에서 생성합니다.

온라인에 argon2 생성기가 있긴 하지만, authelia를 사용하는게 건강에 좋습니다.

kubectl exec -n authelia authelia-pod -- authelia hash-password
>> $argon2id$v=19$m=65536,t=3,p=4$zZIimRG4kQ$OZp+7dKx1cuG8u3F4m7kZbgRjZ/NNKzRLyYpOp+4Z9s

Authelia generate uesr password

위의 결괏값으로 users_database.yaml을 작성합니다.
userid1, userid2 가 id가 되고 password 생성 시 사용한 값이 password가 됩니다.

users:
  userid1:
    displayname: "User1"
    password: $argon2id$v=19$m=65536,t=3,p=4$zZIimRG4...
    email: [email protected]
    groups:
      - admins                         # 그룹으로 접근 관리 가능
  userid2:
    displayname: "User2"
    ...

Authelia users_database.yaml


Authelia 서비스 사용 (nginx-ingress)

Authelia를 배포하고 접속할 수 있으면 준비가 완료되었습니다.
Authelia를 사용할 서비스의 ingress.annotations를 수정하면 됩니다.

metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-url: "http://authelia.authelia.svc.cluster.local:9091/api/verify"
    nginx.ingress.kubernetes.io/auth-signin: "https://authelia.dogring.kr/"
    nginx.ingress.kubernetes.io/auth-response-headers: "Remote-User, Remote-Name, Remote-Email, Remote-Groups"

auth-url: authelia에서 로그인 정보를 확인할 url
auth-signin: authelia의 로그인 페이지
auth-response-headers (옵션): 헤더에 추가해서 넘길 값 - 로그인 정보 확인

Authelia login page

접근제어

access_control: # 서비스 접근 관리
  default_policy: deny
    rules:

rules에 domain과 policy를 입력해줘야 접근이 가능합니다.
현재 default_policy: deny 이기에 무조건 접근이 불가능 하고,
policy에 맞게 one_factor를 하면 rules 없이 로그인 할 수 있습니다.

또한 user가 아니라 group으로 접근 권한을 줄 수도 있고,
IP에 따라 policy를 다르게 할 수 있습니다.

주의할 점은 Authelia는 위에서부터 match를 하기 때문에 rules에는 경로가 작은 것부터 적어야 합니다.


마무리

이제 Authelia를 연동하여, 서비스의 관리 페이지에 대한 인증을 Authelia를 통해 처리할 수 있습니다. 기본적으로 서비스로의 접근을 관리할 수도 있고, cookie 에 user 정보를 넘겨서 자동 로그인으로 사용할 수도 있습니다.

다음에는 Authelia를 이용해서 n8n의 자동로그인 구현 방법을 작성하겠습니다.

Comments