역방향 프록시 pomerium의 설정 파일 예시에 대해 설명합니다.
개요
pomerium은 다양한 기능을 제공하는 L7역방향 프록시입니다. nginx와 비교하면 더욱 쉽게 SSO 통합이 가능하지만 WAS 없이 좀 더 프록시 기능에만 특화된 프로그램입니다. 주요 사용 시나리오는 아래와 같습니다.
- 접근 제어를 위한 다양한 SSO, OAuth 제공자 지원 : 구글, 마이크로소프트, 깃헙, 페이스북, 자체 OAuth 서버 등등
- 서브 도메인 또는 특정 URL 접미사에 대해서 접근 제어
- http 내부 서버를 https 서버로써 노출 (SSL 터널링)
- 내부 서버와 외부 서버에 대해 다른 포트로 프록싱 (포트 포워딩)
- 내부 서버는 꼭 localhost 제외하고도 같은 사설 네트워크의 사설 서버에 대한 프록싱도 가능
- pomerium을 경유하는 모든 http 접근 로깅
자세한 설정에 대한 내용은 https://www.pomerium.com/reference/ 를 참고하세요.
docker-compose.yml 예시
2개의 별도의 파일로 세팅합니다. config.yaml과 .env가 그것입니다. docker-compose.yml은 아래와 같이 나타납니다.
pomerium:
image: pomerium/pomerium:latest
network_mode: host
environment:
- SHARED_SECRET=${POMERIUM_SHARED_SECRET}
- COOKIE_SECRET=${POMERIUM_COOKIE_SECRET}
- IDP_CLIENT_ID=${POMERIUM_GOOGLE_ID}
- IDP_CLIENT_SECRET=${POMERIUM_GOOGLE_SECRET}
volumes:
- /path/to/config/config.yaml:/pomerium/config.yaml:ro
- /path/to/cert/:/pomerium/cert:ro
restart: always
image는 공식 저장소의 공식latest이미지network_mode는 프록시이 모든 기능을 쓸 수 있게 쓰지 않을 이유가 딱히 없다면 호스트 네트워크 모드를 사용합니다.environment는 민감한 API 키들을 제공합니다..env파일로 별도로 환경 변수로써 키를 관리하는 방법을 추천합니다. 아래 챕터를 참고하세요.volume에서는 config.yaml 파일과 autocert를 사용하지 않는다면 인증서와 인증서 키가 들어있는 디렉토리를 마운트해줍시다.- 보통 모든 컨테이너의 http 연결을 가장 앞에서 프록싱하게 구성하므로 반드시 켜져있게
restart옵션을 설정해줍시다.
.env 예시
.env 파일의 자세한 내용은 이 문서를 참고하세요.
이 파일은 pomerium과는 상관없고 docker-compose가 읽어서 환경 변수를 설정하기 위한 파일입니다.
POMERIUM_SHARED_SECRET=
POMERIUM_COOKIE_SECRET=
POMERIUM_GOOGLE_ID=
POMERIUM_GOOGLE_SECRET=
POMERIUM_SHARED_SECRET,POMERIUM_COOKIE_SECRET: 임의의 키 문자열이 들어가면 됩니다. 보통head -c32 /dev/urandom | base64명령어로 생성해 적어줍니다.POMERIUM_GOOGLE_ID,POMERIUM_GOOGLE_SECRET: 이 문서에 따라 키를 발급받아 적어주세요.
config.yaml 예시
address: :443
log_level: info
authenticate_service_url: https://auth.myserver.com
administrators: "admin@gmail.com"
cookie_name: _pomerium
http_redirect_addr: :80
certificates:
- cert: /srv/cert/domain1.pem
key: /srv/cert/domain1.key
- cert: /srv/cert/domain2.pem
key: /srv/cert/domain2.key
idp_provider: "google"
idp_provider_url: "https://accounts.google.com"
metrics_address: ":8888"
policy:
# comment is available
- from: https://myserver.com
to: http://localhost:8080/
allowed_users:
- admin@gmail.com
prefix: /service/
address: 표준 https 포트를 사용합니다.log_level: 자세한 프록시 로그를 보고싶다면 레벨을 debug로 설정할 수도 있습니다.authenticate_service_url: pomerium이 자체 정보와 인증에 사용할 서브 도메인이 필요합니다. 하나의 서브 도메인을 생성하고 할당해주세요.administrators: 관리자 email (실제 SSO에서 사용하는 email과 동일하게 해주세요. 인증에 사용됩니다.)cookie_name: 세션 정보를 저장하기 위해 사용자 브라우저에 쿠키를 생성하는데, 해당 쿠키의 이름을 커스터마이징합니다.http_redirect_addr::80으로 설정하면 80포트의 모든 http 요청을 443포트의 https로 리다이렉트 시킵니다.certificates: SSL 인증서를 수동으로 잡아줄 수 있습니다. 이 옵션이 없다면 AutoCert 옵션을 구성해야합니다. 둘 다 구성하지 않으면 당연히 https 서버를 열 수 없어 동작하지 않습니다.idp_provider: 이 포스트에서는 구글 제공자를 예시로합니다.idp_provider_url: 구글의 경우 이 값 고정입니다.metrics_address: prometheus등으로 메트릭을 관리하기 위한 메트릭 엔드포인트 서버 포트입니다.policy: 실제 프록시 정책책입니다.
policy예시
- from: https://myserver.com
to: http://localhost:8080/
allowed_users:
- admin@gmail.com
prefix: /service/
위와 같은 구성은 https://myserver.com가 Host인 요청중에서 Host 뒤의 URL이 /service/인 요청을 http://localhost:8080로 리다이렉트 합니다.
8080 포트 서버 입장에선 https://myserver.com/service/hello.html로 pomerium에 들어온 요청은 자신에게 http://localhost:8080/hello.html URL로 요청이 들어옵니다.
admin@gmail.com 유저로 인증된 요청만 통과됩니다.
유용한 옵션들은 아래와 같습니다.
allow_public_unauthenticated_access: true:allowed_users없이 모든 요청을 통과시킵니다.allow_websockets: true: 웹 소켓 요청도 통과시킵니다.preserve_host_header: true: Host http 헤더를 굳이 변환시키지 않고 그대로 둡니다.