アレコレ・ティプス

これ便利だな〜と思ったことなど

HAproxy 設定  ( Basic認証の結果で分岐 )

REST API サーバーのフロントに立たせる HAproxyの設定において、Basic認証の結果をもとに分岐させたい。
その場合の HAproxy 設定について、挙動の結果を経てここに記録。
 
< 動作環境 >
CentOS Linux release 7.5.1804 (Core) 
Linux 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018
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 エラーを返却してしまう。
 
REST APIBASIC認証を 叩いて認証NGの際、 HAproxy から 403 エラーを出して欲しい場合は、前者の書き方でいくべき。
 
前者は REST API ( CUI )向き、後者は ブラウザからみる webサイト( GUI )向き と思われる。
 
目的に応じて 好きな方 を使おう。
 

 
 
また、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
 
    acl ・・・ 分岐させたい acl 処理や default_backend など
 
#ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー