タイトルそのままである。
たぶんGoogle様あたりが始めたのだと思うけど、何かの認証の際にスマートフォンをトークンキーとして使う仕組みはとても便利である。

二要素認証、つまりパスワード/パスフレーズに加えトークンキーも必須にすることで、セキュリティは段違いに向上する。
しかし、ちょっと前までトークンキーと言えばRSAのハードウェアで、手軽に使えるとは言えない代物だった。
それがスマートフォンで出来るんだから問答無用で便利なんである。

そんなgoogleの2段階認証を、自分のサーバのログインにも使えると聞いて驚愕して試して感動したので下記に顛末を記す。

なお、FreeBSDで試しているが、Linuxでも大丈夫。Mintでの結果を末尾に追記。

事前準備(スマートフォン側)

Android、あるいはiOSにgoogle authenticatorをインストールし、2段階認証プロセスの準備をしておく。

2段階認証プロセスについて
https://support.google.com/accounts/answer/180744?hl=ja

事前準備(サーバ側)

googleの2段階認証プロセス用のソフトウェアをインストールする。

graphics/libqrencode
security/pam_google_authenticator

以上二つ。
けっこう依存がありそうなのでpkgでインストールした方がよいかも。

2段階認証の設定…の前に。

さて今度はスマートフォンとサーバの括り付けを行う段。
なお、以下の作業はマシンの目の前で行うこと。
認証の設定を変えるわけだから、遠隔で作業して失敗した日にはログインできなくなって詰む。

2段階認証の設定

google-authenticatorを実行する。
あらかじめ書いておくと、実行したらいきなり画面いっぱいにQRコードが表示される。
その巨大さに動揺しないで、手元のスマートフォンでgoogle authenticatorを起動し、QRコードを読み取ること。

QRコードではなく手入力でももちろん出来るけれど、QRコードの方がはるかに楽。

また、初回起動時にはいろいろと質問される。
以下に私訳も併記する。

$ google-authenticator

Do you want authentication tokens to be time-based (y/n) y
(俺訳: 認証トークンを時間ベースにしますか?他にはカウンタベースがあります。)

このあと、どーんと以下のようなQRコードが。

img

QRコードを、以下はiOSでの例だが、右上のペンをクリックしてから読み取ると、以下のようにコードが追加される。

img

Your new secret key is: xxxxxxxxxxxx
Your verification code is xxxx
Your emergency scratch codes are:
xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx
xxxxxxxx

スマートフォンで読み取ったら、続いて細かな設定。
質問に答えるだけでよい。

google-authenticatorの設定

私訳を併記。
私の場合、有効時間を延ばすかどうかにだけNoと答えた。
なお、以下の最初の質問でyと答えて初めて先ほどのキーがサーバに登録される = ~/.google_authenticatorに登録される。
nと答えてしまったら、QRコード読み取りからやり直し。

Do you want me to update your "/home/vanilla/.google_authenticator" file (y/n) y
(俺訳: google認証の設定を更新しますか?)

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y
(俺訳: トークンを同時に使えるユーザの数を制限しますか?
「あなた」も30秒に1回しかログインできなくなりますが、攻撃に
気づいたり、防ぐことが出来るようになるでしょう。)

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n
(俺訳: デフォルトではトークンの有効時間は30秒ですが、サーバとクライアントの
時刻ずれを考慮して、さらにその前後30秒の猶予を設けています。
時刻ずれがひどいようであれば4分まで延長することができます。
そうしますか?)

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y
(俺訳: もしあなたのコンピュータが、ログインのブルートフォース攻撃に対して
十分な防御が出来ないなら、時間当たりのログイン試行数を制限できます。
デフォルトでは30秒につき3回までしかログイン試行できません。
制限を有効にしますか?)

終わると~/.google-authenticatorというファイルができるはず。
パーミッションは400。まあ当然ですな。

sshdで二段階認証を有効にする

/etc/pam.d/sshdの一番下に以下の行を追加する。
一番下だと、認証の際にパスワードを訊かれてからトークンキーの入力。
一番上にすると、トークンキーが先になる。

auth    required    /usr/local/lib/pam_google_authenticator.so

sshdを再起動。
これ以降、sshログインで2段階認証が有効になるので注意。
くれぐれもマシンの目の前ですること。

$ sudo service sshd restart
Performing sanity check on sshd configuration.
Stopping sshd.
Performing sanity check on sshd configuration.
Starting sshd.
$

2段階認証を試してみよう

さっそく試してみると、パスワード認証のあとにトークンの入力を求められるようになった。
ああ…。なんだろうこの守られてる感。素敵だ。

login as: vanilla
Using keyboard-interactive authentication.
Password for vanilla@fireelement:
Using keyboard-interactive authentication.
Verification code:

LinuxでもOK

結局のところ、googleの2段階認証は、pamモジュールとして公開されているので、Linuxでだって動く。

以下はlinux mint 15 Oliviaで試した結果。

authenticatorのインストール

libpam-google-authenticatorをインストールする。ソフトウェアマネジャーでもapt-getでも。
設定方法は上で述べたものと変わりないので割愛。

sshdの設定変更

Linux Mintではsshdの設定に変更が必要だった。
/etc/ssh/sshd_configでChallengeResponseAuthenticationをyesにする。

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes

認証方法の変更

これもFreeBSDと同じ。/etc/pam.d/sshdを修正する。

auth       required     pam_google_authenticator.so

sshdの再起動

Linux mintではsshdではなくsshなんだなあ。

sudo service ssh restart