OpenSSHによる二段階認証について

皆さん、こんにちはsowawaです。 このEngineering Blogはライブラリのリリースや機能追加の各種お知らせが中心ですが、今日は趣向を変えてOpenSSHによる二段階認証の導入方法について解説します。

PCI DSSという我々の準拠しているセキュリティ基準では、クレジットカード情報の取り扱いに関わるサーバ群へのリモートアクセスに二段階認証の組み込みを要求しているため、WebPayのプロダクション環境を始めとするサーバ群でも認証サーバで二段階認証を実施しています。

OpenSSHで二段階認証を実装する肝となるのは、OpenSSH6.2以降で追加されたMultifactorAuthenticationのためのAuthenticationMethodsというディレクティブです。

参考: http://lwn.net/Articles/544640/

images

それではさっそく二段階認証を導入してみましょう。

前提条件

  • OpenSSH6.2 以降
  • すでに公開鍵によってログイン出来る環境を構築済み(authorized_keysにrsaとかdsaとかecdsaの公開鍵を配置済み)

本記事の以降の内容は実際にCentOS 7上で行った際の情報です。他のディストリビューションでも同様の設定で動くことが予想されますが若干の違いがある可能性があります。

ステップ1 OpenSSHのバージョンを確認する

クライアントから実際にsshで接続して確認することができます。

1
$ ssh -vN 127.0.0.1 2>&1 | grep 'remote software version'

二段階認証を設定したいサーバのホスト名をここでは127.0.0.1としていますが、環境に合わせて書きなおしてください。サーバなんて使わないよっていう私みたいな猛者な人は127.0.0.1などのローカルホストに対してsshで接続して確認して下さい。

私の環境では以下の様な出力を得ることが出来ました。

1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.4

ここで5.xや6.1のようなAuthenticationMethodsが利用できない環境の方は、OpenSSHの6.2以降を自分でビルドするか、面倒ならCentOS 7やAmazon Linuxなどの比較的新しいディストリビューションがインストールされている環境で試してみてください。FedoraであればFedora19からOpenSSH6.2が導入されていると思います。Ubuntuであれば、Ubuntu14.04はOpenSSH6.6が導入されています。

ステップ2 /etc/ssh/sshd_configを編集する

次はいよいよsshd_configの編集です。リモートサーバに設定する場合は、対象のホストにログインしてください。編集には通常はroot権限が必要になりますのでsudosu -を行って編集してください。

以下のようにChallengeResponseAuthenticationnoからyesに変更します

1
2
- ChallengeResponseAuthentication no
+ ChallengeResponseAuthentication yes

以下の行をsshd_configの最終行に書き込んでください。

1
AuthenticationMethods publickey,keyboard-interactive

設定は以上の2つです。

この状態でsshdを再起動を行いますが、リモートサーバ等の場合には設定の間違いなどで起動することができなくなると一生ログインできない状態になってしまうので、以下のコマンドで設定のファイルの構文チェックを行いましょう。

1
$ sshd -t

まだ再起動しないでね。

繰り返しになりますがサーバにログインできない事態を回避するため再起動前の接続した利用中のSSHのコネクションは二段階認証で接続が確認できるまで残しておきましょう。

それでは再起動です

1
$ systemctl restart sshd.service

systemctlを使っていない場合は/etc/init.d/sshd restartservice sshd restartに読み替えてください。

ステップ3 動作確認

接続中のSSHコネクションを切断しないように、他のシェルかターミナルを開いてください。

SSHで接続すると以下のようなプロンプトが表示されるはずです。

1
2
3
$ ssh 127.0.0.1
Authenticated with partial success.
Password:

パスワードをいれてログインできれば完了です。

公開鍵認証に失敗した場合は以下の様に出力されます。

1
2
$ ssh 127.0.0.1
Permission denied (publickey).

authorized_keysに登録した公開鍵に対応した秘密鍵を使ってログインしてください。

あとがき

OpenSSHのAuthenticationMethodsを使って二段階認証を導入することができましたでしょうか?GoogleやGitHubのようなサービスでも二段階認証を選択できるほど身近になった二段階認証をリモートサーバへのログインでもぜひ使ってみてください。

WebPayでは上記で解説した二段階認証を応用してGoogle Authenticatorと組み合わせてワンタイムパスワードによる認証を行っています。 次回はGoogle Authenticatorと組み合わせた二段階認証についてご紹介したいと思います。

2014/09/10 続編記事を公開しました:OpenSSHによる二段階認証について ワンタイムパスワード編

ちなみに、OpenSSHに新しいAuthenticationMethodsディレクティブが追加される前はどうしていたかというと… 今回は説明が長くなるので省略しましたが実は私が確認している限りではCentOS 6系でも二段階認証を行うことができていました。 需要がありそうならまた別途どこかで解説するのでご要望ください。