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