BLOGTIMES
2013/05/13

ベーシック認証のパスワードを Google 認証システムのワンタイムパスワードにする

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

先日、libpam-google-authenticator をインストールして Linux のログインに Google 認証システムが使えるようになったので、PAM をうまく経由すればウェブサーバのベーシック認証のパスワードをGoogle 認証システムワンタイムパスワードで代替できるんじゃないかと思ってちょっと挑戦してみることにしました。

最初に結論を書いておきますが、できるにはできたんですが自分が思い描いていたとおりにはならなかったので、残念ながらこの方法では実用にはなりません。それでも構築方法が見たいという場合には続きからどうぞ。

mod-auth-external をインストールする

Apache 単体では PAM などの外部の認証システムを使うことができないので、今回は mod-auth-external というモジュールを Apache 側に仕込みます。このモジュールは外部の認証用のプログラム(コマンド)を呼び出し、入力された ID やパスワードを渡します。ログインの可否の判定はプログラムのその終了ステータスによって判定されることになります。

今回は Apache が 2.0.x だったので mod_auth_external-2.2.11.tar.gz を使いました。
インストール作業としてはこんな感じです。

wget https://mod-auth-external.googlecode.com/files/mod_auth_external-2.2.11.tar.gz tar zxvf mod_auth_external-2.2.11.tar.gz cd mod_auth_external-2.2.11 apxs -c mod_auth_external.c paco -D apxs -i -a mod_auth_external.la

インストールが完了すると httpd.conf には、下記のような行が挿入されているはずです。

LoadModule auth_external_module modules/mod_auth_external.so

その部分の直後に下記の2行を挿入しておきます。
※まだ /usr/local/libexec/pwauth は存在しませんが、次のステップでインストールするので気にしなくて大丈夫です。

AddExternalAuth pwauth /usr/local/libexec/pwauth SetExternalAuthMethod pwauth pipe

完了したら httpd を再起動しておきます。

pwauth のインストール

mod-auth-external は httpd が外部の認証プログラムを呼び出し可能にしてくれるだけなので、認証プログラムは別途インストールする必要があります。今回は pwauth という PAM を利用した認証ができる簡単なプログラムをインストールしてみました。

wget https://pwauth.googlecode.com/files/pwauth-2.3.10.tar.gz tar zxvf pwauth-2.3.10.tar.gz cd pwauth-2.3.10 vi config.h # 編集箇所は下記の diff 参照 vi Makefile # 編集箇所は下記の diff 参照 make paco -D cp pwauth /usr/local/libexec/ chmod u+s /usr/local/libexec/pwauth

config.h, Makefile は環境に合わせて編集する必要があります。
RHEL ( CentOS ) の場合には下記のような感じになります。

diff -u config.h.org config.h

--- config.h.org 2011-10-05 22:01:12.000000000 +0900 +++ config.h 2013-05-13 00:27:29.000000000 +0900 @@ -123,7 +123,7 @@ /* #define SHADOW_NONE /**/ /* #define SHADOW_BSD /* FreeBSD, NetBSD, OpenBSD, BSDI, OS X */ -#define SHADOW_SUN /* Linux, Solaris, IRIX */ +/* #define SHADOW_SUN /* Linux, Solaris, IRIX */ /* #define SHADOW_JFH /**/ /* #define SHADOW_MDW /**/ /* #define SHADOW_AIX /* AIX (see also AUTHENTICATE_AIX) */ @@ -131,7 +131,7 @@ /* HIGH-LEVEL OPTIONS */ -/* #define PAM /* Linux PAM or OpenPAM */ +#define PAM /* Linux PAM or OpenPAM */ /* #define PAM_OLD_OS_X /* PAM on OS X version 10.5 or older */ /* #define PAM_SOLARIS /* PAM on Solaris other than 2.6 */ /* #define PAM_SOLARIS_26 /* PAM on Solaris 2.6 */ @@ -278,7 +278,7 @@ * to change the uid list. */ -#define SERVER_UIDS 30 /* user "wwwrun" on the author's system */ +#define SERVER_UIDS 48 /* user "apache" on the author's system */ /* If MIN_UNIX_UID is defined to an integer, logins with uid numbers less than

diff -u Makefile.org Makefile

--- Makefile.org 2011-10-05 22:45:04.000000000 +0900 +++ Makefile 2013-05-13 00:28:24.000000000 +0900 @@ -7,11 +7,11 @@ # Settings for author's system (Redhat 6.1) CC=gcc -LIB= -lcrypt +#LIB= -lcrypt LOCALFLAGS= -g # For PAM on Redhat Linux -# LIB=-lpam -ldl +LIB=-lpam -ldl # For PAM on Solaris or OS X # LIB=-lpam

PAM 用のファイルの準備

これで必要なものがインストールできたので、PAM の設定を変更します。
pwauth を実行したときに読み込まれる PAM の設定は /etc/pam.d/pwauth なので、下記の内容のテキストファイルを作成します。

/etc/pam.d/pwauth

#%PAM-1.0 auth required pam_google_authenticator.so account include system-auth session include system-auth

ここでちゃんと pwauth が動くかどうかテストしておきます。下記のように /usr/local/libexec/pwauth を起動し、「ユーザー名」「改行」「Google認証システムのワンタイムパスワード」「改行」の順に入力します。その後、ステータスコードを表示させたときに 0 が表示されれば、認証は成功です。pwauth がどのようなステータスコードを返すのかについては StatusCodes に一覧があるので、デバッグ時に役立つと思います。

$ /usr/local/libexec/pwauth hsur 382061 $ echo $? 0

httpd にベーシック認証を設定する

最後に httpd の設定を変更して pwauth を使ったベーシック認証を有効にします。
今日は .htaccess を使ってみました。

.htaccess

AuthType Basic AuthName "GAtest" AuthExternal pwauth require valid-user

ブラウザから .htaccess を置いたディレクトリを表示させたときにベーシック認証のダイアログが出れば完了です。
ID には OS のユーザー名、パスワードには Google 認証システムの 6 桁の数字を入れれば認証できるはずです。

この方法には致命的な欠陥が・・・・

ただ、この方法には致命的な欠点があります
ベーシック認証にはセッションという考え方がないので、ページを表示させるごとにワンタイムパスワードの入力が必要になります。
これだとページを開く度にダイアログにワンタイムパスワードを入力する必要があるので、ちょっと面倒すぎますね。
というわけで単純に PAM 経由で呼び出すだけではダメでした。。。。。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/5797
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン