koukiblog

たぶんweb系の話題

Nginx Ingress Controller + oauth2-proxyでSSOしてるときに、特定のIPアドレスからのリクエストのみ認証をスキップさせる

タイトルに書いてある通りのことがやりたかったのだけど、結構はまったので残しておきます。 脆弱性テストのためのクローラを通すとか、必要なシチュエーションはあるのではないでしょうか。

色々試行錯誤したのですが、下記の手順でいけました。

Nginx Ingress Controllerのfowarded-forオプションを設定する

k8sクラスタの前段にCDNなどを配置している場合はまずこれが必要です。

use-forwarded-headersにTrueを設定することで、Nginx Ingress Controllerからプロキシされる先にX-Forwaded系のヘッダーがセットされます。

ConfigMap - NGINX Ingress Controller

oauth2-proxyの設定を追加する

oauth2-proxyでX-Forwaded-ForヘッダにセットされたIPを受け取るには、reverse-proxyオプションと、real-client-ip-headerオプションを指定する必要があります。(oauth2-proxyのデフォルトはX-Real-IPのため、real-client-ip-headerオプションで設定する必要があります) その上で、trusted-ipオプションを指定します。

また、気付きづらいのですが、 trusted-ipを指定し、認証がスキップされると、oauth2-proxyはそのままupstreamにリクエストをプロキシします。そのため、upstreamが指定されていないと、404を返却し、Nginx Ingress Controllerが行う認証が失敗してしまいます。この場合、Nginx Ingress Controllerは500を返します。これを回避するためには、 20xを返す upstreamを設定してあげればよいです。 (static://202 など)

ここまでのオプションをまとめるとこうなります。

--real-client-ip-header=X-Forwarded-For
--reverse-proxy=true
--upstream=static://202
--trusted-ip=xxx.xxx.xxx.xxx
--trusted-ip=yyy.yyy.yyy.yyy
--trusted-ip=zzz.zzz.zzz.zzz

参考

Nginx Ingress Controller とoauth2-proxyを利用したSSOについて blog.1q77.com

trusted_ipの挙動について github.com