Graylog で SSO Pluginと、oauth2_proxy を使ってGoogle OAuth2認証する

# Graylog で SSO Pluginと、oauth2_proxy を使ってGoogle OAuth2認証する


Graylog で SSO Pluginと、oauth2_proxy を使ってGoogle OAuth2認証を設定したのでそのメモ

## 実現したいこと

Graylogでいちいちユーザーを作らないでも、Google OAuth2認証だけで、閲覧・検索だけはできるようにしたい。


## 使ったもの

以下の組み合わせて実現できた

- GraylogのSSO plugin : https://github.com/Graylog2/graylog-plugin-auth-sso
- oauth2_proxy : https://github.com/bitly/oauth2_proxy



## ポイント

### oauth2_proxy

#### 設定ファイル

- 【最重要】`pass_basic_auth` を `false` にしないと駄目
   - Graylogの認証メカニズムでも authorization Headerを利用するので、falseにしないと、oauth2_proxyで上書きされてしまってちゃんと動かない
- 死活/監視用のEndpointは、 `skip_auth_regex` にいれてやるべし
- コマンドラインオプションと1:1対応していないので、 https://github.com/bitly/oauth2_proxy/blob/master/contrib/oauth2_proxy.cfg.example を見ながら試行錯誤する必要あり


設定ファイル例

```
client_id = "XXXXXXXXXXXXX"
client_secret = "YYYYYYYYYYYYYYYYYYY"
email_domains = ["test.com"]
provider = "google"
upstreams = ["http://localhost:9000"]
cookie_secret = "ZZZZZZZZZZ"
cookie_refresh = "1h"
skip_auth_regex = ["^/api/system/lbstatus", "^/api/plugins/org.graylog.plugins.metrics.prometheus/metrics"]
pass_basic_auth = false
```

※LB死活チェックと、Prometheus ExporterのEndpointはskipするようにしている





### Graylog


#### SSO Plugin

- Automatically create users: ON
- Username Header: `X-Forwarded-User`
- Email Header: `X-Forwarded-Email`
- Default User Role: 次項で作成したRole


#### Role

SSO Pluginで、ユーザーの自動作成と、作成したユーザーのRoleが設定できるが、、、、
GraylogのRole機構だと、

- Admin/Reader どちらかが必須
- Adminは全権限。Readerはデータへのアクセス権一切ない（ログ一切みれない）
- Readerと、自分で作ったRole（個別ストリーム/ダッシュボードへのアクセス権限を付ける）を組み合わせて使うことが必須
- だけどSSO pluginは自動作成時に1つしかRole選べない。自分で作ったRole選ぶとReaderがつかないのでまともに使えないUserができる（試したけどNotFoundでまくる）

という問題がある。

これを解決するには、REST APIで、Reader権限と、必要なアクセス権限をあわせもつRoleを無理やり作って、それをSSO pluginで指定すればOK

例：全てのstreamsとdashboardがreadできる `Developer` Roleを作成する

```bash
-> % curl -v -XPOST -u user:pass  -H 'Content-Type: application/json'  'http://172.28.0.107/api/roles?pretty=true' -d '{     "name" : "Developer",     "description" : "Read all streams and dashboards",     "permissions" : [ "clusterconfigentry:read", "indexercluster:read", "messagecount:read", "journal:read", "messages:analyze", "inputs:read", "metrics:read", "savedsearches:edit", "fieldnames:read", "buffers:read", "system:read", "savedsearches:create", "jvmstats:read", "decorators:read", "throughput:read", "savedsearches:read", "messages:read" , "streams:read:*", "dashboards:read:*"],     "read_only" : false} '
```


- streams, dashboardsは試したところ、 `*` を設定すれば、全てが対象になる : 
  - 例 : `"streams:read:*", "dashboards:read:*"`



### その他の設定など

#### oauth2_proxyのログ

アクセスログとかとっておきたいけど、、、、

- アクセスログが標準出力
- エラーログが標準エラー出力

に出力されるのでファイルに出力してやる

systemdなら、、、


```
[Unit]
Description=oauth2_proxy Service

[Service]
Type=simple
Restart=always
User=oa2proxy
ExecStart=/bin/bash -c 'exec /usr/local/oauth2_proxy/oauth2_proxy -config /etc/oauth2_proxy/oauth2_proxy.conf >> /var/log/oauth2_proxy/access.log 2>> /var/log/oauth2_proxy/error.log'
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
```

※AmazonLinxu2だと、systemdが古すぎて `StandardOutput`/`StandardError` が使えないのでExecStartでリダイレクトしてやっている


ログのローテーションはlogrotateで

```
/var/log/oauth2_proxy/*log {
    create 0644 oa2proxy oa2proxy
    daily
    rotate 10
    missingok
    notifempty
    compress
    sharedscripts
    postrotate
        /usr/bin/systemctl reload oauth2_proxy.service 2> /dev/null || true
    endscript
}
```

※試したところUSR1だとログが切り替わらなかったので、HUPを送っている


#### 管理用のアクセス経路

- oauth2_proxyを通さないアクセス経路を用意しておくことで、adminログインの経路を確保しておくべし
- この経路では、SSO Pluginに設定している `X-Forwarded-User` Headerが絶対にGraylogに渡らないように、Proxyで潰すこと（でないとログインし放題になっちゃう）

Nginxなら


```
proxy_hide_header   X-Forwarded-User;
proxy_hide_header   X-Forwarded-Email;
```