2017年1月19日

ブロードバンドタワー國武です。

今回は、CentOS7 に Google Authenticator をsshd に仕掛け、パスワードに加えて6桁の数字(一定時間毎に有効な数字は変わる)を入力する2要素認証を行ってみます。

なお、その確認コード(6桁の数字)を生成してくれるスマートフォン用アプリは、下記から入手可能です。 事前に、お手元のスマートフォンにインストールしておいてください。

最近は、複数の端末で利用できる Authy の方が人気でしょうか。

では、さっそくインストールしておきます。

CentOS7への関連パッケージの導入および事前準備

google authenticator をコンパイルする前に、パッケージを導入しておきます。

$ sudo yum install rpm-build autoconf automake gcc libtool pam-devel git
$ mkdir -p  ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

ソースコードの入手

github にコードが公開されているので、それを clone し、rpmパッケージを生成します。

$ git clone https://github.com/google/google-authenticator.git
$ cd google-authenticator/libpam
$ ./bootstrap.sh
$ ./configure
$ make dist
$ cp  google-autheticator-1.01.tar.gz ~/rpmbuild/SOURCES/

configure が終わった時点で、libpam/contrib/rpm.spec ファイルが生成されていますので、これを使って rpm ファイルを生成します。

$ rpmbuild -ba contrib/rpm.spec

これで rpm ファイルが生成されるので、早速インストールしておきましょう。

$ sudo rpm -Uvh ~/rpmbuild/RPMS/x86_64/google-authenticator-1.01-1.el7.centos.x86_64.rpm

なお、これでインストールされたファイルは、下記の通りとなります。

$ rpm -ql google-authenticator
/lib64/security/pam_google_authenticator.so
/usr/bin/google-authenticator
/usr/share/doc/google-authenticator/FILEFORMAT
/usr/share/doc/google-authenticator/README.md
/usr/share/doc/google-authenticator/totp.html

google-authenticator の実行

google-authenticator は、ユーザ毎に実行します。

$ google-authenticator

上記のようにコマンドを実行とすると、tokenの生成に加え、設定ファイルが出力されます。ここで生成される QRコードと token は、秘匿すべき情報となります。

google-authenticator実行例
google-authenticator実行例

このQRコードを Google authentication や Authy などのアプリに読み込ませておきましょう。なお、ここで生成されたユーザの設定ファイルは下記の通りです。

$ cat .google_authenticator
WLTBJCOAGZ2WM5DKZZXCHP6QBA
" RATE_LIMIT 3 30
" WINDOW_SIZE 17
" DISALLOW_REUSE
" TOTP_AUTH
65357794
27742539
79935780
93932809
90168591

1行目が Tokenで、下の方に6桁の数字が5行書かれていますが、これは token を登録した携帯電話が壊れたりなどして、確認コードが確認できない場合に対処するための、非常用コード(scratch codes)です。紙に書いて大切に保存しておきましょう。この5つのコードは、使うたびに設定ファイル(~/.google_authenticator) から削除され、2度とは利用できないようになっています。絶対に使わないなら、予め削除してしまっても良いかもしれません。

sshd に Google Authenticator を仕掛ける

確認コードを発行しただけでは、sshでのログイン時に確認コードを聞いてきません。次にこれを sshd の pam に設定します。そのためには、/etc/pam.d/sshdに

auth required pam_google_authenticator.so

を追加します。さらに /etc/sshd/sshd_config 内の ChallengeResponseAuthentication を yes に変更します。

ChallengeResponseAuthentication yes

sshdをrestartして、変更を反映させます(が、pam設定全般に言えることですが、設定に失敗するとログインできなくなるので、別のターミナルで root 状態にして、設定失敗のリカバリに備えておきましょう)

$ sudo systemctl restart sshd

反映した時点で、パスワード認証には2要素認証が必須となっています(逆にいうと、この設定では公開鍵認証方式でログインした場合には、確認コードは聞かれません)

$ ssh vagrant@toe
Password:
Verification code:

“Varification code:” の箇所で、スマートフォンなどで表示されている確認コードを入力します。で、ちょこっと使ってみたんですが、手でいちいちコードを入力するのはなかなか手間ですし、新規構築はともかく、既存のサーバに、全ユーザの .google_authenticator を設置していくというのは、なかなかハードルが高いかもしれませんね。

また似たようなツールで、Duoという商用ツールがあります。

Duo Unix – Two-Factor Authentication for SSH with PAM Support (pam_duo)
https://duo.com/docs/duounix

これは、商用だけあって細かなポリシー制御(例えば、Ansible/Chef用の設定アカウントでは、2要素認証をさせないなど)ができたり、登録ユーザをCSVファイルで一括登録できたりと、なかなか便利です。実施のサーバのログインのときにも、確認コードを打ち込むのではなく、登録しているスマートフォンに通知が来て、[承認]ボタンを押すだけという運用が可能です。さらには、Linux だけでなく、BSD系OSや、Solaris、HP-UX、AIXにすら対応しています。

本格運用を目指すなら、Duo も検討してみるといいかもしれませんね。

#最後はなんだか Duo の宣伝っぽくなってしまった感が……

本ブログの情報につきましては、自社の検証に基づいた結果からの情報提供であり、
品質保証を目的としたものではございません。

投稿者: Koichi KUNITAKE

XenServerやLinux周りを触ってます。IPv6はボチボチ……