개요
Authentik의 Provider를 이용해 많은 서비스를 연동하는 것까진 완료했지만, 아직 회원을 받는 기능은 없습니다.
주변 지인들에게 계정을 발급할 때, 하나하나 생성해 주어야 하는 귀찮은 점은 아직 변하지 않은 것이죠.
이번 글에서는 방문객이 알아서 계정을 만들 수 있도록 하는 방법을 알아보겠습니다.
기본 환경 구성
기본 그룹 생성
사용자용 기본 그룹을 정하고, 새로 추가된 사용자들이 해당 그룹에 속하게 되면 관리가 쉬워집니다.
가입하자마자 연결된 서비스에 접근 가능하도록 하거나, 극소수의 서비스만 접근 가능한 그룹에 속하도록 하거나 여러가지로 사용할 수 있겠죠.
이 글에선 Basic Users로 그룹을 하나 생성했습니다.
비밀번호 규칙 생성
Customization – 정책 – 생성 – Password Policy를 클릭합니다.
정책 이름을 설정하고 최소 조건을 설정하면 됩니다.
비밀번호 정책은 소셜 로그인에선 사용되지 않고, 그 외의 가입 루트에서 사용됩니다.
연합 및 소셜 로그인
Authentik은 상당히 다양한 OAuth 프로필을 보유하고 있고(심지어 Plex도 있음), 별도로 LDAP나 Custom OAuth/OpenID Source도 구성할 수 있습니다.
또한, 계정을 직접 생성하는 것과 비교할 때, 가입자가 자신의 정보를 하나하나 채워넣을 필요가 없고, 구글 등 다른 계정에서 정보를 바로 가져올 수 있으므로, 클릭 몇 번으로 깔끔하게 절차가 완료된다는 장점도 있습니다.
Google 클라이언트 ID / 비밀 생성
예시로 구글의 OAuth를 이용해 Authentik에 로그인하도록 구성해 보겠습니다. 사용자에게 요구할 정보가 많지 않아 간편하고 편리합니다.발급받는 나만 귀찮
아래 글을 참고해 Google OAuth를 구성합니다. OAuth 동의 화면에서 도메인 주소만 Authentik의 주소로 변경하여 발급하시면 됩니다.
웹 만화책 뷰어 Komga 소셜로그인 구성해서 사용하기
개요홈서버를 구성하다보면, 남는 가용자원을 보며 이것저것 좀 더 구성할 것을 찾아보기 마련입니다(제가 그랬음).Komga는 간단하게 설치하고 편리하게 사용할 수 있는 만화책 전용 웹뷰어입니
worklazy.net
사용자 인증 정보에서 승인된 리디렉션 URI는 아래 주소를 기입하시면 됩니다.
https://{Authentik 주소}/source/oauth/callback/{slug}/
작성이 다 되었다면, 클라이언트 ID와 클라이언트 비밀을 받을 수 있습니다. 복사해 두면 됩니다.
기존 글에서 OAuth/OpenID로 서비스 연동할 때 했던 과정을 다시 반복하고 있는 겁니다.
Username 매핑 정책 작성
Google은 별도의 username을 가지고 있지 않아, Authentik에 로그인하면 username이 비어있게 됩니다. 때문에, 별도의 정책을 작성해서 플로우에 적용해야 합니다.
Customization – 정책 – Expression Policy에서 아래와 같은 표현식을 붙여넣어 완성합니다.
email = request.context["prompt_data"]["email"]
request.context["prompt_data"]["username"] = email.split("@")[0]
return False
플로우 및 스테이지 – 플로우 – default-source-enrollment를 순차적으로 클릭합니다.
스테이지 바인딩 – defualt-source-enrollment-promtpt를 클릭하여 유효성 검사 정책에 방금 생성한 정책을 할당합니다.
이후 정책/그룹/사용자 바인딩으로 이동하여 같은 정책을 순서 0으로 지정하고 생성버튼을 클릭합니다.
기본 그룹 지정
스테이지 바인딩 – default-source-enrollment-write의 스테이지 편집을 클릭해서, 하단의 그룹을 지정합니다.
Authentik에서 Google OAuth 연동하기
디렉토리 – 연합 및 소셜 로그인 – 생성 – Google OAuth Source를 클릭합니다.
- 이름 : 식별 가능한 선에서 자유롭게
- 슬러그 : Google OAuth 발급 시 {slug}자리에 입력한 문자열 그대로
- 고객 키 : 클라이언트 ID
- 고객 비밀 : 클라이언트 비밀
- 인증 플로우 : default-source-authentication
- 등록 플로우 : default-source-enrollment
생성된 OAuth Source를 클릭하여 콜백 URL과 구글에 등록한 승인된 리디렉션 URI와 일치하는지 확인하고, 불일치 할 경우 한 쪽을 수정하여 일치시켜 줍니다.
Google로그인 버튼 구현하기
플로우 및 스테이지 – 플로우 – default-authentication-flow를 클릭합니다.
스테이지 바인딩 – default-authentication-identification의 스테이지 편집을 클릭하여, 소스 설정에 구글을 추가합니다.
이제 Authentik 로그인 페이지로 이동해보면 스크린샷처럼 Google 로그인 버튼을 확인할 수 있고, 문제없이 로그인이 되는 것을 확인하실 수 있습니다.
이와 더불어, 사전에 설정한 그룹에 잘 할당된 것까지 확인가능합니다.
username정책은 다른 외부 로그인 소스와 차별되어 있으므로 플로우 이름을 변경하여 다른 소셜 로그인과 구별해 줍니다.
초대 코드 발급 절차 구성하기
우선, 하단 링크의 공식 홈페이지에서 미리 예제로 만들어져 있는 플로우를 다운받습니다.
다운받은 플로우는 플로우 및 스테이지 – 플로우 – 가져오기를 통해 가져올 수 있습니다.
이후 가져온 자원을 조금씩 수정해서 사용하겠습니다.
스테이지 구성
enrollment-invitaion 생성
플로우 및 스테이지 – 스테이지 – 생성 – Invitaion Stage 순차적으로 클릭하여 초대 없이 플로우 계속 항목을 비활성화 하고 생성해 줍니다.
default-enrollment-user-write 수정
플로우 및 스테이지 – 스테이지에서 write로 검색하면 아래처럼 default-enrollment-user-write 스테이지를 찾을 수 있습니다. 해당 스테이지의 수정 버튼을 클릭해 줍니다.
default-source-enrollment-write와 혼동하시면 안됩니다. ‘source’가 들어간 것은 대체로 외부 로그인 수단과 연동하기 위한 용도입니다.
- 필요할 때 사용자 생성 (선택)
- 사용자를 비활성 상태로 생성 (체크) – 이메일 인증 과정을 거쳐 활성화 상태로 전환되도록 할 예정
- 선택사항 : 기본 가입 그룹 지정
default-enrollment-prompt-first 수정
prompt로 검색하면 default-enrollment-prompt-first와 second 스테이지를 확인할 수 있습니다.
first는 ID와 PW를 입력받는 스테이지이고, second는 E-mail과 이름을 입력받는 스테이지입니다.
이 중 first의 수정 버튼을 클릭하여, 위에서 생성한 비밀번호 정책을 적용해 줍니다.
플로우 구성
플로우 및 스테이지 – 플로우 – 생성을 클릭하여 초대 코드를 통한 회원 가입 절차(플로우)를 생성해 보겠습니다.
저는 하단처럼 enrollment-invitaion이라고 이름 붙였습니다.
이름 제외하고 아래처럼 생성해 주시면 됩니다.
생성된 플로우를 선택해 줍니다.
스테이지 바인딩 – 기존 스테이지 바인드 버튼을 클릭해 조금 전까지 생성 및 수정했던 스테이지들을 불러옵니다.
‘순서’값은 낮을수록 먼저 실행되는 값입니다. 제일 먼저 초대 여부를 판별하기 위해 enrollment-invitaion 스테이지를 추가해 줍니다.
그 다음 defualt-enrollment-prompt-first 스테이지를 추가해 줍니다. 이 스테이지에서 ID와 비밀번호를 입력하고, 설정한 정책에 의해 대소문자, 숫자, 특수문자가 각각 한 개 이상 들어간 10자리의 비밀번호를 생성하게 됩니다.
이어서 second 스테이지를 추가해 줍니다.
ID, PW, E-mail, name을 입력받는데 성공했다면 해당 유저를 생성(write)해야 합니다. default-enrollment-user-write 스테이지를 추가해 줍니다.
유저가 생성되었지만, 비활성 상태입니다. 이메일 인증 과정을 거쳐 활성 상태로 변경해주기 위해 default-enrollment-email-verification 스테이지를 추가합니다.
맨 처음 Authentik을 설치할 때 docker-compose에 기입된 SMTP정보를 활용하여 메일을 발송하게 되는데, 별개의 메일을 사용하고 싶다면 스테이지 편집에서 전역 설정 사용을 체크해제하면 별도의 SMTP호스트를 설정할 수 있습니다.
그 외 Subject 항목값을 수정하여 발송 메일에 표시될 제목을 수정할 수 있습니다.
마지막으로 default-enrollment-user-login 스테이지를 추가해 줍니다.
완료되면 아래와 같이 6개의 스테이지를 갖게 됩니다.
이용자 초대하기
초대 코드 발급
디렉토리 – 초대 – 생성을 순차적으로 클릭해 초대 코드를 생성합니다.
생성된 링크를 전달해 가입 절차를 진행할 수 있습니다.
플로우 테스트
제공된 링크로 접근 시 default-enrollment-prompt-first로 이동하여 ID/PW를 입력하게 됩니다.
사전에 정한 패스워드 정책 때문에, 형편없는 패스워드를 입력하면 오류와 함께 입구컷을 당하게 됩니다.
invitaion은 오타입니다..
패스워드 정책을 통과하면 default-enrollment-prompt-second 스테이지로 이동해 Name과 E-mail을 입력하고 이메일 인증 대기 상태가 됩니다.
이메일을 통해 계정 인증을 완료하면 성공적으로 로그인할 수 있게 됩니다.
gravatar에 연동된 아이콘도 바로 가져오네요.
회원 가입 절차 구성하기
스테이지 구성
위의 초대 코드 발급 절차를 완료했다면, 가입 절차와 관련된 스테이지는 아무것도 수정할 필요가 없습니다.
플로우 구성
공식 홈페이지의 예제 플로우를 모두 다운로드 및 가져오기 했다면, 아래와 같은 플로우(default-enrollment-flow)가 이미 생성되어 있습니다.
바인딩 되어 있는 스테이지는 위에서 이미 모두 수정했으므로, 이대로 사용하겠습니다.
회원가입 링크 구현하기
플로우 및 스테이지 – 스테이지 – default-authentication-identification 스테이지의 수정 버튼을 클릭합니다.
등록 플로우로 default-enrollment-flow로 선택해 줍니다.
로그인 페이지로 이동해보면, 가입 절차로 넘어갈 수 있는 링크가 생성되어 있음을 확인할 수 있습니다.
동일한 스테이지를 사용했기 때문에, 따로 테스트는 진행하지 않겠습니다.
비밀번호 복구 절차 구성하기
예제 플로우 활용
공식 홈페이지에서 다운받은 예제 플로우에 이미 포함이 되어 있으므로 이용하기만 하면 됩니다.
로그인 화면에 비밀번호 복구 링크 생성하기
플로우 및 스테이지 – 스테이지 – default-authentication-identification 하단의 복구 플로우를 default-recovery-flow로 지정합니다.
로그인 화면에서 해당 링크를 확인할 수 있고, 이메일 인증을 통해 비밀번호를 재설정할 수 있습니다.
회원 가입 막아두기
공식적으로 서비스를 배포하는 것이 아닌 이상, 항상 열려 있는 회원 가입은 불필요합니다. 이상한 시도도 많이 들어올 거구요.
Deny 스테이지 생성
플로우 및 스테이지 – 스테이지 – 생성 – Deny Stage를 클릭합니다. 거부 메시지는 원하는대로 적어주세요.
소셜 로그인을 통한 계정 생성 막기
구글 등을 통한 소셜 로그인 플로우는 default-source-enrollment(이 글 예시에서는 default-source-enrollment-google)였습니다.
해당 플로우에 0순위로 deny스테이지를 바인딩 하면 됩니다.
이 경우, 이미 가입이 되어 있는 구글 계정은 성공적으로 로그인 되지만, 가입한 적이 없는 구글 계정은 deny스테이지에서 더 진행하지 못합니다.
메인 페이지 회원 가입 막기
같은 원리로, default-enrollment-flow에 해당 스테이지를 순서 0으로 바인딩 합니다.
가입을 시도하면 아래처럼 설정한 거부 메시지가 출력되는 것을 확인할 수 있습니다.
단순히 로그인 화면에서 ‘가입’ 링크를 없애는 방법도 생각할 수 있지만, 이용자가 슬러그를 때려맞추면 접근할 수 있다는 점에서 비추천합니다.
마무리
Authentik을 구성하며 글을 작성해야겠다고 생각은 했었는데, 처음 예상했던 포스팅 수보다 글이 더 늘어났습니다.
한 번 구성해두면, 누구에게 배포하지 않더라도 유용하게 사용할 수 있으니, 구성해보시는 것을 추천드립니다.
홈서버를 처음 운영하는 분들이 Heimdall, Homepage 등의 대시보드에 관심을 많이 갖고 있는 걸로 알고 있는데,
Authentik으로 구성하면 단순히 앱을 연결해주는 대시보드의 기능을 넘어 외부 연동을 통한 확장성까지 갖출 수 있다는 점에서 굉장히 좋은 것 같습니다.
관련 글
2025.01.23 - [Apps] - Authentik으로 홈서버 SSO 구현하기 (1) – 설치
Authentik으로 홈서버 SSO 구현하기 (1) – 설치
개요여러가지 도커 이미지를 이용해 셀프 호스팅으로 서비스를 올려보고 사용해보는 재미에 빠지다 보면 만나는 문제가 한 가지 있습니다. 바로 서비스에 접속할 때마다 일일히 로그인을 해야
worklazy.net
2025.01.23 - [Apps] - Authentik으로 홈서버 SSO 구현하기 (2) – LDAP
Authentik으로 홈서버 SSO 구현하기 (2) – LDAP
2025년 1월 6일 변경사항 : LDAP Provider 변경된 버전에 맞춰 내용 수정 LDAP 구성하기실생활에서 LDAP를 제일 쉽게 접할 수 있는 곳은 회사입니다. 로그인, 네트워크 장치 정보 등을 중앙에 모아놓고
worklazy.net
2025.01.23 - [Apps] - Authentik으로 홈서버 SSO 구현하기 (3) – OAuth/OpenID
Authentik으로 홈서버 SSO 구현하기 (3) – OAuth/OpenID
개요LDAP는 있으면 좋지만, 이것만으로는 번거로운 로그인 과정을 전부 해결할 수는 없습니다.이번 글에서는 OAuth / OpenID Provider를 설정하는 방법을 적어 보겠습니다.LDAP가 조직 내부 네트워크 인
worklazy.net
2025.01.23 - [Apps] - Authentik으로 홈서버 SSO 구현하기 (4) – SAML
Authentik으로 홈서버 SSO 구현하기 (4) – SAML
개요SAML은 JWT기반이었던 OAuth/OpenID와 달리 XML을 기반으로 하며 각각 장단점이 있습니다. OAuth/OpenID와 비교할 때 모바일 지원이 부족하고, JWT보다 덩치가 큰 XML을 이용함에서 오는 네트워크 대역
worklazy.net
2025.01.23 - [Apps] - Authentik으로 홈서버 SSO 구현하기 (5) - Proxy
Authentik으로 홈서버 SSO 구현하기 (5) - Proxy
개요홈서버에서 사용하는 대부분의 애플리케이션들은 앞선 글에서 소개했던 OAuth/OpenID, SAML로 모두 해결할 수 있습니다.그러나, 이런 류의 인증방식을 지원하지 않는 것들도 굉장히 많죠. 예를
worklazy.net
2025.01.23 - [Apps] - Authentik으로 홈서버 SSO 구현하기 (7) – 시놀로지 회원 가입(계정 자동 생성) 구현하기
Authentik으로 홈서버 SSO 구현하기 (7) – 시놀로지 회원 가입(계정 자동 생성) 구현하기
개요시놀로지는 다 좋고 편한데 회원 가입을 능동적으로 처리하는 기능이 없습니다. 기본 기능만을 사용할 경우, 관리자가 계정을 생성하고 사용자가 최초 로그인 시 무조건 비밀번호를 변경하
worklazy.net
출처
1. https://docs.goauthentik.io/docs/add-secure-apps/flows-stages/flow/examples/flows
Example flows | authentik
You can apply these flows multiple times to stay updated, however this will discard all changes you've made.
docs.goauthentik.io