SSHログインで2段階認証

RHEL 6.3に搭載されているOpenSSHで利用可能になった、2段階認証の設定方法をまとめます。

#バージョン注意
* 古いOpenSSHのバージョンの設定になります
* OpenSSH-5.3p1で有効な**RequiredAuthentications2**を使っていますが、OpenSSH-6.2で**AuthenticationMethods**に置き換えられています。
* **AuthenticationMethods**を使った2段階認証は、~~検証に成功していないので、設定方法がわかりません。~~ __2014/09/15追記:__ Linuxサーバにインストールされたsshコマンドでは2段階認証できることを確認しています
* __2014/09/15追記:__ しかし、Tera Termでは**AuthenticationMethods**をつかった複数認証要求に対応していないため、ログインすることができません(http://sourceforge.jp/ticket/browse.php?group_id=1412&tid=31493) 
* __2015/02/13追記:__　OpenSSH［実践］入門でTera Termから**AuthenticationMethods**利用可能の記載あり(https://books.google.co.jp/books?id=iUcoBQAAQBAJ&pg=PA254&lpg=PA254&dq=teraterm+AuthenticationMethods&source=bl&ots=MO3qgxyOdB&sig=q0x3lSR7pDV03X83JwYT0jI_HoA&hl=ja&sa=X&ei=-lfdVOeIIsHlmAWxiICQCQ&ved=0CDgQ6AEwBA#v=onepage&q=teraterm%20AuthenticationMethods&f=false)要検証

#要件

* sshログイン時、公開鍵認証と、パスワード認証の両方を突破しないとログインできないようにすること

#設定
以下の設定ファイルを編集します

` /etc/ssh/sshd_config`


対象の設定は **RequiredAuthentications2** です。
[manページ](http://linux.die.net/man/5/sshd_config)
>**RequiredAuthentications[12]**
Specifies required methods of authentications that has to succeed before authorizing the connection. (RequiredAuthentication1 for Protocol version 1, and RequiredAuthentication2 for v2)

>RequiredAuthentications1 *method*[,*method*...]
>RequiredAuthentications2 *method*[,*method*...]

>*Example 1:*
>RequiredAuthentications2 password,hostbased
>*Example 2:*
>RequiredAuthentications2 publickey,password
>*Available methods:*
>password, keyboard-interactive, publickey, hostbased, gssapi-keyex, gssapi-with-mic

**RequiredAuthentications2**を有効化するためには以降の設定が必要となります

##チャレンジレスポンス認証の許可
[チャレンジレスポンス認証とは](http://e-words.jp/w/E38381E383A3E383ACE383B3E382B82FE383ACE382B9E3839DE383B3E382B9E8AA8DE8A8BC.html)

```vi:sshd_config
ChallengeResponseAuthentication yes
```
上記設定のみでは、チャレンジレスポンス認証を行うことはできませんでした。
おそらくですが、*/etc/login.conf*が存在しないためだと思います
>**ChallengeResponseAuthentication**
>Specifies whether challenge-response authentication is allowed (e.g. via PAM or though >authentication styles supported in login.conf(5)) The default is ''yes''.
 
チャレンジレスポンス認証はPAMを使うことで利用できるようになります

```vi:sshd_config
UsePAM yes
```

##パスワード認証の許可
2段階認証にパスワード認証を利用する場合は、以下の設定が必要です

```vi:sshd_config
PasswordAuthentication yes
```

##2段階認証設定
**RequiredAuthentications2** の設定をします
###鍵認証+パスワード認証

```vi:sshd_config
RequiredAuthentications2 publickey,password
```

###鍵認証+チャレンジレスポンス認証

```vi:sshd_config
RequiredAuthentications2 publickey,keyboard-interactive
```

##設定反映
`# /etc/init.d/sshd restart`
※設定に不備があるとログインできなくなります。最終的に動作確認がとれるまで、セッションを切らないように気を付けてください

#Tera Termでログインしてみる
##パスワード認証の場合
1. Tera Termを立ち上げ、接続先を入力し、「OK」押下
1. ユーザ名、鍵のパスフレーズ、鍵の指定をして「OK」押下
2. ウィンドウのタイトルが「SSH認証を再試行中」になる
3. 「プレインテキストを使う」を選択し、パスワードを入力「OK」押下
4. ログインできたことを確認する

##パスワード認証の場合
1. Tera Termを立ち上げ、接続先を入力し、「OK」押下
1. ユーザ名、鍵のパスフレーズ、鍵の指定をして「OK」押下
2. ウィンドウのタイトルが「SSH認証を再試行中」になる
3. パスワード認証の場合は、「プレインテキストを使う」を選択し、パスワードを入力「OK」押下
4. チャレンジレスポンス認証の場合は「チャレンジレスポンス認証を使う」にチェックを入れ「OK」押下
5. 「SSH認証チャレンジ」ウィンドウにパスワードを入力し「OK」押下
6. ログインできたことを確認する

#Tips
* 認証の順番までは制御することはできないので、先にパスワード認証してから鍵認証でログインすることもできる
* 全ユーザに2段階認証させたくない場合は、**Match**を使って対象だけ**RequiredAuthentications2**を設定できる
* ただし、以下の設定でためしてみたところ、パスワード認証を行うことができなかった

```vi:sshd_config
PasswordAuthentication no
Match User username
    PasswordAuthentication yes
    RequiredAuthentications2 publickey,password
```
全体ではパスワードログインを禁止して、特定ユーザだけ2段階認証したかったが、ログインできなかった

#イケてない部分
##問題点
2段階認証を実現させるだけであれば、上記設定で完了だが、以下の問題が発生してしまう

* 全ユーザ2段階認証にすると、リモートシェル実行が難しくなる
* 特定ユーザだけ2段階認証にすると、他のユーザのログインを鍵認証に絞れない。

##解決策

1. ログイン用sshdをつくる
操作ユーザログイン専用のsshdを、別IPか別ポートで起動させることで、設定ファイルを分離させる。
AllowUserとかでログインできるユーザをしぼったりするとよりセキュアかも
→作り方は後日まとめる
2. 2段階認証したくないユーザの設定を入れる
スクリプト実行ユーザの**Match**設定で認証方法を1つに絞る（未検証）

```vi:sshd_config
RequiredAuthentications2 publickey,password
Match User scriptuser
    RequiredAuthentications2 publickey
```
設定もれするユーザも出てくるかもしれないので、運用が大変かもしれない

#残課題
* WinSCPとかの挙動を検証。場合によってはsftpだけ回避とかしないといけないかもしれない
* TeraTarmマクロでログインできるか検証
* パスワードを設定していないユーザーでログインできないことを確認する

#参考

* [米Red Hat、仮想化や拡張性などを強化した「RHEL 6.3」をリリース](http://sourceforge.jp/magazine/12/06/22/000205)
* [CentOS 6.3で二段階認証のSSHサーバを試す](http://konishi.me/?p=175)
* [第5章 認証と相互運用性](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/6.3_Release_Notes/authentication_interoperability.html)
* [How can I enable both password and public key authentication with OpenSSH](http://serverfault.com/questions/193198/how-can-i-enable-both-password-and-public-key-authentication-with-openssh)
* [Different “RequiredAuthentications2” for sshd and sftp subsystem](http://serverfault.com/questions/594135/different-requiredauthentications2-for-sshd-and-sftp-subsystem)