POMERIUM - OSS の Identity Aware Proxy

# はじめに
OSS の Identity Aware Proxy なるものが存在すると聞いて手を動かしてみました。
検証メモとなります。

# 確認ポイント
手を動かす前に確認すべきポイントを列挙します。
- オンプレとクラウドの繋ぎ(エージェント導入有無)
- サポートプロトコル
- ポスチャ機能有無(シグナル・振る舞いと同義)


最低限、ここら辺の理解をゴールにします。


# POMERIUM とは
[公式サイト](https://www.pomerium.com/)をベースに概要を掴みます。

[本当にさっと知りたい方は製品紹介動画をどうぞ](https://www.youtube.com/watch?v=WGwC9ULDnAY&t=79s)。

[もう少し知りたい方はFAQセクションをどうぞ](https://www.pomerium.com/pricing/)。

モダンアーキテクチャは常に3つの要素を確認/評価し続ける。パケット毎に毎回評価し、アクセス許可・拒否を判定するイメージです。
- user identity : 誰がアクセスしているのか
- device identity : どのデバイスがアクセスしているのか
- context : どんな文脈でアクセスしているのか


#### 概要
- タイトル通り OSS の Identity Aware Proxy
- 認証・認可を行う OSS。IdP は Pomerium ローカルの DB、外部 IdP でもOK
- VPN の悩みを解消・zero trsut～という雰囲気
- プランは大別して二つ
    - Open Source(OSS 版)
    - Teams/Enterprise(機能制限なしの有償版)

有償版は、サポート・API・SAML/LDAP SSO が利用可能です。また、CI/CD 関連機能も有償版限定となります。

ポリシー設定は Teams プランから利用できます。user・group・domain・taime・duration・request context・devicecontext・MFA・その他が利用できます。
※ request context はどこまで・何を設定できるか確認したかった内容ですが、机上調査で手打ちですね...

なお、Audit log は Teams プラン以上から利用可能です。本番環境は Teams 以上が現実解になりそうです。。。


#### コスト
- Pomerium にログインするユーザ数で費用が発生するようです
- 30日間の返金サポートがあります。返金理由は不問だそうです(本当ですか...？)
- authorization は `Istio`, `Google Cloud` と連携可能

#### 導入実績/事例
- 公式サイト上は100以上の企業で導入されていると謳っています

#### アーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/ba21149a-0528-550c-48b2-202c97788515.png)
//[公式](https://www.pomerium.com/docs/overview/architecture)より

Promerium はユーザとアプリの間に位置します。(名前の通りプロキシですね)
先に説明の通り、Inbound 及び Outbound トラフィックを処理できます。

また、IdP は Promerium 自身 or IDaaS を利用できます
※ 検証以外は Promerium 自身の IdP 利用はあまり無さそうですね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/9edb482d-c3c6-faa0-5bad-906e9baed0c4.png)
//[公式](https://www.pomerium.com/docs/overview/architecture)より

本番環境では各コンポーネントは分けてデプロイした方がいいみたいです。
`external attack surface` を減らす目的です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/eecc0a5a-33d6-a818-c2bb-5bfac5f410bc.png)
//[公式](https://www.pomerium.com/docs/overview/architecture)より

続いで認証シーケンスです。分かり易いですね。
ふと気になったのですが、Databroker が死んだら一発アウトなのでしょうか...
概要は見えてきましたので、そろそろ手を動かしていきます。


# Let's get started!!
[Quick-Start](https://www.pomerium.com/docs/install/quickstart)を基にコンテナを起動していきます。検証に必要なファイルは以下の通りです。

1. TLS 証明書
1. Pomerium 設定ファイル
1. docker compose ファイル

まずは mkcert 等で自己証明書を用意します。
```
mkcert "*.localhost.pomerium.io"
```

次に Promerium 設定ファイルを公式からコピーします。
```sh:config.yaml
cat <<EOF >./config.yaml
# See detailed configuration settings : https://www.pomerium.com/docs/reference/


# this is the domain the identity provider will callback after a user authenticates
authenticate_service_url: https://authenticate.localhost.pomerium.io

####################################################################################
# Certificate settings:  https://www.pomerium.com/docs/reference/certificates.html #
# The example below assumes a certificate and key file will be mounted to a volume #
# available to the  Docker image.                                                  #
####################################################################################
certificate_file: /pomerium/cert.pem
certificate_key_file: /pomerium/privkey.pem

##################################################################################
# Identity provider settings : https://www.pomerium.com/docs/identity-providers/ #
# The keys required in this section vary depending on your IdP. See the          #
# appropriate docs for your IdP to configure Pomerium accordingly.               #
##################################################################################
idp_provider: google
idp_client_id: REPLACE_ME
idp_client_secret: REPLACE_ME

# Generate 256 bit random keys  e.g. `head -c32 /dev/urandom | base64`
cookie_secret: V2JBZk0zWGtsL29UcFUvWjVDWWQ2UHExNXJ0b2VhcDI=

# https://pomerium.com/reference/#routes
routes:
  - from: https://verify.localhost.pomerium.io
    to: http://verify:8000
    policy:
      - allow:
          or:
            - email:
                is: user@example.com
    pass_identity_headers: true
EOF
```

最後に compose ファイルも公式からコピーします。

```sh:config.yaml
cat <<EOF >./docker-compose.yml
version: "3"
services:
  pomerium:
    image: pomerium/pomerium:latest
    volumes:
      ## Mount your domain's certificates : https://www.pomerium.com/docs/reference/certificates
      - ./_wildcard.localhost.pomerium.io.pem:/pomerium/cert.pem:ro
      - ./_wildcard.localhost.pomerium.io-key.pem:/pomerium/privkey.pem:ro

      ## Mount your config file : https://www.pomerium.com/docs/reference/
      - ./config.yaml:/./config.yaml:ro # 適宜修正
    ports:
      - 443:443

  ## https://verify.localhost.pomerium.io --> Pomerium --> http://verify
  verify:
    image: pomerium/verify:latest
    expose:
      - 8000
EOF
```

Pomerium 設定ファイルが誤っているようでエラーが出ています。
後日時間を取って追記しようと思います。

また、GitLab の前に置く構成が気になるので、その辺りも触りたいと思います！

# 参考文献
- [Pomeriumデモ](https://www.youtube.com/watch?v=NrRwisO9sDg&t=347s)
    - Google Cloud に Debian11, Redis + Postgres インスト,IdP は Okta
- 公式サイトの [Backgroud](https://www.pomerium.com/docs/overview/background)  ページのリンク集は有益です
- NIST SP 800-207 [Zero Trust Architecture](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-207.pdf)
- UK National Cyber Security Centre [Zero trust architecture design principles](https://github.com/ukncsc/zero-trust-architecture/)
- [Q&A with the writers of NIST SP 800-207](https://www.pomerium.com/blog/zta-qa-nist/)