[Home-K8S] #22 FluxCD 계층과 분리 / 다중 클러스터 리소스 공유와 설정 분리
FluxCD - yaml 앞서 fluxcd 를 이용해서 helm chart 를 구성했습니다. 그 외에 일반적인 yaml
Authelia 는 웹 포털을 통해 애플리케이션에 이중 인증 및 싱글 사인온(SSO)을 제공하는 오픈 소스 인증 및 권한 부여 서버입니다. 저는 nginx를 통해 프록시를 할 때, authelia를 통해서 인증을 하고 사이트에 접속하게 하려고 사용합니다.
code-server나 n8n은 아무나 접속하면 안되잖아요? 그런데 왜 Authelia를 사용했냐
Authelia보다 KeyCloak이 훨씬 더 많은 기능을 제공합니다. 특히 Google이나 twitter 같은 소셜 로그인을 제공하는 게 가장 큰 장점이지요. 그 외에도 콘솔을 통한 관리, 커스터마이징 같은 기능들을 제공하지만, 저에게 필요한 기능은 아니였어요.
가볍고 빠른게 최고지요.
Authelia Docker Image: https://hub.docker.com/r/authelia/authelia
Authelia는 yaml 파일로 설정하고 user를 관리합니다.
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
이제 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.txtusers_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+4Z9sAuthelia 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를 배포하고 접속할 수 있으면 준비가 완료되었습니다.
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 (옵션): 헤더에 추가해서 넘길 값 - 로그인 정보 확인

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