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

#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
からソースをダウンロードし、ディレクトリに入り

```lang:
./autogen.sh -c
make
make install
```


##mod_authn_otp.soの有効化
mod_authn_otp.soをapacheに読み込ませます。

```lang: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を変更するくらいかな。


```lang: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を表示するすぐれものです。

```lang:
#!/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を入れたい場合
先ほどのユーザファイルの中身を編集する事で実現できます。

```lang:
HOTP/T30 hogeuser01      -  999999999999999999999999
```
となっていると思いますが

```lang:
HOTP/T30 hogeuser01      hogepin111  999999999999999999999999
```
とすると

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