Sambaのパスワードデータベースを利用してApacheのBASIC認証を行う

Apache HTTP Server

SambaとApacheのBASIC認証との間でID/パスワードを共有するというのは、SMBとWebDAVの両方でファイルサーバにアクセス出来るようにしたい場合によくありそうな要求でありながら実は厄介だ。認証のバックエンドとしてLDAPを使えば出来そうではあるが、どんなバックエンドを使うにせよSambaパスワードは通常のパスワードとは別のフィールドに格納されるため同期に気配りをする必要があるし、なにより目的の単純さの割に LDAPはオーバースペックである。

ここで発想を転換する。Apache側から Sambaのパスワードデータベース(smbpasswdコマンドで管理できる /var/lib/samba/private/passdb.tdb というファイル)を直接利用して BASIC認証をできるようにすればLDAPを導入せずシンプルに問題を解決できる。Googleで検索した限りでは、この「発想の転換」はどうやら今までに行われたことが無いようだ。

ここでは mod_authnz_externalモジュールを使って、ApacheのBASIC認証にSambaのパスワードデータベースファイルを使う方法を示す。

必要な外部プログラムのコンパイルとインストール

Sambaのパスワードデータベースファイルは root権限でしかアクセス出来ないようになっているため、Apacheから利用するには setuidされた外部プログラムを呼び出す必要がある。mod_authnz_externalモジュールはそれを実現する Apacheモジュールである。

mod_authnz_externalモジュールから呼び出すことによって SambaのパスワードデータベースでBASIC認証を行うための外部プログラムを開発したので自由に使って欲しい。下記に示すふたつのC++ソースをダウンロードし、それぞれコンパイル・インストールする。

smbauth.cpp

http://gist.github.com/423724#file_smbauth.cpp

下記のコマンドでソースをコンパイルする

PRIVATE_DIR=`testparm  -s --parameter-name="private dir"`
g++ smbauth.cpp -DPRIVATE_DIR=\"$PRIVATE_DIR\" -lssl -lext2fs -o smbauth

実行ファイル smbauth が作成されるので、root権限で下記のようにして setuidして /usr/sbin あたりにインストールする

chmod 711 smbauth
chmod u+s smbauth
mv smbauth /usr/sbin/

unixgroup.cpp

http://gist.github.com/423724#file_unixuser.cpp

下記のコマンドでソースをコンパイルする

g++ unixgroup.cpp -o unixgroup

実行ファイル unixgroup が作成されるので、/usr/sbin あたりにインストールする。このプログラムについてはsetuidは必要ない

mv unixgroup /usr/sbin/

なお上記のソースコードは一切無保証である。

mod_authnz_externalの導入

下記は Gentoo Linuxでの導入例なので、他のディストリビューションではそれぞれのパッケージ管理システムを利用して導入されたい。なお mod_authnz_externalモジュールはバージョン 3.2より設定に必要なディレクティブの行数が減っているため、ここではそれを採用している。

emerge '>=www-apache/mod_authnz_external-3.2'

(マスクされている場合は /etc/portage/package.keywordsファイルを使ってアンマスクすること)

/etc/conf.d/apache2 のAPACHE2_OPTS=行に下記の -D AUTHNZ_EXTERNAL を追加することで mod_authnz_externalが有効になる。

認証の設定をする

BASIC認証を設定するために Apacheの設定ファイルを変更する。

Sambaのパスワードデータベースを使ってBASIC認証を行いたいバーチャルホスト設定に、下記の2行を追記する。この設定はバーチャルホストごとに固有なので注意すること。

DefineExternalAuth smbauth pipe /usr/sbin/smbauth
DefineExternalGroup unixgroup pipe /usr/sbin/unixgroup

BASIC認証をかけたいディレクトリまたはロケーションに、下記を追加する。設定で許可されているのであれば、認証をかけたいディレクトリの.htaccessファイルにに書いても良い。

AuthType Basic
AuthName 任意の名前
AuthBasicProvider external
AuthExternal smbauth
GroupExternal unixgroup

上記に加えて、行いたい認証の形態に応じて下記のいずれかの記述をする。

ID/パスワードが合っていればどのユーザーでもアクセス出来るようにしたい場合

Require valid-user

特定のユーザーのみアクセス出来るようにしたい場合

Require user ユーザー1 ユーザー2 ...

所定のグループに所属しているユーザーのみアクセス出来るようにしたい場合

Require group グループ1 グループ2 ...

グループはUNIXのグループである。sambaのパスワードデータベースに存在するユーザーと同じ名前のUNIXユーザーが存在しており、そのユーザーが指定されたUNIXグループのいずれかに所属しているかどうかがチェックされる。

同じカテゴリの記事

静的コンテンツとAPIそれぞれへのHTTPリクエストを Apacheと Javaアプリケーションサーバに振り分ける簡単な設定 2014年1月21日
mod_extract_forwardedと多段 Proxy 2013年10月15日
DebianのApache2.2で DocumentRootにWebDAVアクセスするための最短手順 2010年8月6日
ApacheとWebDAVとPHP 2010年1月17日

お勧めカテゴリ

英語でアニメ観ようず
なじみ深い日本製アニメの英語版DVDで、字幕と音声から英語を学びましょうという趣旨のシリーズ記事です。
ScalaのようでJavaだけど少しScalaなJSON API
Scalaと Spring Frameworkを使って REST的なJSON APIを実装してみましょう。
ドクジリアン柔術少女 すから☆ぱいそん
代表 嶋田大貴のブログです。写真は神仏に見せ金をはたらく罰当たりの図