最近、様々なサービスでRFC 4226とRFC 6238で定義されているワンタイムパスワードが利用されるようになってきている。このワンタイムパスワードを、SSHでLinuxにログインする際に使えるということを知ったので、試したみた。対応しているOpenSSHは、6.2以降となる。
なお、今回は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の認証でワンタイムパスワードを使う(導入編)」