見出し画像

SSH接続で拒否られた話 | Waiting for SSH to be available...

今回の記事は、Linux サーバーではおなじみの SSH 接続です。

私のように Windows をお使いの方の場合、Tera TermPuTTY などの SSH クライアントソフトを使われる場合が多いと思います。

ちなみに、最近は Windows でも簡単に、例えばコマンドプロンプトを使って SSH 接続ができるようになっています。

OpenSSH は、Linux と非 Windows の管理者が、リモート システムのクロスプラットフォーム管理を行うために使用するオープンソース バージョンの Secure Shell (SSH) ツールです。 2018 年の秋以降、Windows に OpenSSH が追加され、Windows 10 と Windows Server 2019 に含まれています。
公式ドキュメント:
Windows での OpenSSH

こちらの記事で・・・

ふだん使用している Surface Laptop ( Windows 10 Home ) から Docker-Machine ( AWS/Azure ) に SSH 接続しようとしたら、軽くハマったことがあったので書きたいと思います

ハマった・・・💦

Docker Machine の作成が進んでいかない
Waiting for machine to be running, this may take a few minutes... 
Detecting operating system of created instance... 
Waiting for SSH to be available... 👈この状態で先に進まない

そしてこのままそれなりに待った挙句、最終的に

Error creating machine: Error detecting OS: Too many retries waiting for SSH to be available.  Last error: Maximum number of retries (60) exceeded

・・・ orz

🔎調査

--debug オプションを使ってdocker-machine create
$ docker-machine --debug create <DockerMachine名> 👈ドライバーに合わせて詳細は調整
・・・
(中略)
・・・
(DockerMachine名) DBG | -----------------------------------------------------
(DockerMachine名) DBG | Creating New SSH Key
(DockerMachine名) DBG | creating key pair: <DockerMachine名>
・・・
(中略)
・・・

このような感じで、このオプションを使うことで、行っている内容の詳細が表示されながら作成が進んでいきます。

今回の件に関して怪しいところ

Using SSH client type: external
&{[-F /dev/null -o ConnectionAttempts=3 -o ConnectTimeout=10 -o ControlMaster=no -o ControlPath=none -o LogLevel=quiet -o PasswordAuthentication=no -o ServerAliveInterval=60 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@<パブリックIPアドレス> -o IdentitiesOnly=yes -i C:\Users\mevius\.docker\machine\machines\<DockerMachine名>\id_rsa -p 22] C:\WINDOWS\System32\OpenSSH\ssh.exe <nil>}
About to run SSH command:
exit 0
SSH cmd err, output: exit status 255:
Error getting ssh command 'exit 0' : ssh command error:
command : exit 0
err     : exit status 255

どうやら Dockerホストに対して SSH 接続を試みているが、うまくいっていないようです。

ちなみに

docker-machineコマンドは、SSH接続をして

(一部抜粋)
sudo apt-get update
sudo systemctl -f enable docker

のようなコマンドを Dockerホスト ( Ubuntu )上で実行して、環境を整えていきます。

なので、SSH接続できないとこの作業ができず構築が進まないのです。。

🎯あたりを付ける

自動的に作成される秘密鍵を使って、自ら Dockerホストに SSH接続を試みてみました。

SSHコマンドを実行
C:\Users\mevius>ssh -i C:\Users\mevius\.docker\machine\machines\<DockerMachine名>\id_rsa ubuntu@<パブリックIPアドレス>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\Users\\mevius\\.docker\\machine\\machines\\<DockerMachine名>\\id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\Users\\mevius\\.docker\\machine\\machines\\<DockerMachine名>\\id_rsa": bad permissions
ubuntu@<パブリックIPアドレス>: Permission denied (publickey).
やっぱりつなげない

しかし、どうやらパーミッションが関係しているようです。

また、

It is required that your private key files are NOT accessible by others.

と記載されているので、id_rsa ( 秘密鍵 ) のパーミッションが関係しそうです。

クラウドでサクッと実現する学習用使い捨てLinuxの話で紹介しましたが、『 C:\Users\mevius\.docker\machine\machines 』の直下に作成時に指定したDocker Machine 名のフォルダが作られ、その中に仮想マシンインスタンス(Dockerホスト)に公開鍵認証でSSH接続するキーペアが作成されます。

C:\Users\mevius の部分は『 %homepath% 』です。
エクスプローラのアドレスバーもしくはファイル名を指定して実行にて、%homepath% と打ち込むと表示されるフォルダです。

ここで、この id_rsa のファイルのプロパティ(セキュリティ)を確認してみると・・・

id_rsaのプロパティ

複数ユーザーがこのファイルに対してのアクセスが許可されていました。

なので

ユーザー名

自分だけに許可するように変更しました!

✨再挑戦

SSH コマンド

はい、問題なくできました😀

docker-machine create コマンド

はい、問題なくできました😀

ということで、解決です。

めでたしめでたし。

ちなみに

UNIX系OSの場合、

◆ chmod コマンド

を使ってパーミッションを変更します。

LinuC 挑戦日記 ~ 1.02.1_ファイルの所有者とパーミッション ~の記事で書きましたが、『 600( 所有者のみ読・書、可能)』に変更しましょう。

あと、今回のようにエラーではじかれてから毎回秘密鍵のパーミッションを変更するのは面倒くさいので、最初から machines フォルダのパーミッションを自分のみアクセス許可しておけば、その配下に作成されるファイル(id_rsa含めて)も同様のパーミッションになるので、もし同じエラーが出ている方がいらしたらこちらの方法がおススメです。

ということで、

公開鍵認証を使用して SSH接続する際には、
OS 問わずパーミッションに注意しましょう

というお話でした。

まぁ、おかげさまで docker-machineコマンドが裏側で何をやっているかも知れたわけですし、貴重なエラーでした。

最後までお読みいただきありがとうございました 😊

この記事が参加している募集

もしこの記事が何かの参考になったもしくは面白かったという方は、応援していただけると大変嬉しいです😊 これからもよろしくお願いします。