Keycloak을 도커를 통해 실행하고, 이를 AWS 환경에 배포하였다.
배포된 주소로 키클락 로그인 페이지에 접속하면 배포된 주소에서 연결을 거부했다(ERR_CONNECTION_REFUSED)며 접속이 되지 않았다.
Globally disable https keycloak
Keycloak 서버와 이를 사용하는 클라이언트 간의 모든 통신에 SSL/HTTPS를 사용하지 않으면 중간자 공격에 매우 취약해진다. OAuth 2.0/OpenID Connect는 보안을 위해 액세스 토큰을 사용하는데, SSL/HTTPS 을 사용하지 않으면 네트워크 통신이 암호화되지 않은 상태로 전송되고 공격자는 민감한 정보(액세스 토큰 등)을 엿보고 획득할 수 있다. 액세스 토큰을 획득하면 해당 토큰에 허가된 모든 작업을 수행할 수 있기 때문에 보안면에서 매우 취약해진다.
따라서 Keycloak은 SSL Required 를 기본적으로 external로 설정하여 제공하고 있다.
기본값
"ssl-required" : "external"
이는 외부 요청(localhost가 아닌 네트워크에서 오는 요청)에 대해서는 SSL이 필요하지만, 내부 요청(localhost)에는 SSL이 필요하지 않다는 의미이다. 그래서 로컬 환경에서는 에러가 나지 않았고 배포를 했을때 SSL 설정 관련 에러가 난 것이었다.
그 외에도 SSL 설정이 어려울 수 있으므로 Keycloak은 localhost, 192.168.x.x와 같은 사설 IP 주소를 통해 비-HTTPS 통신을 허용한다. 또한 localhost, 192.168.x.x와 같은 사설 IP 주소가 아니더라도 Keycloak이 SSL 신뢰 관리자(trust manager)를 끄는 것을 허용한다.
SSL 껐을 때
"ssl-required" : "none"
프로덕션 환경에서는 SSL이 전반적으로 활성화되고 필수로 설정되도록 해야 한다.
하지만 HTTPS가 아닌 HTTP 통신을 사용하고 있었고, SSL을 활성화할 경우 인증서 관리의 복잡성 때문에 프로덕션 환경에서도 SSL 를 비활성화하고 배포하기로 했다.
또한 Keycloak과 클라이언트 간의 통신이 신뢰할 수 있는 환경에서 이루어졌고 실제 운영을 하는 서비스가 아니었기 때문에 빠른 배포와 테스트를 위해 SSL 를 비활성화하고 키클락을 배포하였다.
📍 실패
처음에는 키클락 Admin 페이지에 접속해서 Master Realm > Real settings > Require SSL > None으로 설정해주면 된다고 생각했다.
하지만 키클락을 배포할 때 SSL 설정이 기본적으로 external로 활성화되어 있기 때문에 접속조차 안됐고, 이 방법은 사용할 수 없었다.
📍해결 : 도커에서 설정
Docker를 사용하여 Keycloak을 배포하고 있기 때문에 도커에서 관련 설정을 비활성화해주면 된다.
도커에서 SSL을 비활성화 하는 방법을 인터넷 검색를 통해 찾았지만 최신 버전으로 업그레이드 된 후로 경로도 바뀌고, 명령어도 먹지 않았다.
키클락 21 버전이 되면서 설정 파일이 저장되어 있는 경로가 조금 바뀐 듯하다.
그래서 직접 ls 명령어를 치면서 파일위치을 찾았고 명령어도 바꿔가면 내가 찾은 방법을 공유하려 한다.
1) ec2 접속한다.
> ssh -i pemkeyname,pem ec2-users@12.111.12.1111
> chmod 400 pemkeyname.pem
2) Keycloak Admin CLI를 실행하기 위한 스크립트 파일(./kcadm.sh)이 있는 경로로 이동한다.
> cd opt
> cd keycloak
> cd bin
> ls
3) Keycloak Admin CLI를 사용하여 로컬 Keycloak 서버에 대한 관리자 자격 증명을 설정한다.
> .kcadm.sh config credentials --server http://localhost:8080/ --realm master --user admin
4) Keycloak Admin CLI를 사용하여 특정 Realm의 SSL 설정을 none으로 변경한다.
> .kcadm.sh update realms/master -s sslRequired=NONE
배포된 주소로 다시 접속하면 로그인 페이지가 뜨고, 회원가입 시 아래와 같이 회원정보 추가 입력창까지 뜬다.
(1년전 프로젝트라 사진이 이거밖에 없다ㅠㅠ 기록을 잘하자)
최신 버전의 자료가 없어서 더욱 잡기 어려웠던 에러였다. 하지만 보안회사에서 파일 경로 찾고 뜯어보면서 모의해킹 했던 경험이 에러를 해결하게 해줬다.
자료 조사와 내 경험을 합쳐서 트러블 슈팅을 한 것이 이번에 처음이었다. 자료에만 의존하여 문제를 해결하였는데 이 경험 덕분에 트러블 슈팅을 하는 방법을 조금씩 터득하게 되었다. 앞으로 어떤 에러이든 자료에만 의존하지 않고 많은 방법을 시도해보면서 나만의 노하우를 만들어야겠다.