apache2.4のIPとdigest認証＋GoogleLoadbalancerのhelthcheck通過

apache2.4のIPとdigest認証＋GoogleLoadbalancerのhelthcheck通過させようとしてちょっとはまったので備忘録です。

```text:要件
$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ヘルスチェックは通過は[こちら](https://qiita.com/smallpalace/items/bc07c00d1583dbe53a79#apache%E5%81%B4%E3%81%A7ip%E3%81%A8http%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92https%E3%81%ABrewrite%E3%81%99%E3%82%8B)にかきました
決済システムへの出口はおそらくデフォルトゲートウェイなので、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