4月 302014
 
シェアする

ApacheのBasic認証で利用される.htpasswdファイル。
Basic認証に利用されるこのファイルですが、特に名前が制限されているわけではなく、Apacheの設定ファイル以外にWebアクセスするディレクトリに直接置ける「.htaccess」というファイルにてBasic認証を行う場合にパスワードファイルとしてパスワードが「.htpasswd」に保存するという手順が紹介されている。だから、「.htpasswd」ってのが当たり前のようにみなに認識されるファイル名になっているのだと思う。

ところで、この「.ht」から始まるファイルたちはApacheのデフォルト設定ではWebブラウザ経由では閲覧できない隠しファイルとして扱われています。以下設定がApacheの設定ファイルに記載されており、これによりブラウザからは閲覧できません。

<Files ~ "^\.ht">
 Order allow,deny
 Deny from all
 Satisfy All
</Files>

たとえば/var/www/html/がApacheでWeb公開されるDocumentRootだった場合、/var/www/html/.htaccessというファイルを用いてApacheの設定を変更することが出来る。これは、「AccessFileName .htaccess」という設定がApacheに行われていることと、「AllowOverride」がNone以外(具体的にはLimit)になっている時に利用できます。「AllowOverride」に関して、私は「All」に設定しています。これはLimitを含む設定です。「AllowOverride」に関する説明は以下のリンクから少し調べてみてください。

 Apacheサーバー構築法|第5回 設定を上書きする「.htaccess」

さて、今回はBasic認証のパスワードがあっているかを確認する方法が本題です。

Basic認証を行う場合は以下のような記述を設定ファイルもしくはアクセス制限を行いたいディレクトリに置いた.htaccessに行います。.htaccessにきじゅつする場合は、以下「<Directory~」や「</Directory>」の行は不要です。

<Directory "/path/to/dir">
  AuthType Basic
  AuthName "Please enter your password" ←ブラウザで認証する画面に表示されるメッセージ
  AuthUserFile /path/to/dir/.htpasswd ←パスワードファイルの場所
  Require valid-user ←パスワードファイルに記載があるユーザという意味
</Directory>

 

ここで指定するパスワードファイル(冒頭で述べましたがファイル名は自由)ですが、これを作成するために「htpasswd」コマンドを使います。

# htpasswd -c /path/to/dir/.htpasswd testuser
New password: 入力するパスワードは見えません
Re-type new password: 入力するパスワードは見えません
Adding password for user testuser
#

上記の「-c」オプションを使わないと以下のようになります。

# htpasswd /tmp/.htpasswdtest testuser
htpasswd: cannot modify file /tmp/.htpasswdtest; use '-c' to create it
#

ファイルを変更できないから「-c」をつかって作成してください って言われます。なので、「-c」を使います。もし既にパスワードファイルがある場合には「-c」は不要です。初めて作成する時にだけ「-c」を使います。

さて、作成された設定ファイルを見てみましょう。

# cat /tmp/.htpasswdtest
testuser:SB2CV8XcWfYYM

今回、パスワードとして「papapapassword」という文字を使いました。

さて、やっとたどりつきました。

パスワードを確認する方法

「あーパスワード忘れちゃったんですけど、パスワードってこれであっています?」とか「このパスワードで設定したはずなんだけど・・・」的な問題が発生した時に「パスワードは○○で正しいか」の確認を以下のコマンドで行うことが出来ます。

# openssl passwd -crypt -salt SB papapapassword
Warning: truncating password to 8 characters
SB2CV8XcWfYYM

これは、htpasswdコマンドで保存されるパスワードが「crypt()」という技法を用いて暗号化されているために、その状況を別方法で模倣すれば再現できることを意味しています。

パスワードの「SB2CV8XcWfYYM」の頭文字2文字は、パスワードを暗号化する際に利用されたランダムな文字なんですが、これを利用して上記の通りパスワードが○○であっているかの確認が出来ます。

文字数制限

ついでといっては何ですが、Basic認証の文字数制限に関して言及しておきます。

前述の通り、「htpasswdコマンドで保存されるパスワードが「crypt()」という技法を用いて暗号化されているため」、パスワード文字数が8文字に制限されます。これは仕様動作で、opensslコマンドを使ったパスワード作成時でも「Warning: truncating password to 8 characters」として8文字までしか認識されていないことがわかります。

この場合、「papapapassword」という14桁のパスワードは「papapapa」という8桁のパスワードとして認識されてしまっています。それを証明するために以下の通り再度opensslコマンドで実施してみます。

# openssl passwd -crypt -salt SB papapapassword
Warning: truncating password to 8 characters
SB2CV8XcWfYYM
# openssl passwd -crypt -salt SB papapapa
SB2CV8XcWfYYM
#

警告(warning)が出ないだけで、結果のパスワードは同じであることに気づくと思います。

8文字を超えるパスワードを設定したい場合には、「-m」オプションを利用し、「crypt()」ではなく「md5()」を用いてパスワードを暗号化するようにしましょう。

-mオプションを使ったhtpasswdでのパスワード生成

# htpasswd -c -m /tmp/.htpasswd testuser
New password:
Re-type new password:
Adding password for user testuser

作成されたファイルを見てみると、md5で暗号化されたパスワードが確認できる。

# cat /tmp/.htpasswd
testuser:$apr1$Zxa6Ixj.$cSGl8oVG/txBTQDP7u9Hn0

今回パスワードには「papapapassowrd」を設定したので、以下の方法でパスワードの確認が出来ます。

# openssl passwd -apr1 -salt Zxa6Ixj. papapapassword
$apr1$Zxa6Ixj.$cSGl8oVG/txBTQDP7u9Hn0

以上!

参考:
Verifying Apache htpasswd entries

Password Formats – Apache HTTP Server

このエントリーをはてなブックマークに追加

  2 コメント

  1. おはようございます。基本認証ですね。
    この日は障害対応しておりました。メールおくるだけですけどね。
    前日、朝6時にhttpサービスダウンを検地して復旧してくださいとメールしたけど
    返事が来たのが14時ですよ。2回もメール送りました。

    これといいieの脆弱性といいpleskの脆弱性といい29、30は大変でした。

  2. こんばんは。
    IEの脆弱性はやられましたね(^.^;
    幸いにも私はChromeユーザーですので問題なかったのですが、複数名の方からどうしたら良いの!?って問い合わせありました。
    pleskにも脆弱性があったのですか。。。脆弱性だらけですねw plesk使ってるレンタルサーバーの方々は大変でしたでしょうに。

コメント大歓迎!質問も受け付けておりますヽ(*´∀`)ノ