관리자 페이지를 Cloudflare Access 로 막고 "허용한 이메일로 일회용 코드를 받아 로그인"하게 하려 했는데, 로그인 화면에 이메일 입력란이 나오지 않았다. 정책이 아니라 로그인 수단 쪽 설정이 빠져 있었다.
증상
- Zero Trust 에서 Self-hosted 애플리케이션을 만들고, 정책에 허용할 이메일을 넣었다.
- 보호한 주소로 들어가면 Access 화면은 뜨는데, 이메일로 코드를 받는 선택지가 없다.
원인
Access 의 정책은 "누가 들어올 수 있는가"를 정하고, 로그인 수단(Identity provider)은 "어떻게 본인임을 증명하는가"를 정한다. 둘은 별개다. 내 계정에는 기본 로그인 수단만 등록돼 있었고, 이메일 일회용 코드(One-time PIN)는 목록에 없었다. 등록되지 않은 수단은 로그인 화면에 나올 수 없다.
해결
- Zero Trust 대시보드의 Integrations → Identity providers 에서 One-time PIN 을 추가한다.
- 애플리케이션 설정에서 "모든 로그인 수단 허용"을 끄고 One-time PIN 만 선택한다.
- 로그인 수단이 하나뿐이면 Instant authentication 을 켠다. 수단을 고르는 화면을 건너뛰고 바로 이메일 입력으로 간다.
- 정책은 Include 에 Emails 셀렉터로 허용할 주소를 나열한다.
참고로 Zero Trust 는 무료 플랜으로도 쓸 수 있었다.
서버에서 직접 테스트하기
Access 는 Cloudflare 엣지에서만 막는다. 오리진 서버 안에서는 Host 헤더만 맞춰 주면 인증 없이 응답을 볼 수 있어서, 배포 직후 동작 확인에 편하다.
curl -H 'Host: admin.example.com' http://127.0.0.1:8080/
뒤집어 말하면, 오리진이 인터넷에 직접 열려 있다면 Access 를 우회할 수 있다는 뜻이다. 오리진은 터널 뒤에 두거나 루프백에만 바인딩하고, 가능하면 앱에서 Access 가 붙여 주는 JWT 를 검증해 이중으로 막는다.
정리
Access 에서 원하는 로그인 방식이 화면에 안 보이면 정책을 들여다보기 전에 Identity providers 목록부터 확인한다. 정책은 통과 조건이고, 로그인 수단은 따로 등록해야 한다.
댓글 없음:
댓글 쓰기