Google Authenticatorを使ったSSHのワンタイムパスワード認証の設定(CentOS 7)
SSHへの接続は秘密鍵・公開鍵認証を設定して行うのが基本ですが、万が一秘密鍵が盗まれてしまうと、パスフレーズでしか守られていない秘密鍵では総当たり攻撃で第三者が不正にサーバーに接続できてしまうことになります。
この問題に対応するために、SSHサーバーに2要素認証を設定し、秘密鍵・公開鍵暗号ともう1つの認証方法を組み合わせて安全性を高めることにします。もう1つの認証方法には、OAuthに対応した「Google Authenticator」を使ったワンタイムパスワード(OTP)認証を組み合わせてみます。
Google AuthenticatorはiOS版、Android版のOTP生成用アプリケーションが用意されているので、手軽に使うことができます。
また、Google Authenticatorはオープンソースとして公開されており、Linuxの認証機構であるPAMに対応しているので、比較的簡単にLinux+SSHサーバーで利用できます。
基本的な設定についてはsowawa氏のブログに記載されています。
http://engineering.webpay.co.jp/2014/08/27/ssh-two-factor-authentication/
http://engineering.webpay.co.jp/2014/09/10/ssh-one-time-password/
しかし、半年ほど経過する間にソースコードがGoogle CodeのサイトからGitHubに移動するなど、そのままでは動作しない点がいくつかあるので、2015年3月15日(日)時点での差分を挙げておきます。
・検証した環境
SSHサーバー(sshd)のバージョンが6.4以上である必要があるので、CentOS 7を使っています。
ソースコードからのビルドが必要なので、Software Development Workstationを選択し、開発ツールグループのチェックボックスをチェックしてインストールを行っています。
このあたり、細かいインストール条件は詰めていないので、ある程度自力で環境構築して、ソースコードのビルド作業が行えることを想定しています。
・ソースコードの在処
GitHubに移動しています。
https://github.com/google/google-authenticator/
git cloneするには、以下のコマンドを実行します。
# git clone https://github.com/google/google-authenticator.git
・pam-develパッケージのインストール
ビルドするにはpam-develパッケージもあらかじめインストールしておく必要があります。
# yum install pam-devel
・ソースコードのビルド
以下のコマンドでビルドできます。
# cd ~/google-authenticator/libpam
# ./bootstrap.sh
# ./configure
# make
# make install
前記pam-develパッケージがインストールされていないと、configureの段階でエラーになります。
・ビルドされたPAMモジュールのコピー
ビルドで生成されたPAMモジュールは/usr/local/lib/securityディレクトリに入ります。これを/usr/lib64/securityディレクトリにコピーする必要があります。
# cp /usr/local/lib/security/pam_google_authenticator.so /usr/lib64/security
それ以外の作業は、sawasa氏のブログの作業の通りですが、概ね以下の順番で進めるといいかと思います。
・2要素認証の設定
ひとまず、公開鍵認証+パスワード認証が行えるようにします。
事前に公開鍵認証が行える状態にした上で、以下の設定を行います。
/etc/ssh/sshd_configに以下の修正を加えます。
変更
ChallengeResponseAuthentication no
↓
ChallengeResponseAuthentication yes
追加
AuthenticationMethods publickey,keyboard-interactive
修正したら、sshdを再起動します。
# systemctl restart sshd
sshで接続して、公開鍵認証を行った後、パスワード認証が追加で要求されることを確認します。
・Google Authenticator用のPAMの設定ファイルを新規作成
Google Authenticator用のPAMの設定ファイルを新規に作成します。設定ファイル/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
・sshd用のPAMの設定を変更
SSHサーバー用のPAMの設定を変更します。設定ファイル/etc/pam.d/sshdの内容を変更します。
substackコントロールは、前で作成した/etc/pam.d/google-authを取り込みます。パスワード認証は行わないので、password-authを取り込む行はコメントアウトしておきます。
修正
#%PAM-1.0
auth required pam_sepermit.so
#auth substack password-auth ←コメントアウト
auth substack google-auth ←新規追加
(略)
PAMの設定はsshdサービスの再起動などは不要です。
・認証したいユーザーに対するGoogle Authenticatorの設定
SSHサーバーへの接続認証を行いたいユーザーにGoogle Authenticatorの設定を行います。公開鍵認証も設定されている前提です。
google-authenticatorコマンドを実行します。色々と聞かれますが、とりあえず「y」で答えておきます。
また、実行直後に表示されるURLにアクセスして表示されるQRコードを、Google Authenticatorアプリに読み込ませて、OTPが生成できるように設定します。
・クライアントから2要素認証を試してみる
あとはsshコマンドでSSHサーバーに接続するだけです。公開鍵認証の後、OTPの入力が要求されるので、Google Authenticatorアプリに表示されるコードを入力して、ログインできることを確認してください。