KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

Apache 2.4 + MariaDB 5.5 でmod_dbd を使ったDigest認証の設定をしてみた。

使いどころがあるのか謎だけど、Apacheの認証系でもDB連携あるぞというのをたまたまみかけたので、やってみた。

環境

必要なパッケージのインストール

DBドライバーのインストール。今回は、MariaDBで試すので、apr-util-mysqlをインストール。

Daigest認証用のDB.TABLE作成、ユーザーデータ登録

まずDBとテーブルを作る

DB名:apacheauth (任意)
TABLE名:digest_auth_users (任意)

CREATE DATABASE apacheauth;

CREATE TABLE digest_auth_users (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    user VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    realm VARCHAR(255) DEFAULT 'AuthRequirePage'
);

** realmは後にApacheの設定でAuthNameで指定する文字列。

Apacheからデータを参照するためのDB接続ユーザーを作成する

基本的には参照権限だけあれば十分。プログラムで動的に変更するなど操作を同じユーザーでさせるならば、UPDATEやDELETEも権限を与えてあげる。

GRANT SELECT ON apacheauth.* TO 'apache'@'localhost' identified by 'apache';
テスト用のユーザーデータを入れる

セキュアじゃないけど今回はDB上には平文のパスワードを保持させることにした。

INSERT INTO digest_auth_users ( user, password ) VALUES ( "test", "test" );
id user password realm
1 test test AuthRequirePage

Apacheの設定

conf/httpd.conf(またはconf.d/<任意の名称>.conf)または、VirtualHostディレクティブ内 に以下の記述を行う。

DBD~の部分は、Directoryディレクティブの中には書けないので注意。
参照 --> mod_dbd - Apache HTTP Server Version 2.4

DBDriver mysql
DBDParams "host=localhost,dbname=apacheauth,user=apache,pass=apache"
DBDMin 2
DBDKeep 2
DBDMax 10
DBDExptime 300

<Directory "/var/www/auth_html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require valid-user
    AuthType Digest
    AuthDigestAlgorithm MD5
    AuthName "AuthRequirePage"
    AuthDigestProvider dbd
    AuthDBDUserRealmQuery "SELECT MD5(CONCAT(user, ':', realm, ':', password)) AS password FROM digest_auth_users WHERE user = %s AND realm = %s"
</Directory>

今回はDBには平文でパスワードを保存したので、AuthDBDUserRealmQueryの部分でDB問合せ時に、Apachemod_auth_digestが求める形のパスワード形式(user:realm:passwordMD5ハッシュした32文字列)
参照 --> Password Formats - Apache HTTP Server Version 2.4

%sには、前から順に入力されたuser名AuthNameの値が入る。

一応SQLの部分だけ抜き出しておくとこんな感じ。

SELECT
  MD5(
   CONCAT(user, ':', realm, ':', password)
  ) AS password
FROM digest_auth_users
WHERE user = %s AND realm = %s

%sに入る値は、mod_dbdでうまいことSQLインジェクション対策として不正な文字列はエスケープしてくれるらしい。
参照 --> mod_dbd - Apache HTTP Server Version 2.4

完了!

あとはApacheの再起動をして設定を反映させればよい。

アルファベット文字列をフォネティックコードで表記するPythonモジュールをつくったよ:a2pcej

アカウントの追加業務とかで、パスワードをこちらで適当に生成してお知らせるときに、パスワード文字列のよみがなをつけて渡すということが、しばしばあるわけです。

たとえば、こんなやつ。

ユーザー名: hogehoge
パスワード: WPzm60zh (ダブリュー(大文字)・ピー(大文字)・ゼット・エム・ロク・ゼロ・ゼット・エイチ)

大した数じゃなければ手打ちするのもいいんですが、一気にどかっと発行するとかなると手打ちするは厄介です。自動でやってしまいたいところです。

Google先生に尋ねると、

といったのが出てきます。パスワードの生成からやってしまってよければ、フリガナつきパスワード生成ツール - Password Generator は、大量生産できるのでよさ気ですが...

パスワードのよみがなの区切り文字や、大文字につける表記が自分のところで使っているフォーマットと合わなかった...

ということで、実はずい分前に手元で使える用には、ざっくりpythonスクリプトで作ってありました

今回これを大改造して、

  • 区切り文字を指定できる
  • 大文字につける印を指定できる
  • カタカナ表記だけではなく、英語圏用(?)にフォネティックコード表記できる

というものを作ってみました。いろんなところで使いまわしやすいように、PyPIに上げて、pipでインストールできるようにしました。 謎のネーミングセンスにより、a2pcejという名称にしました。一応、convert Alphabet to Phonetic Code in English and Japaneseの略。

使い方

以下Python3.5環境での出力例です。関数の戻り値はunicode文字列になっています。

兎にも角にもモジュールをインポート。
>>> from a2pcej import *
アルファベットの文字列にカタカナでよみがなをつける。 :conv_ak()
>>> conv_ak('examples')
'イー・エクス・エイ・エム・ピー・エル・イー・エス'

アルファベット大文字にはデフォルトで「(大文字)」と付く。
アルファベット以外(記号や数字)はデフォルトだとよみがな変換されない(その文字がそのままま出る)。

>>> conv_ak('Examples002')
'イー(大文字)・エクス・エイ・エム・ピー・エル・イー・エス・0・0・2'

区切り文字を変更するには、delimiter='文字列'を引数に追加する。
アルファベット大文字につく文字列の変更をするには、 sign='文字列'を引数に追加する。
空にすれば、区切りなし、大文字表記なしになる。

>>> conv_ak('Examples003', delimiter='/', sign='(大)')
'イー(大)/エクス/エイ/エム/ピー/エル/イー/エス/0/0/3'

>>> conv_ak('Examples003', delimiter='', sign='')
'イーエクスエイエムピーエルイーエス00'

数字にもよみがなを付けたいときは、num=Trueを引数に加える。

>>> conv_ak('Examples004', num=True)
'イー(大文字)・エクス・エイ・エム・ピー・エル・イー・エス・ゼロ・ゼロ・ヨン'
アルファベットの文字列に英単語のフォネティックコードをつける。 :conv_al()

オプションは、 conv_ak()と同じなので、出力例だけ。 区切り文字、大文字につく文字列のデフォルトを英語圏っぽいのにしてある。

>>> conv_al('examples')
'Echo-Xray-Alfa-Mike-Papa-Lima-Echo-Sierra'

>>> conv_al('Examples002')
'Echo(CAPS)-Xray-Alfa-Mike-Papa-Lima-Echo-Sierra-0-0-2'

>>> conv_al('Examples003', delimiter=', ', sign='(CAPITAL)')
'Echo(CAPITAL), Xray, Alfa, Mike, Papa, Lima, Echo, Sierra, 0, 0, 3,'

>>> conv_al('Examples004', num=True)
'Echo(CAPS)-Xray-Alfa-Mike-Papa-Lima-Echo-Sierra-zero-zero-four'

ソース

github.com

PyPI

pypi.python.org


雑感

python2での文字コードのこととか、パッケージングする方法とか、pandocってなんか便利なツールがあるとか、いろいろお勉強になりましたです。久しぶりに英文も書いたらスペルミスと謎の構文の嵐です。

Windowsのhostsファイルに記述できるエイリアス数の罠

ローカルの開発環境やら、別サーバーに環境を移すときやらに、お世話になるhostsファイル。

Windows 7以降だと、C:\WINDOWS\system32\drivers\etc\hostsを管理者モードで実行したメモ帳で編集してあげれば良いのですが、ちょっとした罠がありました。

127.0.0.1 exsample.com sub1.exsample.com sub2.exsample.com sub3.exsample.com sub4.exsample.com sub5.exsample.com sub6.exsample.com sub7.exsample.com sub8.exsample.com sub9.exsample.com sub10.exsample.com

という具合に、複数のホスト名を書くと、exsample.comとsub1~sub8まではうまくいきますが、sub9、sub10はうまく名前解決してくれません。

Microsofftの公式ドキュメントでも説明されていました。

原因

Windows XP/Windows  Server 2003 以降の OS では、HOSTS ファイルの 1 行に記載できる別名 (エイリアス) の数は、ホスト名 1 つにつき 8 個までとなっています。

また、この制限はソース コード上でハード コードされているため、変更することはできません。

解決方法

1 つの IP アドレスに対して、別名を 9 個以上記載したい場合には、複数行に分けて記載して下さい。

https://support.microsoft.com/ja-jp/kb/2717022

Windows10 でも同様の現象となるようで、特に更新されていないようです。

Windowsでchecksumを調べる---FCIVを利用してみた

「ファイル チェックサム整合性検証 (FCIV) ユーティリティ」を使ってみました。 特に深い理由はありません。GIMPさんをインストールするときに徐に、ダウンロードファイルのMD5チェックサムでも一応確認しようかとふと思い立っただけです。

FCIVですが、

FCIV ユーティリティは、Microsoft Windows 2000Windows XP、および Windows Server 2003 上で実行されます。
https://support.microsoft.com/ja-jp/kb/841290

なんてあって、ドキュメントの最終更新が2011/09/10のようなので、古くからあるツールの模様。

手元のWindows10では、公式ドキュメントのインストールの項目どおりに作業すれば問題なく動きました。コマンドプロンプトからでももちろんPowrShellからでも問題ないようです。

チェックサムを計算
PS C:\Users\Kastuay\Downloads> fciv.exe .\gimp-2.8.16-setup-4.exe
//
// File Checksum Integrity Verifier version 2.05.
//
3dbad964d5fe1d2a065bc9cbea0ee1a0 .\gimp-2.8.16-setup-4.exe

md5ないし、sha1でのハッシュ値を計算できるようで、特定のディレクトリ下を再帰的に確認して、xmlで出力するなんてこともできるんだとか。

ディレクトリ下の各ファイルのチェックサムを計算して、xml形式ファイルに出力
PS C:\Users\Katsuya\Downloads> fciv.exe -r .\sumtest\ -xml sumtest.xml
//
// File Checksum Integrity Verifier version 2.05.
//
Start Time: 06/11/2016 at 12h40'36''

Error loading XML document.
Create New XML database

End Time..: 06/11/2016 at 12h40'37''


        Processed 1 directories
        Processed 2 files
Errors have been reported to fciv.err
出力したXMLファイルの内容からチェックサム結果を表示
PS C:\Users\Katsuya\Downloads> fciv.exe -list -xml .\sumtest.xml
//
// File Checksum Integrity Verifier version 2.05.
//
Listing entries in database:
----------------------------

                MD5                             Filename
-------------------------------------------------------------------------
acc0db27eed709ecb25e5369fb8cfd87 .\sumtest\FileZilla_3.13.1_win64.zip
3dbad964d5fe1d2a065bc9cbea0ee1a0 .\sumtest\gimp-2.8.16-setup-4.exe
チェックサムと一致するか確認する。
PS C:\Users\Katsuya\Downloads> fciv.exe -v -xml .\sumtest.xml
一致
PS C:\Users\Katsuya\Downloads> fciv.exe -v -xml .\sumtest.xml
//
// File Checksum Integrity Verifier version 2.05.
//
Could not create the registry key.
Starting checksums verification : 06/11/2016 at 12h54'37

All files verified successfully

End Verification : 06/11/2016 at 12h54'37
不一致

一方のZIPファイルの中身をちょっといじってみた。

PS C:\Users\Katsuya\Downloads> fciv.exe -v -xml .\sumtest.xml
//
// File Checksum Integrity Verifier version 2.05.
//
Could not create the registry key.
Starting checksums verification : 06/11/2016 at 12h55'58

List of modified files:
-----------------------
.\sumtest\FileZilla_3.13.1_win64.zip
        Hash is         : acc0db27eed709ecb25e5369fb8cfd87
        It should be    : ea4684909453db52c7d4fa3105bdcd8e

End Verification : 06/11/2016 at 12h55'58
XMLの中身

チェックサムの結果は、Base64エンコードされて格納される仕様だそうだ。なのでXMLを直接ただ見ただけだとチェックサムの値はわからない。

Base64デコードするか、FCIVの-listオプションを使ってプロンプト上で見る必要がある模様。 f:id:kacchan822:20160611125121p:plain


ユーティリティ説明資料

Windows10の環境変数を設定する画面が親切になっていた。

Windowsを使っていてほとんど触る機会はないけど、ちょっとマニアックな何かをインストールしてみたりするときとかに、必要になる環境変数の操作。変にいじってしまったら大事件が起きるんじゃないか感が強いわりに、UIが結構使いにくくて、間違わないかいじるたびに冷や冷やしていた覚えがあった。

Win32 OpenSSHを、快適に使おうと久々に環境変数の画面を開いたら、劇的に変わっていてびっくり。

ここは今まで通り。

f:id:kacchan822:20160607211109p:plain

ここもほぼ今まで通り?

f:id:kacchan822:20160607211401p:plain

ここが素晴らしい

いままで、自分でセミコロンで区切って値を入れていたわけですが、値が一行ごとに分かれています。 f:id:kacchan822:20160607211059p:plain

自作マシンとかでSSD&HDD構成にしたときに、SSDの寿命を慮ってTEMPファイルの書き出し先をシステムドライブにしたSSDじゃなくてHDDにするとかでよく使った、TEMPの値変更の部分に至っては、よくあるファイルを選択する画面のUIになっていて、変なパスを指定してしまう事件が起こりづらくなっています。 f:id:kacchan822:20160607212633p:plain


ちょっと感動して、記録がてら書いてからググったら先人がいました。変更点もまとまってます。ほほー。 hiiragi.hateblo.jp