SSHの接続は鍵認証にしてはいるんだが、さらにセキュアにしたくGoogle Authenticator をいれてみたログ

今回すること

  • サーバーへのSSHログイン時に認証鍵とスマフォアプリによるワンタイムパスワードにする

事前準備

  • クライアントの公開鍵を用意しておく
    • macの場合ターミナルから ssh_keygenでもしてid_rsa.pubをつくっておけばOK
  • スマフォにワンタイムパスワードを扱えるアプリをいれておく
    • iijのSmartKeyが複数サーバーやサービスを管理もしやすくおすすめ

設定

CentOS7にGoogle Authenticatorをインストール

※ SSHでサーバーに接続しrootになっている状態とする

  • pamをbuildできるようにpam-develをインストール
# yum install pam-devel  
  • Google AuthenticatorをGitHubからもってくる
# cd /usr/local/src
# git clone https://github.com/google/google-authenticator.git
  • GitHubからもってきたソースでコンパイルしてインストール
# cd google-authenticator/libpam
# ./bootstrap.sh
# ./configure
# make
# make install
  • /usr/local/lib/securityに配置されるので、/usr/lib64/security/にもシンボリックリンクをおいておく
# ln -s /usr/local/lib/security/pam_google_authenticator.so /usr/lib64/security/pam_google_authenticator.so

sshログインするユーザーに公開鍵を登録しておく

予め作成したログイン用の公開鍵(id_rsa.pub)をログインするユーザーに登録しておく

以下はmacのターミナルで鍵を作成して登録した手順。すでに鍵認証でログインできているなら省略してよし

mac> ssh-keygen 
なにやらでてくるけどすべてエンター
mac> scp ~/.ssh/id_rsa.pub LOGIN_USER@HOSTNAME:
mac> ssh LOGIN_USER@HOSTNAME;
server$ cat id_rsa.pub >> ~/.ssh/authorized_keys
server$ chmod 600 ~/.ssh/authorized_keys

sshdの設定を修正し認証キーとGoogleAuthenticatorで認証されるようにする

※ 再度サーバーにrootログインしているものとする

  • sshd_configの修正
# vi /etc/ssh/sshd_config
以下を追記
-----
Protocol 2 ← SSH2のみとする
PermitRootLogin no          # Rootログインを禁止
PubkeyAuthentication yes    # 公開鍵認証を許可
PasswordAuthentication no   # パスワード認証を禁止
ChallengeResponseAuthentication yes                  # チャレンジレスポンス認証(ワンタイムパスワードとか用)を許可
AuthenticationMethods publickey,keyboard-interactive # 2要素認証として認証キー、チャレンジレスポンスを利用する
----
  • Google Authenticator用のPAMファイルの作成
# vi /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ファイルの設定を変更してパスワードからGoogleAuthenticatorに切り替える
# vi /etc/pam.d/sshd
---
#%PAM-1.0
auth       required     pam_sepermit.so
#auth       substack     password-auth # コメントアウト
auth       substack     google-auth  # 追加
----
  • sshdのリスタート
# systemctl restart sshd

ログイン用ユーザーでGoogleAuthenticatorの設定

※SSHでサーバーにログインするユーザーに切り替えておく

$ google-authenticator

QRコードが表示されるので、SmartKey などの対応アプリでQRコードを撮影すれば登録ができる
他にもごちゃごちゃでてくるがyを押していけばOK

※ 最後に非常時用パスワード(6桁)が5つ表示されるのでこれはどこかにメモしておく。アプリが使えなくなった時などの緊急時に利用する。

ログインテスト

※ 新たにSSH接続を試す
※ テストする前にSSHを完全に切ってしまうと、上手くできていなかった場合、SSH接続が一切できなくなってしまうので注意

> ssh -i ~/.ssh/id_rsa LOGIN_USER@HOSTNAME
Verification code:

このVerification code:がでてきたら、アプリに表示されている6桁の数字を入力する。
ログインができたら成功。

感想

自分用のメモとして冗長にはなったが、これで2要素認証ができた。
今回は鍵認証とワンタイムパスワードでやっているが、パスワードとワンタイムパスワードなどの使い方もできる。
Amazon Linuxならyum だけでGoogle Autenticatorがいれられるし、2要素のログインは当たり前とおもったほうがいいんだろうな。