親愛なるジョンからの手紙

雑記です。ゲームとか漫画とかプログラミングとか。

Digest認証環境でもTestcafeしたい!(ラノベ)

対象バージョン

Testcafe Ver.0.13.0 でもTestcafeあんまり関係ないよ だいたいApacheだよ

ここまでのあらすじ

営業氏「プロジェクトのステージング環境をデモサイトとしても使用したい」

じゃあ外部にも公開しよう

ステージングサイトに無制限にアクセスされるとマズいから、Digest認証をかけましょう

そういえばDigest認証のページに対してTestcafeって動くのかな

401 Not Authorized/(^o^)\

TestcafeのAPIにhttp認証のAPIあるやんけ。使ったろ(https://devexpress.github.io/testcafe/documentation/test-api/http-authentication.html)

401 Not Authorized(Basic Authentication Only)\(^o^)/

あれ……コレは自動テスト化の夢が潰えるのでは……?←今ここ

そもそもなぜBasic認証できてDigest認証できないのか

調べてみたところ、UI上は同じだが、暗号化の方法が違うらしい。 また、それに伴ってHTTP Headerの中身もゴッソリ変わってしまう模様。 (http://dackdive.hateblo.jp/entry/2014/06/24/220557)

これに合わせてTestcafeを魔改造し、Digest認証に対応させるのも手だが、今後アップデートされた際に地獄を見るのは明らかなので、違う手を打ってみる。

結論

Digest認証が通らないのなら、Digest認証を外してしまえばいいじゃない。

というわけで、手の一つとしてBasic認証にしてしまう手があります。 とはいえ、暗号化方式としてはDigest認証の方が強固なため、やはりDigest認証の方を採用したいところ。

それなら特定の場所に絞ってDigest認証をかけてしまえばいいじゃない。 大枠の方針としては以下の通り。

  • 基本的には認証を持っていないユーザーはdenyする。
  • 特定のIP(弊社のグローバルIP)からのアクセスのみallowする。

これらの方針を、Apacheのコンフィグファイルを利用して実装します。

実装例

まずは通常のDigest認証のユーザーとパスワードを生成

cd /path/to/apache/bin
htdigest -c "/path/to/digest/config/file/<digest pass setting file name>" <Digest Auth Name> <User Name>

パスワードが要求されるので、認証に利用したいパスワードを入力します

New password:*******
Re-Type new password: *******

htdigestで設定した場所に、暗号化された認証ファイルが作成されます。

続いて、認証で守りたいフォルダを設定します。

httpd.conf

<Directory "/path/to/auth/folder">
    AuthType Digest
    AuthName "<Digest Auth Name>"
    AuthUserFile "/path/to/digest/config/file/<digest pass setting file name>"
    Require valid-user
</Directory>

また、Digest認証に利用するモジュールをロードするようにしておきます。

httpd.conf

LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so ←コメントを外す
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so

ここまででDigest認証の準備は完了。 設定したユーザーIDとパスワードで認証がかかっているかどうかを確認します。

続いて、特定IPのホワイトリストを作るために、先ほど設定したDirectoryにプロパティを追加します。

httpd.conf

<Directory "/path/to/auth/folder">
    AuthType Digest
    AuthName "<Digest Auth Name>"
    AuthUserFile "/path/to/digest/config/file/<digest pass setting file name>"
    Require valid-user
    ## ----ここから下を追加---- ##
    Satisfy Any
    
    Order deny,allow
    deny from all
    Allow from <Test Client Global IP>
</Directory>

ホワイトリストには会社のIPとか入れておけばいいんじゃないでしょうか。 あとは他にテスト利用したい場所に向けてIPを順次解放していく形。

Tomcat併用環境だとダメだった

問題は以下のタグ部分

<Directory "/path/to/auth/folder">
  …
</Directory>

このディレクトリ指定に、tomcatwebapps/tmtと、www/htmlで検証してみました。 が、駄目。

直ファイルではTomcatの方を優先してしまうらしく、イイ感じにauth対象を取ってくれませんでした。 そのため、httpd.confを以下のように変更。

<Location />
    AuthType Digest
    AuthName "<Digest Auth Name>"
    AuthUserFile "/path/to/digest/config/file/<digest pass setting file name>"
    Require valid-user

    Satisfy Any
    
    Order deny,allow
    deny from all
    Allow from <Test Client Global IP>
</Location>

Locationでルートフォルダ指定により、すべてのアクセスをdenyすることで対策を取りました。 Apacheそんなに詳しくないので、マサカリはあるだろうなーと思ったけどとりあえず良さそうな動きしてるしこのままで

参考資料

https://www.adminweb.jp/apache/allow/index8.html http://kakikukeko.sakura.ne.jp/blog/allow-ip-or-digest-authentication-on-apache/