これはマイネットエンターテイメント Advent Calendar 11日目の記事です。
自宅に外出先から繋がるSSHサーバがあると色々と便利ですよね。
ただ、サーバに限らず文字列を用いた認証は「パスワードを入力する」というリスクがありますので、
今回はGoogle Authenticatorを利用してOTP認証ができる環境を作ってみます。
そんなことより非接触式の生体認証の一般化はよ
必要なもの
- 公開鍵認証でログインできるSSHサーバ(今回はCentOS 7.2で)
- OTPトークン端末
- 要はスマホ、AndroidでもiOSでもOK
- Google Authenticator自体がOSSなのでGoogle純正ではないもののWin10Mobile版もある、らしい
サーバ側の作業
ビルドするために色々導入
yum -y groupinstall "Development Tools"
yum install pam-devel
GitHubからソースを持ってきてコンパイル&インストール
git clone https://github.com/google/google-authenticator-libpam.git
cd google-authenticator-libpam
./bootstrap.sh
./configure
sudo make && make install
sshdの設定を変更
sudo cp /usr/local/lib/security/pam_google_authenticator.so /usr/lib64/security/
/etc/ssh/sshd_config を編集
変更
ChallengeResponseAuthentication no → yes
追加
AuthenticationMethods publickey,keyboard-interactive
念のため設定ファイルが正しいかテストしておきます。
sshd -t
sshd再起動
systemctl restart sshd
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
/etc/pam.d/sshd を編集
追加
auth substack google-auth
コメントアウト
auth substack password-auth
OTPトークン端末側の作業
- iOS: https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8
- Android: https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja
上記アプリをインストールします。
Google Authenticatorと互換性を持つアプリであれば他でもOKです。
有名なトコだとIIJがIIJ SmartKeyというアプリを出していたり。
サーバ側で認証情報を登録・表示する
以下のコマンドをサーバで叩きます
google-authenticator
色々聞かれますがとりあえず「y」でOKです。
最後にQRコードが表示されます。
※↑は記事作成時に適当に作った認証情報です、スキャンするとOTPが生成できますが、そもそも認証するサーバが既に存在しないので使い道はありません。
スマホに登録する
Google公式なら右下の「+」から、他の互換アプリでも特に悩むことは無い位置に追加ボタンがあると思います。
カメラが起動するので、↑で表示されたQRコードを撮影しましょう。
1分ごとに更新される6桁の数字が今回作った環境のワンタイムパスワードになります。
サーバに接続しようとすると「Verification code」を聞かれるので、アプリ上で表示される数字を入力すれば認証成功するはずです。
今更な余談
sshdのバージョンは6.2から追加されたAuthenticationMethodsに対応している必要があります。
なので、CentOS6のデフォルト(5.3?)だと使うことができません。
…まぁ、sshdなんてセキュリティ関係の更新も度々出てますし、基本的には最新にしておくべきだと思うのですが。