Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

ssh

sshでno hostkeys available @ Ubuntu 20.04 Server (Raspi)

ラズパイにUbuntu 20.04を入れて、いざssh接続しようとしたら接続できません・・・

/var/log/syslog を見ると、

sshd: no hostkeys available -- exiting

というログが出ており、どうやらSSHサーバのキーが生成されていないようです。最初はOSのインストールに失敗したのかな?と思ったりしましたが、2回目同じ症状だったので、ここに対処方法を残しておきます。

とはいえ、以下のコマンドでキーを生成するだけです。

# ssh-keygen -A

生成が完了したら、sshを起動してあげましょう。

# systemctl start ssh

sshログインしても何も操作をさせないぜ!

トンネリングを目的にsshを使う場合、ログイン後の操作を制限したい場合があります。これは、sshサーバ側のユーザのauthorized_keysに「command」という設定を書くことで実現できます。
※ authorized_keysを使うのでsshキーによるログインが前提の方法です。

具体的には、サーバ側の~/.ssh/authorized_keys に以下のように書かれているとします。

ssh-rsa AAAABYMfIAJF(ssh公開キー中略)0aAAn root@localhost

この行に以下のようにcommandという設定を先頭に書き足します。

command="echo 'locked'; tail -f /dev/null" ssh-rsa AAAABYMfIAJF (公開キー中略) 0aAAn root@localhost

この状態でsshログインすると、上記commandに指定されたコマンドが実行されるため、

locked

という文字が表示された後、"tail -f /dev/null" が実行され続けます。つまりユーザは何もできません。
※ tail -f /dev/null は、永遠に /dev/null から情報を読み続けるだけの意味のないコマンドで、別のコマンドでも構いません。

ssh接続が切れたときの対処方法を考える

sshの接続はサーバダウンやNW故障等、様々な理由で切断されます。端末の目の前にいるなら手動で再接続すれば良いのですが、いない場合はどんな方法で復旧できるかをまとめてみました。

autossh

まず1つ目は、autossh を使用する方法です。RHEL系ならepelのリポジトリを使ってyumやdnf, Debian系ならaptでインストールできます。使い方はsshとほぼ同じですが、-M というオプションが必要です。以下はsshserverというホストにuserというユーザ名でポート22に接続しています。-M オプションは接続監視のオプションです。0を指定すると監視オプションは無効化されます。
※ 無効化してもTCPのセッションが切れた場合は再接続してくれます

# autossh -M 0 -p 22 user@sshserver

-M に 9000 といったポート番号を指定すると、端末とsshserver間で定期的に指定したポートを使って実際に通信ができるか定期的にチェックしてくれます。これは、autosshの “-M” オプションの正体 という記事がわかりやすいです。上記記事によると端末側とサーバ側で9000ポート、さらに端末側で9001(9000+1)ポートが使われていない必要があるようです。

autossh -M 9000 -p 22 user@sshserver

なお、自動で再接続をするには、sshキーを登録しておいてパスワードなしでログインできるようにしておいたり、sshキー登録が無理なら、テキストファイルにサーバ名やID,パスワードを書いておいて再接続時に自動で入力するようなソフトもあるようです。

mosh

正確にはsshではないですが、mosh を使うと端末のIPが変わったり、NWが切断されてもセッションを保つことができます。サーバ側にmoshサーバ、クライアントにmoshクライントが必要ですし、プロトコルにUDPを使うので、制約のある環境では使いにくいです。

これもRHEL系ならEPELリポジトリを有効にしてyumやdnf、Debian系ならaptでインストールできます。

moshクライアントは、Windows上ならcygwin 向けのコマンドや、MobaXterm といったクライアントソフトを使えば接続できます。

その他

sshクライアントが切断されたら自動で再接続するようなスクリプトを書くこともできると思います。Linux系ならsystemd 等を使ってプロセス停止時に自動でsshコマンドを再起動する方法なども考えられます。puttyなら、この辺りの記事が参考になると思います。他にも、Bitviseといったsshクライアントはソフトウェアとして再接続機能が実装されているようです。

Windows10にssh-agentをインストール

WindowsのPowerShell向けのssh-agentをインストールしてみましたので、その時のメモです。2019/6月現在、最新版は v7.9.0.0p1-Beta が公開されているので、これを使います。

上記ページからOpenSSH-Win64.zipをダウロードし展開します。PowerShellのアイコンを右クリックし「その他→管理者として実行」で起動し、展開したフォルダに移動します。
※今回はc:\直下に展開したのでそこに移動しています。

PS C:\Windows\system32> cd C:\OpenSSH-Win64

デフォルトでは、Windowsサービスのインストーラ(PowerShellスクリプト)を実行する権限がないので、これを有効にします。
※ExecutionPolicyをRestrictedからRemoteSignedに変更します。

PS C:\OpenSSH-Win64> Get-ExecutionPolicy
Restricted

PS C:\OpenSSH-Win64> Set-ExecutionPolicy RemoteSigned
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): y
PS C:\OpenSSH-Win64> .\install-sshd.ps1
警告: 発行元 OpenSSH のリソースが見つからなかったか、EventLog サービス アカウント
(NT SERVICE\EventLog) にアクセスできません。
[SC] SetServiceObjectSecurity SUCCESS
[SC] ChangeServiceConfig2 SUCCESS
[SC] ChangeServiceConfig2 SUCCESS
sshd and ssh-agent services successfully installed

PS C:\OpenSSH-Win64> Get-ExecutionPolicy
RemoteSigned

インストーラを実行します。

PS C:\app\OpenSSH-Win64> .\install-sshd.ps1
警告: 発行元 OpenSSH のリソースが見つからなかったか、EventLog サービス アカウント
(NT SERVICE\EventLog) にアクセスできません。
[SC] SetServiceObjectSecurity SUCCESS
[SC] ChangeServiceConfig2 SUCCESS
[SC] ChangeServiceConfig2 SUCCESS
sshd and ssh-agent services successfully installed

必要に応じてssh-agentをサービスを起動します
※ Windowsサービスのため、対象フォルダ(C:\OpenSSH-Win64)が暗号化されていると起動できないので注意。

PS C:\OpenSSH-Win64> Set-Service ssh-agent -StartupType Automatic
PS C:\OpenSSH-Win64> Start-Service ssh-agent
PS C:\OpenSSH-Win64> Get-Service ssh-agent
Status Name DisplayName
------ ---- -----------
Running ssh-agent OpenSSH Authentication Agent

以上で完了です。必要に応じて変更したセキュリティ設定を元に戻します。

PS C:\OpenSSH-Win64> Set-ExecutionPolicy Restricted
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): y

参考
https://mimimopu.com/windows_powershell_ssh/
https://code.visualstudio.com/docs/remote/troubleshooting

各種リポジトリのssh鍵の変更

の議事を拝見して、使用している各種リポジトリのssh鍵をセキュリティの高いECDSAに変更しようとした結果。

Github → 記事の通りOK Bitbucket → NG Sourceforge → NG

まだまだ対応している所は少ないみたいですね。

sshの公開鍵・秘密鍵

公開鍵・秘密鍵をたまにしか作成しないのでメモ

# ssh-keygen -t dsa  ←DSAがもっとも強力な暗号らしい

 Generating public/private dsa key pair.

 Enter file in which to save the key (/home/mazn/.ssh/id_dsa):

 Enter passphrase (empty for no passphrase): パスワード入力

 Enter same passphrase again: パスワード入力

 Your identification has been saved in /home/mazn/.ssh/id_dsa.

 Your public key has been saved in /home/mazn/.ssh/id_dsa.pub.

 The key fingerprint is:

 65:86:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx mazn@localhost

これで.sshディレクトリにid_dsaとid_dsa.pubが生成されます。
pubが公開キーです。このキーのペアをリモートのサーバに転送し、リモートサーバ上で

# cat id_dsa.pub >> ~/.ssh/authorized_keys

で登録完了

このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ