Help us understand the problem. What is going on with this article?

BASIC認証をGoogle Authenticatorを用いたワンタイムパスワードに変えてみる

More than 3 years have passed since last update.

BASIC認証をGoogle Authenticatorを用いたワンタイムパスワードに変えてみる

あるサイトのセキュリティを高める為、ワンタイムパスワードを用いた認証形式に変更する。
ワンタイムパスワードの発行はスマホにインストールしたGoogle Authenticatorを使用する。

必要になるモジュール類

mod_authn_otp
Google Authenticator

インストール方法

mod_authn_otp.soの作成

○freebsd
pkg install ap24-mod_authn_otp

○RHEL、Cent系
yumのリポジトリになかったんでソースから。
https://github.com/archiecobbs/mod-authn-otp
からソースをダウンロードし、ディレクトリに入り

./autogen.sh -c
make
make install

mod_authn_otp.soの有効化

mod_authn_otp.soをapacheに読み込ませます。

httpd.conf
LoadModule authn_otp_module   modules/mod_authn_otp.so

がコメントアウトされているか、または無いのでコメントアウトを外すか
上記を追加してあげます。
(freebsdやRHELでパスが違うと思うので適時読み替えてください)

mod_authn_otp用の設定記載

今回は特定のバーチャルホストhoge用のconfを書き換えます。
httpd.confでも構いません。
BASIC認証をかけたいパスは/hogehoge/以下とします。
設定内容の説明は
https://github.com/archiecobbs/mod-authn-otp/wiki/Configuration
セキュリティポリシーに従ってOTPAuthMaxLingerを変更するくらいかな。

hoge.conf
:
省略
:

  <Location /hogehoge/>
    Satisfy any
    Require all denied
    Require ip 127.0.0.1 ***.***(複数時)

    AuthType Basic
    AuthName "OTP Authentication"
    AuthBasicProvider OTP
    Require valid-user
    OTPAuthUsersFile /var/www/otp/users
    OTPAuthMaxLinger 3600
    OTPAuthMaxOTPFailure 20
    OTPAuthPINAuthProvider file 
    OTPAuthLogoutOnIPChange On
  </Location>

設定の反映

apacheへ設定を反映する為、reloadします。

ユーザファイルの作成

http://qiita.com/kz-takahashi/items/af8ea7d9894f26a65068
から
ユーザファイルを作成してくれ、さらにGoogle Authenticator登録用のQRコードも作成してくれる
シェルを拝借しました。引数にユーザ名を与えるとQRコードのURLを表示するすぐれものです。

#!/bin/bash -e
user=${1:?Usage: $0 username}
issuer=${2:-your_company_name}
secret=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 15 | head -n 1)
secret_base16=$(python -c "import base64; print base64.b16encode('${secret}')")
secret_base32=$(python -c "import base64; print base64.b32encode('${secret}')")
otpauth_uri="otpauth://totp/${issuer}:${user}?secret=${secret_base32}&issuer=${issuer}"
otpauth_uri=$(python -c "import urllib; print urllib.quote('${otpauth_uri}')")
qrcode_url="https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=${otpauth_uri}"

file="/var/www/otp/users"
if [ ! -f "${file}" ]; then
  [ -d $(dirname "$file") ] || mkdir -p $(dirname "$file")
  touch ${file}
  chown -R apache:apache $(dirname "$file")
fi
[ -w "${file}" ] || (echo "${file}: Permission denied" && exit 1)

count=$(awk "\$2 ~ /^$user}\$/" ${file} | wc -l)
if [ $count -le 0 ]; then
  echo "HOTP/T30 $(printf '%-12s' $user) - ${secret_base16}" >> ${file}
  echo "$qrcode_url"
else
  echo "User '$user' already exists"
fi

上記で作成したファイルを先ほどのconfに記載したOTPAuthUsersFileに使用します。
(file="/var/www/otp/users"の所を編集すれば配置するところまでやってくれます。
chown -R apache:apacheの箇所も適時修正しましょう。
後ユーザファイルは600がいいと思うので、その場合もシェルを修正しましょう。)

実行した後、標準出力されたQRコードのURLをメモしておきましょう。

Google Authenticatorをスマホにインストール

インストールし、先ほど取得したQRコードを読みこませるとワンタイムパスワードが発行されます。
これを使用するとBASIC認証が通るようになります。

ワンタイムパスワードの他に独自のPINを入れたい場合

先ほどのユーザファイルの中身を編集する事で実現できます。

HOTP/T30 hogeuser01      -  999999999999999999999999

となっていると思いますが

HOTP/T30 hogeuser01      hogepin111  999999999999999999999999

とすると

googleで発行したワンタイムパスワードの前に「hogepin111」をプラスして打つ必要があります。
少し不安な方はこれを入れても良いかもしれません。
その場合も上記シェルを修正することで実現できます。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした