sshの認証についてまとめ

sshバージョン
ssh -V
OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008

■基礎知識
opensslとopensshは違う
http://d.hatena.ne.jp/end0tknr/20130723/1374508157
opensshで使用される暗号化方式(arcfour等)はman ssh_configで確認する

(ケースによるだろうけど)sftpも結局はsshの認証を行って接続する。
なのでsshの接続が上手くいけばsftpの接続も基本上手くいく。

sshの設定ファイル
/etc/ssh/ssh_config
→クライアント側の設定

/etc/ssh/sshd_config
→サーバー側の設定

優先順位
~/.ssh/config
/etc/ssh/ssh_config

sshの認証には多数ある
publickey・・公開鍵認証
gssapi-keyex,gssapi-with-mic・・知らん(api使う認証ぽい)
keyboard-interactive・・キーボードインタラクティブ認証
password・・パスワード認証

※keyboard-interactiveとpasswordはほとんど違いはないらしい

sshの認証で困った時の観点
●エラーの出るサーバーだけでなく、成功するサーバー(検証サーバー)でも確認を行い、比較する

デバッグモードで接続する(vは3つまでつけられる)

ssh -v <ipアドレス>

※vオプションについてはssh接続の詳細が見れるので困ったときはマスト。

認証方法の指定

ssh -o PreferredAuthentications=<認証方法>

※認証方法には、keyboard-interactiveやpasswordを指定する

暗号化方式の指定

ssh -c <暗号化方式>

※暗号化方式には、aes128-ctrやarcfour256を指定する

debug考察1

debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,keyboard-interactive

上記の場合、順番は分からんけど、公開鍵、gssapi、キーボードの認証が試される
(例えばキーボード認証を最初に実行したい場合はssh_config(または~/.ssh/config)に
「PreferredAuthentications keyboard-interactive」を追加すればok)
上記の場合、パスワード認証は許可されていないので「PreferredAuthentications=password」を指定しても
debug1: No more authentication methods to try.
というエラーがでる。

debug考察2

debug1: kex: client->server aes128-ctr hmac-sha1 none

サーバーに接続する際に、どの暗号化方式を使っているか。
https://blog.n-z.jp/blog/2017-05-20-openssh-config.html

暗号化方式を限定したい場合は、~/.ssh/configにCiphersの行を追加する。MACsはmacの場合ぽい。

Ciphers aes128-ctr,aes192-ctr,aes256-ctr
MACs hmac-sha1,hmac-ripemd160,hmac-ripemd160@openssh.com

※あくまでクライアント側の設定なので変更してもsshdの再起動は不要

変更後、ssh -v を実行すれば暗号化方式が変わっていることを確認できる

https://blog.sa10shun.net/?p=77
sshd_configでCiphersを指定すれば無効化したい暗号化方式の指定が可能

debug考察3

Received disconnect from <ip>: 2: Too many authentication failures for root

今回長きに渡って苦しめられたエラー
これは「認証の試行回数が基準値を超えた」場合に出るエラーとなる

debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,keyboard-interactive
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
中略
debug1: Next authentication method: publickey
debug1: Trying private key: /root/.ssh/identity
debug1: Trying private key: /root/.ssh/id_rsa
debug1: read PEM private key done: type RSA
Received disconnect from <ip>: 2: Too many authentication failures for root

これは、gssapiに失敗してpublickeyにトライしようとしたけど、1回失敗したからエラーになったんだと思われる
(デフォルトはMaxAuthTries=6ぽいけど、これをMaxAuthTries=0にすると1回の失敗でエラーとなる)

これについては「PreferredAuthentications=keyboard-interactive」を指定すれば接続できる(最初からkeyboard-interactiveでトライする)
なお「PreferredAuthentications=password」としてもこのケースだとpassword認証が許可されていないので以下のエラーとなる

debug1: No more authentication methods to try.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,keyboard-interactive).

あと、winscpで接続しようとした際、バックグラウンドでpagentを起動していた時も同じエラーが発生。
これは認証キーが登録されているとその回数分接続を試みるため、結局MaxAuthTriesの値を超えることになりエラーが発生する
ので、pagentを止めればok

あと、パスワードで制限数よりも多く失敗した場合もこのエラーが出るぽい

認証方式をローテーションした時、公開鍵をローテーションしたとき、パスワードをローテーションした時、
とにかくいろんなパターンでこのエラーがでるぽくて今回こいつにめっちゃ苦しめられた

メモ
sshd_configでパスワード認証が禁止(PasswordAuthentication no)されていても、キーボード認証(ChallengeResponseAuthentication yes)
になっていれば、普通にコマンドラインからパスワード入力でログインできる
なのでパスワードでのログインを禁止したければ、上記いずれもnoにしないといけない。

その他の参考サイト
http://www.unixuser.org/~euske/doc/openssh/book/chap3.html
http://www.unixuser.org/~euske/doc/openssh/book/chap7.html
http://www.unixuser.org/~euske/doc/openssh/book/appendix.html