개요
Cloudflare Access는 Cloudflare를 통해서 라우팅되는 모든 서비스에 적용 가능한 보안 정책들을 제공한다. 이를 통해서 원하는 사용자만 내부 서비스에 접근을 허용할 수 있다. 이번 글을 통해서 개인적으로 구축한 서비스에 대한 보안 정책들을 적용해보도록 하자.
설정
Cloudflare의 제로 트러스트에서 Access 메뉴를 찾아보자.

Access 메뉴는 각각 다음과 같은 기능을 한다.
- 응용 프로그램: 정책을 적용할 대상 도메인 또는 네트워크와 같은 타겟을 설정한다.
- 정책: 보안 정책들을 설정한다
- 규칙 그룹: 정책에서 반복적으로 사용되는 규칙들을 정의한다.
- 서비스 인증: 사용자가 아닌 프로그램 허용을 위한 토큰 또는 인증서를 발급한다.
정책을 설정하기에 앞서 먼저 Access에서 사용할 보안 정책의 로그인 기능을 설정하도록 하겠다. 설정 메뉴에서 사용자 설정 페이지를 확인하자.

팀 도메인에서 사용할 주소를 설정하고, 하단에서 로그인 페이지를 커스텀할 수 있다. 다시 뒤로 돌아가서 인증 메뉴의 로그인 방법을 확인한다. 기본적으로 One-time PIN 하나만 설정되어 있을 것이다. 필요하다면, 새 항목 추가를 통해서 OAuth2 로그인 방식을 추가할 수 있는데, 이번 글에서는 패스한다.

자, 이제 로그인은 기본 설정 그대로 이메일에 pin 인증을 하는 방식으로 설정되어 있음을 확인하였다. 이제 Access로 가서 규칙 그룹을 생성해보자. 선택기를 Emails로 지정하고 내가 원하는 이메일 주소를 넣어서 내 이메일 주소만 선택되는 규칙을 생성하자.

여기서 이메일 하나하나가 사용자 1명에 해당하므로, 총 50개가 넘지 않도록 주의하자. 무료 티어는 50명의 사용자로 한정된다.
그러면 이제 정책 메뉴에서 정책을 생성한다. 선택기를 Rule Group으로 설정하고 앞서 생성한 규칙 그룹을 추가한다. 상단의 작업은 Allow로 기본 지정되어 있다. 그러면 앞서 생성한 규칙 그룹의 규칙에 해당하는 사용자는 Allow 되는 것이다.

마지막으로 응용 프로그램 메뉴에서 응용 프로그램을 추가해보자. 앞선 글에서 생성한 터널에 연결된 서비스에 정책을 추가하는 것이 목적이므로, 응용 프로그램은 자체 호스팅으로 선택한다.

응용 프로그램 이름을 적당히 지정하고, Access 정책에서는 기존 정책 선택을 통해서 앞서 만든 정책을 지정하도록 한다. 이름 아래 공개 호스트 이름 추가 버튼을 눌러서 정책이 걸리기를 기대하는 도메인 이름을 추가하도록 하자.

예를 들어, 본인은 Mac mini에 대한 도메인의 ssh 서버에 mini-ssh 하위 도메인을 설정했으므로 해당 하위도메인을 입력하고 경로는 비워둔채로 응용 프로그램을 추가할 수 있다.
주의사항!
응용 프로그램에서 공개 호스트 이름을 추가하는 방식으로 도메인을 등록하는 순간, 다른 메뉴에서 Access 설정 여부에 관계 없이 해당 도메인으로 들어가는 모든 트래픽은 위에서 생성한 규칙에 의해서 접근이 제어된다! 하위 도메인은
*
처럼 asterisk 를 사용할 수 있는데, 만약 이를 잘못 사용하게 된다면 내가 원하지 않는 접근 제어가 모든 도메인에 잘못 걸릴수도 있으므로 반드시 주의해야 한다.테스트
응용 프로그램 생성이 완료되었으면, 거기에 연결한 정책이 곧바로 동작하기 시작할 것이다. 접근 제어가 진행중인 도메인으로 접근을 시도하면 다음과 같이 로그인 화면을 만날 수 있다.

이 화면까지는 누구나 도달할 수 있지만, 이메일 인증이 개인 이메일만 허락하도록 지정되어 있으므로 외부인은 정책을 통과할 수가 없다.

정책에 의해서 허용된 사람은 인증번호를 입력하고 나면 정상적으로 서비스 화면을 보거나, ssh에 연결이 되는 것을 확인할 수 있다.
고급 설정
몇 가지 추가적인 설정에 대해서 알아본다.
서비스 인증
접근 제어를 설정하고 나니까 몇 가지 동작하지 않는 기능들이 있다. 예를 들면, 모니터링을 위해서 주기적으로 api 호출을 하는데, 이제는 로그인 프로세스를 통과하지 못해서 호출이 차단되는 문제가 있을 것이다. 이런 경우에 사용하는 것이 바로 서비스 인증이다.

이런 경우에는 다음과 같은 프로세스로 제어를 허용할 수 있다.
- 서비스 인증에서 토큰을 하나 생성하자.
- 서비스 인증용 규칙 그룹을 새로 만들자. 선택기를 Service Token으로 선택하면 된다.
- 정책을 새로 만들자. 정책의 작업이 Allow가 아닌 Service Auth가 되어야 한다.
- 응용 프로그램에 방금 만든 정책을 추가하면, 토큰 인증 방식도 접근이 허용된다.
예외 허용
특별한 경우에는 아무런 제어 없이 허용하고 싶은 경우가 있을 것이다. 아이피를 기반으로 일괄 허용하는 등의 요구사항에 대해서는 규칙으로 제어가 가능하다.
- 예외를 위한 규칙 그룹을 새로 만들자. 선택기를 IP Ranges로 선택하고 CIDR 대역을 입력하면 된다.
- 정책을 새로 만들자. 이번에는 작업을 ByPass로 선택한다.
- 응용 프로그램에 방금 만든 정책을 추가하면 접근제어 없이 프리패스다.
Google 로그인 추가
설정 > 인증 > 로그인 방법 추가를 눌러 Google을 선택한다. 그러면 설명서가 자세히 나오는데, 설명에 나온 그대로 따라하고 발급받은 앱 아이디와 클라이언트 암호를 넣으면 된다. 간단히 요약하자면,
- GCP 콘솔에서 APIs 및 서비스로 진입, Credentials 메뉴를 찾는다.
- 사전에 OAuth 동의 화면을 설정하지 않았다면, 상단의 버튼을 눌러 동의 화면을 설정한다.
- origins 설정 및 redirect URIs 에서 Cloudflare가 발급한 페이지 정보를 입력한다.
- 발급된 크레덴셜을 Cloudflare 구글 로그인 설정에 입력하여 로그인 방법을 추가 완료한다.
그러면 로그인 화면에서 구글 로그인이 생기고, 여전히 정책에 따라서 특정 이메일만 허용되므로 본인만 로그인을 통과할 수 있다.
맺음말
Cloudflare Access를 통해서 개인 서비스와 서버 접근에 접근 제어를 추가하는 방법에 대해서 알아보았다. 이러한 방법을 통해서 ssh 서버에 아무나 접근할 수 없도록 설정할 수 있었고, 앞으로 추가하게 될 서비스들도 마찬가지로 외부 접근을 제어할 수 있게 되었다.
이 모든것을 무료로 제공하는 Cloudflare를 찬양하자.