ApacheでOpenIDのリバースプロキシを作る with Docker

## 概要
OpenIDのリバースプロキシをApacheで作る手順。docker-composeで環境を作る。
このページでは、prometheus, alertmanager, grafanaにOpenID認証をかける例を書く。

## 関連記事
- [[目次] Prometheusで監視システムを作る with Docker](https://qiita.com/Esfahan/items/7dc780501f418a71ad9d)
- [Apache2.4でLDAP認証用のリバースプロキシを作る with Docker](https://qiita.com/Esfahan/items/e3ce00411a23cbe3682f)

## ディレクトリ構造

```
.
├── docker-compose.yaml
├── .env
├── conf
│   └── openidc.conf
└── Dockerfile
```

## docker-compose
prometheus, alertmanager, grafanaのコンテナは、127.0.0.1からのアクセスのみに制限する。

```yaml:docker-compose.yaml
version: '3.2'

services:
  openid-rproxy:
    container_name: openid-rproxy
    build:
      context: ./
      dockerfile: Dockerfile
    env_file:
      - .env
    ports:
      - "80:80"
    restart: always

  prometheus:
    ports:
      - 127.0.0.1:9090:9090
    # 省略
  alertmanager:
    ports:
      - 127.0.0.1:9093:9093
    # 省略
  grafana:
    ports:
      - 127.0.0.1:3000:3000
    # 省略
```

prometheus, alertmanager, grafanaについては以下を参照。
参考：[prometheus, alertmanager, grafanaのdocker-compose.yaml](https://qiita.com/Esfahan/items/0feaedfd771f49ac7ee4#docker-composeyaml)

## Dockerfile
Apacheにmod-auth-openidcを入れて環境を作る。

```Dockerfile:Dockerfile
FROM httpd:2.4

RUN apt-get update -y
RUN mkdir /usr/local/apache2/conf/include/ &&  echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf

RUN apt-get install -y libapache2-mod-auth-openidc

COPY ./conf/*.conf   /usr/local/apache2/conf/include/
```

## .env
OpenIDの設定値を書く。

```ini:.env
# OIDCClientID
OPENID_CLIENT_ID=

# OIDCRedirectURI
OPENID_REDIRECT_URL=

# OIDCClientSecret
OPENID_CLIENT_SECRET=

# Require claim
OPENID_ROLE_NAME=

# OIDCCryptoPassphrase
# python -c 'import os,base64; print base64.urlsafe_b64encode(os.urandom(16))' などで発行する
OPENID_PASS_PHRASE=
```

## conf/openidc.conf
Apacheのconfファイルを作る。

```conf:conf/openidc.conf
LoadModule auth_openidc_module /usr/lib/apache2/modules/mod_auth_openidc.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

<VirtualHost *:80>
  LogLevel info

  OIDCClientID ${OPENID_CLIENT_ID}
  OIDCClientSecret ${OPENID_CLIENT_SECRET}
  OIDCRedirectURI ${OPENID_REDIRECT_URL}
  OIDCCryptoPassphrase ${OPENID_PASS_PHRASE}
  # 適宜変更
  OIDCProviderMetadataURL https://accounts.google.com/.well-known/openid-configuration
  OIDCProviderTokenEndpointAuth client_secret_basic
  # 適宜変更
  OIDCScope "openid profile email"
  OIDCSSLValidateServer Off
  OIDCResponseType "code"
  # 適宜変更
  OIDCOAuthRemoteUserClaim username
  OIDCCookieSameSite On
  # セッション有効期間の秒数。デフォルトは28800秒（8時間）。
  # OIDCSessionMaxDuration 28800
  # 無操作タイムアウトの秒数。デフォルトは300秒。
  OIDCSessionInactivityTimeout 28800

  <Location />
    AuthType openid-connect
    Require valid-user
    Require claim ${OPENID_ROLE_NAME}
  </Location>

  ProxyRequests Off

  # proxyするホスト
  # prometheus, alertmanager, grafanaの3つを、サブディレクトリでアクセスできるようにする例
  ProxyPass /prometheus http://prometheus:9090/prometheus
  ProxyPassReverse /prometheus http://prometheus:9090/prometheus

  ProxyPass /alertmanager http://alertmanager:9093/alertmanager
  ProxyPassReverse /alertmanager http://alertmanager:9093/alertmanager

  # grafanaは末尾に/grafanaが不要
  ProxyPass /grafana http://grafana:3000
  ProxyPassReverse /grafana http://grafana:3000
</VirtualHost>
```

## 起動

```console
$ docker-compose up -d --build
```

## 参考
- [mod_auth_openidcによりApache HTTP ServerをOpenID Connect Relying Partyにする -- Google編](https://heartbeats.jp/hbblog/2017/08/mod-auth-openidc-google.html)