apache2.4のIPとdigest認証+GoogleLoadbalancerのhelthcheck通過させようとしてちょっとはまったので備忘録です。
$domain3/uri1
は、特定IPからのみの接続
$domain1
$domain2
(同じDirectory)
は特定IPからは常時接続可能にして
それ以外はダイジェスト認証
GCPのhttpsLBのバックエンドのhelthcheckのURIは
/check.html
要は固定IPからでない接続を開発期間はdigest認証にしたい
(けどLBからのIPを許可してしまうと全世界のIPを許可した風になってしまうのでそれをなんとかする)
・Digest認証ユーザついか
sudo htdigest -c /path/.htdigest "Digest Auth" user1
sudo htdigest /path/.htdigest "Digest Auth" user2
・モジュールがロードされてることを確認
$ find ../ -type f -name "*conf"|xargs grep basic
../conf.modules.d/00-base.conf:LoadModule auth_basic_module modules/mod_auth_basic.so
$ find ../ -type f -name "*conf"|xargs grep digest
../conf.modules.d/00-base.conf:LoadModule auth_digest_module modules/mod_auth_digest.so
$ find ../ -type f -name "*conf" |xargs grep mod_authz
../conf.modules.d/00-base.conf:LoadModule authz_core_module modules/mod_authz_core.so
../conf.modules.d/00-base.conf:LoadModule authz_dbd_module modules/mod_authz_dbd.so
../conf.modules.d/00-base.conf:LoadModule authz_dbm_module modules/mod_authz_dbm.so
../conf.modules.d/00-base.conf:LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
../conf.modules.d/00-base.conf:LoadModule authz_host_module modules/mod_authz_host.so
../conf.modules.d/00-base.conf:LoadModule authz_owner_module modules/mod_authz_owner.so
../conf.modules.d/00-base.conf:LoadModule authz_user_module modules/mod_authz_user.so
・apache設定追加
$ sudo vi /etc/httpd/conf.d/auth.conf
$ cat auth.conf
#domain1/2
SetEnvIF X-Forwarded-For "$myip1" AllowIP
SetEnvIF X-Forwarded-For "$myip2" AllowIP
#SetEnvIF Remote_Addr "130.211.0.0/22" HelthchkIP
#SetEnvIF Remote_Addr "35.191.0.0/16" HelthchkIP
SetEnvIf Request_URI "/check.html" Helthchk
<Location />
<RequireAny>
AuthType Digest
AuthName "Digest Auth"
AuthUserFile /path/.htdigest
Require env AllowIP
Require valid-user
Require env Helthchk
</RequireAny>
</Location>
#domain3
<Location /uri1>
Require env AllowIP
</Location>
$ sudo apachectl configtest
Syntax OK
$ sudo systemctl restart httpd.service
$ sudo systemctl status httpd.service
ちょっとはまったとこ:
・VirtualHost
のDirectory
に書くのだとなんだか<RequireAny>
が効かなかったがLocation
にしたら効いた
・LBからのIPも許可にするとIPで許可されてしまってダイジェスト認証が効かなくなってしまうのでURI指定さす
・LBのヘルスチェックの到達場所は別でかけてるRewriteもスルーさせててデフォルトのドキュメントルートに来る
・ヘルスチェックのIPはRemote_Addr
でクライアントIPはX-Forwarded-For
という差があるが今回は関係なかった
・Satisfy any
は<RequireAny>
になった(どれか一致で認証とおすやつ。全部を要求は<RequireAll>
)
ちなみに直IPとhttpはhttpsにリライト+LBヘルスチェックは通過はこちらにかきました
決済システムへの出口はおそらくデフォルトゲートウェイなので、GCPとAWSは直に行くっぽいのと戻りは直にきたりするのでrewriteしてても名前が一致しないとエラーが出ることがあるっぽいです。AzureはゲートウェイがLBになってるらしい(と先輩に聞いた)。
LBのヘルスチェックの設定についてはURIはデフォルトだと/
で、GUIコンソールだとネットワークサービス>負荷分散
ではなくコンピュートエンジン>ヘルスチェック
に設定する箇所がありました(AWSはLBのとこでヘルスチェックも可能)。
参考:
https://dev.classmethod.jp/cloud/elb-exclude-health-check-url/
https://qiita.com/ysKey2/items/c9f98a3c5d6f2a9cc801
https://qiita.com/mmotoi/items/5d7dcbb9e461feba98cd
https://qiita.com/Ayame/items/1ab7f645b1d77db454e4
https://qiita.com/KurosawaTsuyoshi/items/d9579c9c68666f086e68