CentOS 7でGoogle Authenticatorによるワンタイムパスワードを用いたsshログイン時の二要素(三要素)認証

家のサーバにて、テストとしてsshログイン時の二要素認証の設定をしたのでその備忘。
sshログイン時の二要素認証だと、Googleの提供している『Google Authenticator』を用いての設定が多いので、今回はそれで設定する。

なお、インストール先のOSはCentOS 7を用い、すでに鍵認証でのログイン設定は行われているものとする。

1.Google Authenticatorのインストール

まずは、以下のコマンドで『Google Authenticator』をインストールする上で前提となるパッケージを導入してやる。

sudo yum -y groupinstall "Development Tools"
sudo yum -y install pam-devel

次に、gitから『Google Authenticator』をダウンロード、コンパイルする。
(2017/01/21 URLが変わってるようなので変更)

cd /opt
git clone https://github.com/google/google-authenticator-libpam.git
cd google-authenticator-libpam
./bootstrap.sh
./configure
make && make install

これで、『Google Authenticator』のインストールが完了した。

2.sshdの設定変更

次に、sshで『Google Authenticator』での認証が行えるよう、設定を書き換えてやる。
まず、以下のコマンドを実行してビルドされたPAMモジュールを所定の位置にコピーする。

cd
cp /usr/local/lib/security/pam_google_authenticator.so /usr/lib64/security/

sshdの設定ファイル「/etc/ssh/sshd_config」を編集する。

sed -i -e '/^ChallengeResponseAuthentication/s/no/yes/g' /etc/ssh/sshd_config
echo "AuthenticationMethods publickey,keyboard-interactive" >> /etc/ssh/sshd_config

次に、Google Authenticatorで用いるPAMの設定ファイル「/etc/pam.d/google-auth」を作成する。

cat <<EOF > /etc/pam.d/google-auth
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_google_authenticator.so try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
EOF

作成後、sshdのPAM設定ファイルである「/etc/pam.d/sshd」に『Google Authenticator』のモジュールを読み込ませる設定を追記する。
この際、パスワード認証を今後させないのであれば「password-auth」の記述をコメントアウトするとよいだろう。
(※このとき、パスワード認証を有効にしておくと鍵認証+パスワード認証+ワンタイムパスワード認証の三要素認証の設定になる)

echo "auth       substack     google-auth" >> /etc/pam.d/sshd
sed -i.bk '/^auth.*password-auth/s/^/# /g' /etc/pam.d/sshd # 「password-auth」の記述をコメントアウトする場合

これで、sshdとそのpamまわりの設定が完了した。

3.Google Authenticatorの設定・準備

次に、『Google Authenticator』でsshログインするユーザでの設定を行う。
まず、事前にiPhoneやAndroidで『Google Authenticator』のアプリケーションをインストールしておく。

その後、以下のコマンドを『Google Authenticator』でsshログインするユーザで実行し、すべて「y」を選択していくだけだ。
※この際、最初に表示されるQRコードを『Google Authenticator』のアプリで読み取り、アカウントを登録してやる。

google-authenticator

4.sshでログインする

さて、Google Authenticatorの設定ができたら、あとは実際にsshコマンドでログインするだけだ。
と言っても特別なことは必要ではなく、sshコマンドで普通に鍵認証orパスワードでログインを行うとワンタイムパスワードを求められるので、そこでアプリに表示されている数字6桁を入力してやるだけだ。

これでログインができた。
なお、手元のTeratermから直接ログインできるものかやってみたが、普通にやった限りはログインできず、sshの踏み台となるサーバが必要になった。
鍵認証+チャレンジレスポンスが必要となるから、というのがあるかもしれない。

マクロと組み合わせればもしかしたら…と思うが、未検証。