역방향 프록시 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 헤더를 굳이 변환시키지 않고 그대로 둡니다.