はじめに


お詫び

皆様こんばんは. 昨日に引き続きnona2 です.

この記事はKMCアドベントカレンダー2013の16日目の記事の予定でした. 昨日の記事は僕の某プロジェクトでRaspberryPi で動かすソフト作ったのだけれど, クロスコンパイル環境用意しなかったから手元でコード書いて実機でコンパイルしてたのだけれど, 実機でコンパイルすると毎回コンパイル時間結構かかって辛かったよ……って話(だっけ……?) [sshfs について]でした.

今回の記事はnona11 の「iOS でのSSH」の予定でしたが、 彼との通信が途絶えて10秒が経過し、彼のホームディレクトリに残されていたのは上記の水平線より上の記述のみでした。

代わりにnona65537 による「SSH の二段階認証について」 の記事を公開いたします.

この記事は, KMCアドベントカレンダー2013のサブカレンダーであるSSHアドベントカレンダー2013の9日目の記事でもあります. 日頃SSHに親しんでいる部員による、SSHの基礎知識、ツール、Tips等を紹介して参りますので、初心者の方から上級者の方までご笑覧いただければ幸いです.

KMCアドベントカレンダー16日目, SSHアドベントカレンダー9日目の今回は, SSH の二段階認証について のお話をします.

はじめに

どうも, KMC一回生の nona65537 です. 最近は主にSSHアドベントカレンダーを書いて過ごしております. nona7 の節は大変申し訳ありませんでした. 今回もiOS でのSSH の話書くのやっぱキツイな, と思ったため突然のお話の変更です. 大変申し訳ありません. 今年のKMC アドベントカレンダーでのnona の担当はこれが最後ですのでどうかお許しください. お詫びの節の通り今回はSSH の二段階認証についてお話をさせていただきます.

What’s 二段階認証?

みなさん二段階認証は使ってますか? パスワードについて結構パラノイアである私はGoogle Authenticator に対応しているサービスではどんどん使っています.

二段階認証ってなんだ? って思った人も結構多いのかな? だいぶ最近メジャーになってきたとはいえまだまだ対応サイト少ないし…… 二段階認証が何か, 説明しようと思ったらここ に詳しく書いてあったけど, めげずに一応書いておきます.

あなたが何らかのサービスにログインしたいと思います. 普通はID とパスワードを入力してログインしますよね.

二段階認証に対応したサービスの場合, ID とパスワードの認証に成功したあとに, Verification code の入力が求められます. このVerification code は, SMS で送られてきたり, Google Authenticator 用のアプリで生成したりできます. iOS用 Android用 他にもいろいろあるらしいですね. Wikipedia

ID とパスワードが漏れることがあっても, 攻撃者がVerification code を手に入れることは簡単ではないので被害が出るのを(遅らせる|防ぐ) ことができます.

さぁ, いろんなサイトで二段階認証を有効にしたくなってきましたね? まずGoogle アカウント. Google アカウントが乗っ取られたらnona の半分が死ぬと言っても過言ではありません(もう半分はTwitter). いますぐさっきの をよく読んで二段階認証をしましょう. Dropbox やEvernote, Yahoo!JAPAN1 もGoogle Authenticator による二段階認証が可能となっております. 次々有効にしていきましょう.

何の話だっけ……?

そうそう, これはSSH アドベントカレンダーでした. はい, SSH の認証でも二段階認証ができるんです.

AUR からgoogle-authenticator-libpam-git を入れましょう. apt-get だとlibpam-google-authenticator ってのがあるらしいです.

設定失敗した時のためにSSH セッションを一つ残しておきましょう. 最悪そこから戻せるように.

/etc/pam.d/sshd を編集して,

auth            required        pam_google_authenticator.so
auth            required        pam_unix.so
auth            required        pam_env.so

を追記しましょう.

auth            sufficient      pam_google_authenticator.so
auth            sufficient      pam_unix.so
auth            required        pam_env.so

とするとパスワードかVerification code のどちらかでログインできるようになるらしいです.

そして, /etc/ssh/sshd_config に

 ChallengeResponseAuthentication yes

を追記した後,

# systemctl reload sshd

しましょう. Ubuntu とかdebian とかだと

# service sshd restart

だっけ.

これで二段階認証を使える環境は整いましたので, 有効にしていきましょう.

あなたのモバイル端末にGoogle Authenticator 用のアプリはインストールしましたか? 準備はそれだけです.

二段階認証を使いたいアカウントでgoogle-authenticatorを実行します. 以下のような出力になります.(Arch wikiからのコピペ)

$ google-authenticator
Do you want authentication tokens to be time-based (y/n) y
https://www.google.com/chart?chs=200x200&chld=M%7C0&cht=qr&chl=otpauth://totp/username@hostname%3Fsecret%3DZVZG5UZU4D7MY4DH
Your new secret key is: ZVZG5UZU4D7MY4DH
Your verification code is 269371
Your emergency scratch codes are:
70058954
97277505
99684896
56514332
82717798

Do you want me to update your "/home/username/.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) n

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

最初の質問にはy でいいでしょう. 次の行に出てくるhttps://www.google.com/chart?…… というアドレスですが, アプリで読み取るためのQRコードが出てくるはずですが400エラーでうまくいかなかったので手入力します.

Your new secret key is:

に続く文字列をあなたのアプリの入力を追加-> 手動で入力 を選んだ先の”キー” の欄に入力します. アカウント の欄にはわかりやすい説明を適当に書いておいてください.

Your emergency scratch codes are:

に続く5行は大切に(かつ安全に) 保管しておいてください. あなたのモバイル端末がなくなったなどの理由でコードが生成できない時に, 代わりにこれを入力するとログインができます.

残りの質問は適当に答えてください. y -> y -> n -> y がおすすめだとは思います.

emergency scratch codes を見逃したりしても ~/.google_authenticator の中に書いてあるのでそこを見て安全に保管してください. そこにあるから控えなくていいじゃんとか思わないでくださいね. あなたがログインできない時(つまりそのファイルを見れない時) に必要なコードなのですから.

さあこれで準備は完了です.

もう一個Terminal を開いて(くれぐれも今のセッションを切らないように– もし設定が間違ってたらSSH 引きこもりになっちゃうかもしれません)

 $ ssh username@hostname
 login as: username
 Verification code:

みたいな状態だったら多分成功です. あなたのアプリを見てコードを入力してください その後

password: 

のようにパスワードを求められると思います. 無事ログインできたら成功です. おめでとうございました.

参考

  1. Google Authenticator
  2. Google Authenticatorを用いた二要素認証をSSHに導入

おわりに

なんだか二段階認証の記事みたいになってしまいましたね. 私は基本的に公開鍵認証のみでログインできるようにすべきだとは思いますが, 何らかの事情でそれができない時はこれ使ったらいいかなー とか思いつつも, 自分でこれを入れられるような環境だったら公開鍵認証のみの設定にしてしまうので, 実験以外ではこれを使ったことが無いのですが面白いとは思うので紹介したいと思いました. ありがとうございました. 今日はnona65537 によるSSH の二段階認証について の話でした. 明日は, tyageさんによるChrome でのSSH について の記事です.

  1. Google Authenticator でバーコード読み取ってもダメで専用アプリをインストールするよう言われるが, 手動入力でトークンをちゃんと入れたら使えます. なんでわざわざアプリ分けてるんでしょうね…