🤪

Keycloak 21 admin 계정 복구하기

Created
2024/01/16 05:37
Tags
Cloud
AWS
Date

로그인 에러 발생

기존 admin 아이디로 로그인시 웹 ui 상에는 invalid username or password 라고 나옴
실제 ecs 에 로그를 확인해보니, 실제로는 user_disabled 에러 로그가 발생함

어떻게 복구 할 수 있나?

1.
docker-entrypoint.sh 어드민 계정 / 비밀번호를 설정하면, overwrite 될 줄 알았다 →
2.
container 안에 들어가서 kcadmin.sh 로 로그인해서 설정 할 수 있을 줄 알았다 →
3.
mysql 서버에 직접 들어가서, 비밀번호를 변경해봄
a.
직접 서버에 접속하는 방법은 인터넷이 막혀있는 환경에서 굉장히 어려움

디비에 접속 할 수 있는 방법을 알아보자

상황: 외부 네트워크가 막혀있는 VPC 환경

해당 어카운트에 ec2 없음
keycloak 은 ecs 를 통해 서비스 되고 있음
배포는 CodePipeline 통해서 이루어짐
keycloak 이미지에는 MySQL client 가 설치되어있지 않음
설치하고 싶어도, 외부 통신이 안됨

계획: mysql-client 도커 이미지를 만들고 주입시켜서, ec2에서 db 연결 될 수 있도록 하고, 해당 인스턴스에서 실행하여 디비 접속

1.
우선 외부 네트워크가 연결되어있는 sandbox 어카운트에서 mysql-client 이미지를 만들어서 ecr 에 주입
2.
해당 ECR 에 대해 접근 할 수 있도록 어카운트 permission 에 추가
3.
내부 어카운트에서 외부 ECR 참조하여 pull 하고, 내부 ECR에 push
4.
keycloak 동일 어카운트에서 ec2를 만들고
a.
endpoint 설정해야함 (sts, ecr api, ecr dkr, ssm등)
i.
sts : role 정보를 가져오려면 필요함
ii.
ecr api/dk : 도커 리포 접속
iii.
ssm : ec2에 web console 에서 접속하려면 필요함
b.
CloudFormationServiceRole 을 생성
i.
ec2, ssm 의 모든 권한을 사용할 수 있게 함
ii.
스위칭 롤 하여 ec2 터미널 접속
c.
sg 설정
i.
디비 sg 연결
ii.
endpoint sg 연결

실행: credential, user_entity, user_attribute, event_entity 테이블

테이블: user_entity

사용자에 대한 정보가 담겨있음 → enable true 설정해줘야함

테이블: user_attribute

사용자에 대한 permanentLock 에 대한 정보가 있음 → 해당 레코드 삭제 해줘야함

테이블: event_entity

사용자가 로그인 실패했던 내역들이 있음 → 확실하지 않아서, 그냥 삭제

테이블: credential

사용자에 대한 password, otp 정보가 각각의 row 로 생성되어있음
1.
이때 비밀번호는 단방향 암호화로 되어있어서 복호화가 불가능
2.
db의 credential 에 들어가서 admin 유저의 암호화 방식을 동일하게 사용해서 https://www.dcode.fr/pbkdf2-hash#f0 에서 만들어서 주입 →  → 동일한 방식으로 동작 안함

동일한 환경에서 만든 암호화키와 SALT 값이 필요

계획: 로컬환경에서 keycloak 실행하여 admin 계정 생성하고 해당 디비에서 직접 추출한 값으로 업데이트
version: '3' services: keycloak: image: quay.io/keycloak/keycloak:21.0.1 environment: DB_VENDOR: MYSQL DB_ADDR: host.docker.internal DB_PORT: 3306 DB_DATABASE: keycloak DB_USER: keycloak DB_PASSWORD: password KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: keycloak ports: - 8080:8080 command: start-dev
YAML
복사
이상하게도, mysql 디비와 연결이 안되어, h2 디비에 저장되어서, 해당 파일을 복사하여 dbeaver 에서 h2 server 연동해서 추출

DB 업데이트 이후에는 꼭! Keycloak 재시작해야함

성공