こんにちわ、cloudpack磯辺です。

最近、様々なサービスでRFC 4226RFC 6238で定義されているワンタイムパスワードが利用されるようになってきている。このワンタイムパスワードを、SSHでLinuxにログインする際に使えるということを知ったので、試したみた。対応しているOpenSSHは、6.2以降となる。

参考
OpenSSH 6.2 adds support for two-factor authentication

なお、今回はAmazon Linux 2014.03を対象とする。

Google Authenticatorをインストールする

Google Authenticatorは、PAMモジュールとして使えるものが提供されているので、そちらをインストールする。Amazon Linuxの場合は、なんとパッケージが用意されているので、yumで導入できる。

$ sudo yum -y install google-authenticator

sshdの設定を変更する

公開鍵認証に加えて、キーボード入力による認証を有効にする。

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

認証に問題があってログインできなくなると困るので、公開鍵認証のみでログインできるアカウントを作っておくと吉。たとえば、ec2-userの場合は下記のように設定する。

Match User ec2-user
   AuthenticationMethods publickey
   PubkeyAuthentication yes
   PasswordAuthentication no

設定に問題ないことを確認。

$ sudo sshd -t

何も出力されなければ問題ない。再起動する。

$ sudo /sbin/service sshd restart

PAMの設定を変更する

新しく、Google Authenticator用の設定ファイルを追加する。

$ sudo vim /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 password-authの部分をgoogle-authに置き換える。

#%PAM-1.0
auth       required     pam_sepermit.so
auth       substack     google-auth
account    required     pam_nologin.so
account    include      password-auth
password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    optional     pam_keyinit.so force revoke
session    include      password-auth

インストールは以上。

ワンタイムパスワードの設定

今回は、ec2-userとは別にローカルユーザを作成して、そのユーザで設定する。

まず、ユーザを作成して、公開鍵認証の準備をする。

# useradd authtest
# su - authtest
$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
...

作成したユーザで、Google Authenticatorコマンドを実行する。

$ google-authenticator

Do you want authentication tokens to be time-based (y/n) y
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/authtest@hostname%3Fsecret%3Dxxxxxxxxxxxxxxxx
Your new secret key is: xxxxxxxxxxxxxxxx
Your verification code is 604823
Your emergency scratch codes are:
  68011691
  65800690
  17733786
  49174305
  65882469

Do you want me to update your "/home/authtest/.google_authenticator" file (y/n) y

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) y

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y

ここで表示されるURLにアクセスすると、スマホに入れる方のGoogle Authenticatorで読み込める2次元コードが表示されるので、スキャンする。

ログインする

以上で設定が完了したので、ログインしてみる。

% ssh authtest@xx.xx.xxx.xxx
Authenticated with partial success.
Verification code:
Last login: Tue Sep 12 13:01:35 2014

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|___|___|

https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/
[authtest@ip-xx-x-xxx-xx ~]$

まず”Authenticated with partial success.”と出力され、公開鍵認証が成功したことが表示される。その後、”Verification code:”とプロンプトが表示されるので、スマホの方のGoogle Authenticatorに表示されるワンタイムパスワードを入力すると、ログインできる。

今回の手順は、OpenSSHによる二段階認証について ワンタイムパスワード編を参考にいたしました。感謝します。

元記事はこちらです。
[Linux] SSHの認証でワンタイムパスワードを使う(導入編)