コンテンツにスキップ

Top

/

Apache の Basic認証 / Digest認証 設定手順

TV番組等、著作権的に問題があるコンテンツをサーバに置きたいので、他の人がアクセスできなくなるように認証をもうける。

Basic認証

まずはパスワードファイルを作成する。以下のコマンドを実行するとファイルができる。

$ sudo htpasswd -c /etc/httpd/conf/.htpasswd ログインユーザ名(任意の名前でよい。当然、Ubuntu上に存在していないアカウント名でも良い)
htpasswd: cannot create file /etc/httpd/conf/.htpasswd

ファッ!?

なんか怒られたぞ。

どうも、上記パスはCentOSとかの場合みたいだ。

UbuntuのApacheのデフォルトのパスは /etc/apache2/ なのでその下に.htpasswdファイルができるようにする。

修正した以下のコマンドを実行。ここではユーザー名は admin とした。(繰り返すがユーザー名はなんでもよい。セキュアなのを求めてるならもっと長い複雑な名前にしてもいいと思う。まぁパスワードが複雑なら問題ないはずなんだけど)

$ sudo htpasswd -c /etc/apache2/.htpasswd admin
New password: 
Re-type new password: 
Adding password for user admin

次にApacheで特定のパス配下にアクセスしようとしたら認証を要求するような設定ファイルを設定する。
設定ファイルは /etc/apache2/conf-available/ 配下に格納する。
ここに置いた設定ファイルを a2enconf というコマンドを使って、 /etc/apache2/conf-enabled 配下にシンボリックリンクを通す。
何してんの?と思うかもしれないけどあくまでconfファイルの本体はavailableにおいて、その中で有効にするやつだけenabled配下にリンクを通す、というApacheのルールなので従う。
(ならavailableという名前、もうちょっとなんかならんかったか?と思うが)

vi /etc/apache2/conf-available/basic-auth.conf

<Directory /var/www/html/basic-auth>         <= ここで指定したパス配下にアクセスしようとしたら認証を要求する、というパスを指定。  
    AllowOverride None                       <= Noneにしとくと.htaccess側の制御が行われない。よくわからんがNoneにしとけ。
    AuthType Basic                           <= ベーシック認証なのでBasic。ダイジェスト認証なら当然Digest。
    AuthName "This is basic auth sample."    <= ここで書いた名称が認証時に出る...はずなんだけどでないや。なんだこれ。    
    AuthBasicProvider file                   <= パスワードをファイルで指定しているならfile。他にもdbdやdbmなどある。  
    AuthUserFile /etc/apache2/.htpasswd      <= 上記で作ったパスワードファイル。  
    Require valid-user                       <= valid-userだと上記のパスワードファイルに記載されているユーザーが認証の対象となる。  
</Directory>

ファイルができたらconf-enabledにシンボリックリンクを以下のコマンドで貼って再起動すると https://jitaku.work/auth/ 配下にアクセスしようとすると認証を要求されるようになる。

$ sudo a2enconf basic-auth
$ sudo systemctl restart apache2

Basic認証は以上!

なお、一度ログインしたらキャッシュクリアとかしないとずっと入れるので注意。
まぁ個人のPCを複数人で使いまわすとか今の時代ないだろうから気にするところじゃないだろうけど。

Digest認証

今時 HTTPS じゃない通信なんてしないしこのサイトも実際httpsなんだからBasic認証で問題はないんだけど、まぁ慣例というかベーシック認証は使わず、Digest認証にする。
(よって、上記でやったBasic認証の設定周りは全部削除すること)

そもそもBasic認証の何がダメかって、パスワードをBase64で送ってるから。

Base64なんて平文で送ってるのと同義だから盗聴されたらアウト。

よって、Digest認証にしましょうね、というのが歴史的経緯。

となると https通信でがっつり暗号化されている今、Digestにする必要性って?

と言いたいところだけどまぁなんかBasicだといちゃもんつける人もいそうなのでDigestにする!

digestのパスワードファイルは以下のコマンドで作成する。

$ htdigest -c パスワードファイル レルム ユーザー名

実際にやってみる。

$ sudo htdigest -c /etc/apache2/.digestpass "Digest Auth" admin
Adding password for admin in realm Digest Auth.
New password: 
Re-type new password:

"Digest Auth" が レルム(領域名)とのことだがさっぱりわからんしみんなこうしてるのでそのままこうしてる。

んで、設定ファイルを作成。

sudo vi /etc/apache2/conf-available/digest-auth.conf

<Directory /var/www/html/digest-auth>
    AllowOverride None
    AuthType Digest
    AuthName "Digest Auth"                   <= これ、パスワードファイル作った時の「レルム」と一致してないとダメなんで要注意!  
    AuthDigestProvider file
    AuthUserFile /etc/apache2/.digestpass
    Require valid-user
</Directory>

んで、シンボリックリンクを張ってApacheを再起動したら、

$ sudo a2enconf digest-auth $ sudo systemctl restart apache2

・・・起動に失敗したぞ?
ログを確認すると、

$ journalctl -xeu apache2.service

~
7月 13 14:17:15 jitaku apachectl[61393]: Invalid command 'AuthDigestProvider', perhaps misspelled or defined by a module not included in the server configuration
~
とあり、なんかAuthDigestProviderというスペル間違ってんじゃね?とか言われるけど間違ってはない。

少し悩んでやっとわかったのが、modをloadしてなかった。

$ sudo a2enmod auth_digest
$ sudo systemctl restart apache2

これでOK!

ダイジェスト認証がかかっているはずなので、 https://jitaku.work/auth/ 配下にアクセスしてガードがかかっていることを確認。

やったね!

もしもユーザー名とパスワードを適切に入力しているのになぜかログインできない場合、 AuthName がレルム値と一致しているかよく確認すること。

以上!

Digest認証は中間者攻撃に脆弱

Digest認証は中間者攻撃にぜい弱だから駄目だよ、とかいう意見もあるが、https通信しかできない本サイトにおいて中間者攻撃は(おそらく)無効なので問題ない。
なんかすごいハッキングの方法とかあるかもしらんけど、そもそもproxyもfree wifiも使わんので中間者が入る余地がない。(と、思う)