Programming-[Backend]/Keycloak

Keycloak - 10. 사용자 인증: OTP, WebAuthn, passkey

컴퓨터 탐험가 찰리 2024. 8. 9. 16:27
728x90
반응형

KeyCIoak - 모던 애플리케이션을 위한 ID 및 접근관리 | 에이콘출판(주) | 스티안 토르거센, 페드로 이고르 실바 지음, 최만균 옮김

서적을 참고하여 요약한 시리즈 글이다.

 


 

1. 인증 흐름 이해

 

1.1 인증 흐름 목록

Keycloak은 다양한 인증 흐름을 제공한다. 일반적인 경우에는 브라우저를 중개자로 사용한다. 좌측 사이드 메뉴에서 Authentication 항목에 들어가보면 다양한 인증 흐름 목록을 볼 수 있다.

 

 

브라우저 플로우 외에 clients나 direct grant 등은 realm에 인증하거나, 클라이언트가 토큰 엔드포인트를 통해서 토큰을 획득하기 위해 백채널 요청을 통해 사용자를 인증하는 것과 관련이 있다.

 

 

1.2 인증 흐름 설정

 

1.2.1 인증 흐름 만들어보기

새로운 인증 흐름을 만들 수 있다. Create flow를 선택하고 Save를 하면 아래와 같은 화면을 볼 수 있다.

 

Execution은 사용자를 인증할 때 몇 가지 작업을 수행하는 실제 단계다. Step이라고도 표현된다.

 

 

Execution을 하나 추가하면 Requirement 항목을 선택하게 되어있다. 순차적으로 수행되는 Execution 중 앞 단계의 Required용 Execution이 성공적으로 수행되어야만 뒤의 단계를 수행한다. Alternative는 단계가 정상적으로 수행되지 않더라도 일단 흐름은 진행되어 다른 단계들을 정상적으로 수행할 수 있게 하는 옵션이다. 

 

 

1.2.2 flow는 복사하기

browser flow에 들어가서 Action 항목을 보면 Duplicate가 가능하다. 보통 인증 플로우를 만들 때는 이렇게 기존에 있는 flow를 duplicate하는 것을 권장한다. 기존 템플릿을 사용하는 것이 변경사항을 쉽게 롤백할 수 있고 변경 사항으로 인해서 흐름에 장애가 발생하더라도 기존 템플릿으로 돌아갈 수 있기 때문이다.

 

 

1.2.3 browser flow 파악해보기

기본적인 flow인 browser flow에 대해서 파악해본다. 대략 어떻게 흘러가는지를 알고자함이다.

 

 

 

1. Cookie 실행은 사용자 세션에 매핑되는 요청에 쿠키가 있는 경우 인증을 수행하지 않고 원활하게 재인증하는 단계이다. ALTERNATIVE이기 때문에 사용자를 인증할 수 없는 경우 다음 execution들을 계속해서 진행한다.

 

2. Kerberos 실행은 비활성화 되어있다. 만약 활성화하면 Kerberos 자격증명을 통해서 사용자를 인증한다.

 

3. Identity Provider Redirector는 사용자가 사전에 정의한 ID 제공자로 리다이렉트하는 설정이 있는지 확인한다.

 

4. Browser - Conditional OTP는 패스워드 및 OTP 같은 2FA를 통해 사용자를 인증한다.

 

 

1.2.4 플로우 변경해보기

 

browser 플로우를 복사하여 my browser flow를 만든다. Username Password Form 단계를 삭제하고, Username Form, Password Form을 My Browser Forms의 1, 2 단계에 Required로 추가한다. My Browser forms의 하위 흐름을 바꿔보는 것이다.

 

 

그리고 action -> Bind Flow에 들어가서 Browser flow를 선택한다. 기본 browser flow를 My Browser flow로 변경하는 것이 된다.

 

 

이후 myrealm의 로그인 페이지에 접속하면 처음부터 username, password를 둘 다 묻는 것이 아니라 username 입력 후 다음으로 넘어가야 password를 묻는 아래와 같은 화면이 나온다.

 

 

2. 다양한 인증 방법: 패스워드 사용

 

2.1 Keycloak이 패스워드 인증을 다루는 방식

패스워드 인증 방식은 가장 단순하고 많이 사용하는 방식이다. 그러나 몇 가지의 단점들도 있다. 실습을 통해 알아본다.

 

앞선 글들에서 다룬 것처럼 password는 Users -> Credentials에서 사용자별로 관리된다. Keycloak에서 사용하는 패스워드용 기본 알고리즘은 PBKDF2 이다. 그리고 salt 값을 결합시킨 뒤 여러 번의 알고리즘 적용(해싱)을 하여 해킹하기 어렵게 만든다. HMAX-SHA-256을 사용해 기본 27,500번의 반복 횟수가 설정되어있다. 이런 반복 횟수는 CPU 자원을 많이 소모하기 때문에, 필요하다면 사용자가 이 횟수를 조정할 수도 있다.

 

패스워드는 도난을 당하거나 유출되기 쉽다. 그리고 피싱 공격 등에 취약하다. 일부 사용자는 강력한 패스워드를 사용하지도 않으며 여러 시스템에서 동일한 패스워드를 사용하기도 하기 때문에 보안 수준이 취약한 편이라고 할 수 있다. 따라서 패스워드 정책을 잘 설정해주는 것도 중요하다.

 

2.2 패스워드 정책 변경

 

Authentication -> Policies -> Password Policy에서 정책을 만들 수 있다.

 

Add Policy 드롭다운 메뉴를 눌러보면 다양한 policy 옵션들을 제공한다. 최소 길이, 만료 시간, 쓰면 안되는 문자(블랙리스트) 정의 등이 제공된다.


2.3 패스워드 리셋 및 비밀번호 찾기

2.3.1 패스워드 리셋

처음 사용자 생성 시에는 Credentials에서 Temporary 토글을 On 하면 된다.

 

관리자 입장에서는,

User 상세 페이지 -> Required user actions에 들어가서 Update Password 항목을 선택 후 save를 해주면 된다.

 

사용자 입장에서는,

Account Security -> Signing in -> Update 버튼을 통해 할 수 있다.

 

2.3.2 비밀번호 찾기

비밀번호 찾기는 Forget Password 항목의 토글을 ON 해야 화면에 표시된다. Realm Settings -> Login -> Forgot password 토글을 ON 하면 로그인 페이지에 링크가 표시된다.

 

 

다만 이를 위해서는 기본적으로 Verified 처리된 Email이 있어야만 하고, realm에 설정된 SMTP 서버 설정이 되어있어야한다.

 

찾아보니 SMTP 서버 자체를 따로 운영하는 것을 권장한다. Keycloak 자체에서 SMTP 서버를 제공하면 제공자의 IP가 공개되어버릴 수 있기 때문이라고 하는 것 같다.

https://documentation.cloud-iam.com/how-to-guides/smtp.html

 

mailhog라는 라이브러리를 이용해서 SMTP 서버를 띄우는 방법도 있는 것 같다.

https://medium.com/@ramanamuttana/keycloak-email-configuration-3342143797a1

 

비밀번호를 잊었을 때 뿐만 아니라 사용자에게 메일로 정보를 전송하거나 안내를 해야하는 경우는 반드시 있을 것 같다. 실제 업무에서 SMTP 서버를 세팅하는 방법을 알고, 준비를 하는 것이 꼭 필요할 것 같다.

 

 

 

 

3. 다양한 인증 방법: OTPs 사용

 

 

OTP는 2FA에서 사용하는 가장 일반적인 방법 중 하나다. 다만 사용자가 다소 불편해질 수 있고 피싱 또는 스캠과 같은 공격에는 취약하다.

 

3.1 OTP 정책 변경

 

Authentication 메뉴 - Policies - OTP Policy에서 관리할 수 있다.

 

 

Keycloak의 OTP는 두 가지 주요 알고리즘을 이용해 사용자가 코드를 생성할 수 있도록하여 인증할 수 있다.

  • Time-Based One-Time Password(TOTP)
  • HMAC-Based One-Time Password(HOTP)

Keycloak에서 기본적으로 사용하는 방식은 TOTP 이다. 또한 6자리 숫자로만 구성되며 30초의 유효시간을 갖는다.

 

 TOTP는 유효시간을 갖는 방식이며, HOTP는 카운터를 기반으로 동작한다. 코드의 유효성은 코드가 검증되고 카운터가 증가하기 까지는 무한히 유효하다. TOTP가 유효 기간이 줄어드는 형태이기 때문에 보안성이 좀 더 좋다고 할 수 있다.

 

시간을 기반으로 하기 때문에 Keycloak과 사용자가 사용하는 기기간 시간을 동기화해야한다. 시간차를 줄이기 위해서 clock skew compensation을 정의해야한다.

 

 

3.2 OTP 사용 여부 선택 허용

 

사용자가 OTP를 사용할 수 있도록 선택 메뉴를 만드는 방법에 대해서 알아본다.

 

myrealm에 이전에 만들어놓은 alice 계정으로 로그인한다. Account Security - Signing in - Set up Authenticator application 메뉴를 통해 2FA를 위한 기기 설정을 할 수 있다.

 

 

FreeOTP, Google Authenticator, Microsoft Authenticator 앱을 통해서 QR 코드를 스캔하면 등록이 가능하다.

 

 

성공적으로 등록 시 Account Management 페이지에 아래처럼 2FA Authentication 등록 정보가 출력되는 것을 볼 수 있다.

 

 

실제 OTP 적용은 Authentication flow에서 처리한다. 특정 realm -> Authentication -> browser flow로 들어가서 Browser - Conditional OTP로 적용된 부분을 Required로 처리하면 realm에 포함된 모든 사용자들이 OTP를 사용해서 로그인해야되도록 변경된다.

 

 

4. 웹 인증 활용

 

웹 인증은 WebAuthn 이라는 프로토콜을 사용한다. WebAuthn은 개인키 및 공개키를 비대칭키 형태로 사용한다. 기기와 서버에서 공유되는 키를 사용하지 않으며 공개 키만 사용한다. 2FA에 사용할 경우 WebAuthn은 Keycloak과 코드 생성에 사용되는 서드파티 애플리케이션 간에 공유 키가 없기 때문에 OTP보다 더 안전하다. 대신 사용자는 보안기기를 갖고 있어야하며 이 기기는 FIDO2 라는 표준을 준수해야한다.

 

 

4.1 WebAuthn 활성화

WebAuthn 인증 흐름을 활성화 해본다.

 

1. 위에서 다룬 My Browser 인증 흐름을 통해 WebAuthn을 Required 방식으로 추가한다.

2. OTP Form 부분은 삭제한다.

3. Browser - Conditional OTP 부분을 Conditional로 추가한다.

 

 

 

4.2 보안 기기 등록 및 인증

 

위에서 WebAuthn 과정을 추가하면 바로 로그인 시 진행되지는 않는다. 사용자가 WebAuthn용 PassKey 기기를 등록해야한다. OTP 기기를 등록할때와 마찬가지로 Signing In -> Two-factor authentication -> Passkey 항목에서 Set up passkey를 눌러서 등록할 수 있다.

 

 

 

나의 경우 macOS의 chrome의 Passkey를 선택해 지문 인식을 등록했다. 그리고 아래처럼 Authentication - Required actions에 WebAuthn Register 항목이 ON이 되어있는지 체크해봐야한다.

 

이제 alice 계정으로 로그인을 시도할려고 하면 비밀번호 입력 이후 passkey로 인증하는 화면이 나온다.

 

 

모든 실습이 끝나면 다시 build-in browser flow를 default browser flow로 바꿔주는게 좋다. 그리고 보안 기기 등록도 모두 해제한다.테스트와 학습에 번거로운 과정은 생략하는게 좋기 때문이다.

728x90
반응형