HAproxy 設定 ( Basic認証の結果で分岐 )
その場合の HAproxy 設定について、挙動の結果を経てここに記録。
< 動作環境 >
HAproxy 1.5x
< 前提知識 > HAproxy の設定について
・ユーザーリストの定義ができること
・BASIC認証で分岐できること
・簡単な front_end 定義
・ACL で 意図した back_end、ホストへ誘導できること
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
その上で、以下 2行の設定方法をマスターする。
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
acl auth_ok http_auth(定義済みユーザーリスト)
http-request deny unless auth_ok
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
< " http-request deny " について >
例えば、BASIC認証で NGだった場合、403 を返したい。
その際に、 http-request により、 宛先を deny とすることで、実現できた。
deny : 認めない (参照: eow.alc.co.jp)
< " unless " について >
まず普通に辞書を紐解く
unless : ~でない限り、~である場合を除いて (参照: eow.alc.co.jp)
以上を踏まえて 以下を読み解く。
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
" http-request deny unless auth_ok "
(BASIC認証の結果) auth_ok でなければ deny へ飛ばすぞ😤
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
です。
deny へ飛ばされると 403 エラー となります。
(403エラー関連のHAproxyの設定がデフォルトから更新されていなければ)
以上より、この2行の設定方法がわかった。
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
acl auth_ok http_auth(定義済みユーザーリスト)
http-request deny unless auth_ok
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
また、似たような書き方として以下もある。
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
acl auth_ok http_auth(user_list)
http-request auth if !auth_ok
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
auth_OK でない場合、つまり認証が通らなかったら、もう一度 認証を行う。
(以後 通らないと 同じく繰り返す)
これは、REST API ではなく、ブラウザで見るwebサイトへの対応では、親切な書き方かもしれない。
( パスワード入力画面を出してくれるなど )
ただし、REST API クライアントからこの処理を叩くと、 503 エラーを返却してしまう。
目的に応じて 好きな方 を使おう。
また、OR条件で繋げることもできる。
( ユーザーか 管理者 いずれかのBASIC認証が通ってなければ、 403エラー。)
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
http-request deny unless auth_user_ok or auth_mngr_ok
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
( 応用例 ) こんな書き方もできた。
# 前略
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
# ユーザーリスト定義
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
userlist user_list
user userman insecure-password ippandaze
userlist mngr_list
user mngrman insecure-password watasigakanrisya
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
frontend main *:80
acl auth_user_ok http_auth(user_list)
acl auth_mngr_ok http_auth(mngr_list)
http-request deny unless auth_user_ok or auth_mngr_ok
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー