IMPOV::In My Point Of View

仕事、SEO、ウェブマーケティング、時事問題、健康、生き方などなど、書きたいことを勝手に書き倒しているブログです。とどのつまり「便所の落書き」

解決!MacBook で SSH と SFTP を公開鍵認証で接続しようとしてかなりハマった話とSSHログイン用のスクリプト

Mac初心者なもので何をやるにもイロイロとハマります。

今回は、SSHとSFTPでの公開鍵認証による接続でかなーり深い溝にハマりました。

公開鍵認証接続で以下のソフトを介して自分が管理しているサーバー(VPS)につなごうとしたところ、"Too many authentication failures"や"接続エラー"が出てうまく接続できない状態になってしまいました。

  • 対象ソフト
    • ターミナル (SSH接続)
    • FileZilla (SFTP接続)
    • Dreamweaver (SFTP接続)

同じサーバーに対して、複数アカウントでアクセスしようとする場合で、それぞれの鍵および鍵のパスフレーズをキーチェーンに登録すると、どうもうまく動かない様子です。

鍵の保存と権限(ターミナル SSH接続用の設定)

マックの事は良くわかっていませんが・・・、とりまLinuxベースなんで、ユーザーホームの直下に .ssh ディレクトリを作成して鍵を保存。

パスフレーズ付きの鍵の場合、一つのサーバーに対して一つの鍵までであれば問題なく動作するようなのですが、複数の鍵や複数ユーザーを使い分けたい場合は、競合してしまうのかうまく動きません。

そこで鍵をパスフレーズなしの鍵に変換し、~/.ssh/config を作成して、ユーザー名と鍵を一対の組み合わせに指定します。

SSHエージェントに登録された鍵情報を削除

いろいろと試行錯誤してきたせいで、一つのサーバーに対して複数の情報が登録されてしまっていると動かないので、キーチェーンに登録されたSSH鍵の情報を全削除してしまいます。

ssh-add -D

Too many authentication なんちゃらが出てつながらない場合は、とりあえず上のコマンドで以前にアクセスした際の設定を消してしまうことでつながるようになるようです。

キーチェーンにいろいろなサーバーの設定を記憶させてきた場合は、それらも消えてしまうので、むやみやたらにはしない方が良いとは思います。

ただ、今回は、パスフレーズを削除し、config ファイルを作ってそこに設定情報を納めるようにするので、割りきって設定をクリアしてしまいました。

パスフレーズの削除

以下のコマンドを実行しパスフレーズを入力してパス無し鍵を作成します。

openssl rsa -in ~/.ssh/hogehoge.id_rsa(パス有り鍵) -out ~/.ssh/fugafuga.id_rsa(パス無し鍵)

ファイルの権限は、chmod で念のため 400 にしておいたほうが良いと思います。

chmod 400 ~/.ssh/fugafuga.id_rsa

~/.ssh/config の作成

次にconfigファイルを作成

vim ~/.ssh/config

としてファイルを作成し、ターミナルでSSH接続に使用する鍵について設定を書き込みます。
なお、FileZillaやDreamweaverで使用する鍵は登録しません。

IdentitiesOnly yes

Host fuga
        HostName fuga.jp
        Port 54321
        User fuga
        IdentityFile ~/.ssh/fugafuga.id_rsa

Host foo
        HostName 123.123.123.123
        Port 55555
        User foo
        IdentityFile ~/.ssh/foo.id_rsa

 (以下、必要なぶんだけ繰り返し)

こうしておくことで、ターミナルで

ssh fuga

と打ち込むだけで、configに設定した内容でアクセスができるようになります。

IdentitiesOnly yes を一行加えることで、複数参照をしなくなるとのことです。

自動でrootに昇格するログイン用マクロ

ログイン後に自動でルートに昇格するスクリプトを作っておくと便利です。もっとも、セキュリティ的にもsudo使わずrootに昇格させちゃうことも、かなり問題有りなので、おすすめはいたしません。自分としては鍵のパスフレーズも外しちゃったことだし、とことん楽にしてみようという魂胆です。

#!/bin/sh

host='fuga'
rootpass='ルートアカウントのパスワード'

expect -c "
set timeout 10
spawn ssh ${host}
expect "~]$"
send \"su -\n\"
expect \"パスワード:\"
send \"${rootpass}\n\"
interact
"

expect の””内のテキストは、アクセスするサーバーの言語設定などにあわせて、適宜変更する必要があります。

Dreamweaver用の設定

DreamweaverでSFTPアクセスするための鍵も、前述の方法でパスフレーズを削除し、~/.ssh/ディレクトリに保存します。

DWのサーバー設定で、ユーザー名を入力、パスフレーズなしの鍵を選択、パスフレーズ欄は空欄のままで[パスフレーズを保存]するチェックボックスをチェックしておきます。

設定ミスなどで上手く繋がらなくなったら、ターミナルでキーチェーンの削除コマンドを打ち込んでしまえば、おそらくまた繋がるようになると思います。

ssh-add -D

Dreamweaverは、どうやらSSHエージェントに鍵の情報を登録しているようです。*1

FileZillaの設定

FileZillaは、設定から鍵ファイルを登録する際にパスフレーズを入力し、~~.ppkファイルを作成させられます。
このファイルも、~/.ssh/において、400にしておくと良いと思います。

終わりに

なんだかいっぱい書き込みましたが、要点のみ述べると以下のとおりとなるかと思います。

  • 鍵はパスフレーズを外す
  • ターミナルで使用するユーザー名と鍵は~/.ssh/configに設定する
  • ~/.ssh/configの一行目に IdentitiesOnly yes を入れておく*2
  • 上手く繋がらなくなったらキーチェーンを疑ってターミナルから、ssh-add -D を実行してみる*3

こんな感じでしょうか。

ようやくこれで、外出先からサーバー対応ができるようになりました。

*1:ここの部分は挙動からの仮説です。念のため。

*2:この設定無しでも自分の環境では上手く動いているので、コメントアウトしてしまっても良い気がします。

*3:SSHエージェントのキーチェーンが消えて困る場合はムヤミにしない方が良いと思います。