Raspberry Pi に鍵を使ってSSH通信

Raspberry PiのSSHを有効にした時は、ログイン方式はパスワードでのログインになりますが、SSH鍵を使ったログイン方式でさらにセキュリティを強化できます。 ここではSSH鍵を使う為の設定方法を記載しています。

Raspberry PiでSSH接続の有効化

Raspberry Pi側でSSH許可をしなければなりません。(*初期値は『SSH 無効』)
『設定』→『Raspberry Piの設定』→『SSH 有効』。

この状態では、パスワードでSSHログインできます。

Raspberry Pi でSSH鍵生成

TeraTermからパスワードでSSH接続している状態で以下実行します。(パスワードを使ったSSH接続方法はここを参考にしてください。

.sshディレクトリ作成

  1. /home/pi/.sshと作成 (~$ mkdir .ssh)
  2. .sshに権限を与える (~$ sudo chmod 700 .ssh)
  3. .sshに移動 (~$ cd .ssh)

SSH鍵生成

/home/pi/.ssh/で以下を実行する。*何故か、/home/pi/でssh-keygenを実行した時はSSH接続できなかったが、.sshで実行した時は接続できた。

$ cd ~/.ssh
$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/ichiri/.ssh/id_ed25519): id_ed25519_rpi
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_ed25519_rpi
Your public key has been saved in id_ed25519_rpi.pub
The key fingerprint is:
SHA256:/EW0RaJxTF4pu3JkcFSEdyqTMAmGshqn6xxxxxxxxxx4o ichiri@ichiri-H670
The key's randomart image is:
+--[ED25519 256]--+
|       .o..=*=*. |
|    . .   =*==o .|
|     o    .=+= o |
|  . o  .   .B .  |
|   =    S  o.+   |
|  o  .   ...o    |
| o..+     .o     |
|. +*.  .         |
|..oEooo          |
+----[SHA256]-----+

上記を実行すると、ファイル名を聞いてきたので、『id_ed25519_rpi』と入力してENTERを押すと、/home/pi/.ssh/ディレクトリに、id_rsaファイル(秘密鍵)とid_rsa.pubファイル(公開鍵)が生成された。 ファイルが生成される前に、パスコードも聞いてきたのでRaspberry Piのパスワードと同じ文字を入力した。 このパスコードがラズパイにSSH接続する時のパスフレーズの事。 それとは別にパスワードも聞かれるので気をつけないと。

  • パスワード=ログインパスワードの事。 SSHでログインする時、ログインユーザーパスワードを聞かれます。
  • パスフレーズ=鍵を暗号化する為のもの。 VScodeでSSH接続する際、こんな感じでパスフレーズを聞かれます。(最初は2回パスフレーズの入力が必要です。)

/home/pi/.ssh/id_ed25519_rpi   秘密鍵
/home/pi/.ssh/id_ed25519_rpi.pub 公開鍵

公開鍵を登録~権限付与

  1. ~/.ssh$ cat id_ed25519_rpi.pub >> authorized_keys これで公開鍵を登録。
  2. ~/.ssh$ sudo chmod 600 authorized_keys      アクセス権限を与えておく。 644とかにすると、SSHサーバー側で『Permissions 0644 for ‘/home/pi/.ssh/authorized_key’ are too open.』のエラーで通信できません。
  3. /etc/ssh/sshd_configファイルの以下部分をコメントアウトする。
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

秘密鍵をWindowsパソコンに転送

TeraTermのSSH SCPで転送するがファイルが/home/pi/の下に無いと転送できないみたいです。 /.sshの下で何をしても、no such file or directory foundエラーでSSH SCPで転送できませんでした。

  1. ~/.ssh$ mv id_rsa ../  で秘密鍵を /home/pi/に移動
  2. TeraTermの『ファイル(F)』→『SSH SCP…』を選択
  3. 下の『Receive』で、『From』に『id_ed25519_rpi』を入れ、『To』に転送先を選択して『Receive』で転送
  1. 転送後にid_rsaを/home/pi/.ssh/に戻す。 ~pi$ mv id_rsa ./.ssh
  2. TeraTermを切断(~$ exit かFile(F)から切断)

TeraTermで秘密鍵を使って接続

TeraTermで接続し、以下の画面が出てきたら、『RSA/DSA/ECDSA/ED25519鍵を使う』を選び、保存したid_ed25519_rpi(下の図では『id_rsa』)ファイルを選択して『OK』をクリック。

この場合、パスフレーズにはSSH鍵を生成した際のパスコードを入れる。

Raspberry PiでパスワードでのSSH接続を無効にする

上記コマンドで、『PasswordAuthentication』をコメントアウトして、『no』にして、Raspberry Piを再起動する。*viコマンドでの編集より、nanoでの編集の方がめっちゃ簡単です。 参考。

# PasswordAuthentication yes  #変更前です
PasswordAuthentication no

*これをすると、rootでのSSH接続はパスワード接続だったので、rootでのSSH接続は出来なくなります。 rootでもSSH接続するには/root/.ssh・ディレクトリを作り、/home/pi/.ssh/ディレクトリにあるid_rsaファイルとauthorized_keysファイルを/root/.ssh/ディレクトリにコピーするとrootでもSSH接続できるようになります。(セキュリティ上おすすめしませんが)

**セキュリティ上、/etc/ssh/ssh/sshd_configファイルの以下の部分を変更して、rootのSSH接続を禁止するのが良いと思います。 再起動が必要です。

# PermitRootLogin yes  #変更前です
PermitRootLogin no

*** rootのSSH接続を禁止しても、piでSSH接続して、su rootでrootにログインできます。

WindowsやLinuxの~/.ssh/configに設定して楽々SSH

『~』とはLinuxでホームディレクトリのことで、ラズパイなら『/home/ppi』と同じです。 Windowsには『~』は無いので、『c:/ユーザー/あなたのユーザー名』と読み換えてください。

/.ssh/configファイル場所

上記の設定が終わったら、sshのconfigファイルにssh接続の記述してみましょう。 Windows10の場合、以下のフォルダにconfigファイルを入れます。(拡張子は無し。) .sshフォルダがなければ、コマンドプロンプトから.sshフォルダを作るか、エクスプローラーの場合『.ssh.』と前後にドットを入れるとドットから始まるフォルダを作れます。

// Windows
c:/ユーザー/あなたのユーザー名/.ssh/config

// Linux
~/.ssh/config

~/.ssh/configファイル記述

configファイルに書き込むのは踏み台サーバとターゲットの外部サーバーの2つのホスト。 Hostの後ろのbastionやxserverはsshコマンドで呼び出す名前です。

#踏み台サーバーとなるラズパイ
Host bastion
     HostName 192.168.1.5
     User pi
     Port 22
     #WindowやLinuxに保存したラズパイの秘密鍵のパス
     IdentityFile ~/Documents/IoT/Raspi/id_ed25519_rpi

#踏み台サーバーから接続する外部サーバー(エックスサーバー)
Host xserver
     HostName sv1_ _ _ _.xserver.jp
     User xs4_ _ _ _ _
     Port 10022
     #Window10に保存したxserverの秘密鍵のパス。 バックスラッシュでもスラッシュでもいいみたいです。
     IdentityFile ~\Documents\IoT\Xserver\xs4_ _ _ _ _.key
     ProxyCommand ssh -W %h:%p bastion

パラメータ説明
Host適当なSSH接続名。
プロンプトから『ssh SSH接続名』で接続する時に使用する
HostNameホスト名
接続したいSSHサーバーのサーバ番号とドメインかIPアドレス
Port接続したいSSHサーバーのポート番号
通常ポート番号は22
22は攻撃されやすいので、エックスサーバのようにポート番号を変えているサーバーもある。
エックスサーバーは10022
UserSSH接続のユーザー名
ラズパイ(Raspbian)の場合はpi。(初期値)
エックスサーバーではサーバー番号と言っています。
IdentityFile鍵認証する秘密鍵ファイルのパス。
ファイル名も記述する。

コマンドプロンプトから ssh ホスト名で楽々接続

上を設定したら、Windows10のコマンドプロンプト(cmd)からssh xserverと入れると、ラズパイのSSH鍵を生成した時のパスフレーズ(=パスコード)を聞いてきます。 次にエックスサーバーのパスフレーズを聞いてきます。 この2つを入れたらもう繋がりました。 これだけで楽々です。

Windows10のバージョン20H1ではProxyCommand の次にsshコマンドで動作していますが、Windows10の違うバージョンでは、sshでは動作せず C:\Windows\System32\OpenSSH\ssh.exe としないといけない場合があるようです。

おまけ1:パスワードだけでRaspberry PiにSSH接続

ラズパイはSSH有効化した時は、ログインパスワード(パスコードではありません)でSSH接続できるようになっています。

Raspberry PiにパスワードでSSH接続

ホストのアドレスを入力してOKを押す。
*ポート#は22のまま。

次にユーザー名とパスフレーズ(この場合はパスワード)を入れてOKを押す。
*ユーザー名:pi(初期値)
パスフレーズ:piのログインパスワード

この様につながります。
rootでも同じようにつながります。
終了時は、『exit』で抜ける。

おまけ:REMOTE HOST IDENTIFICATION HAS CHANGED!

相手のrootパスワードを変更したらアクセス出来なくなりました。 下のメッセージの通り、~/.ssh/known_hostsに新しいfinger print書き込まないといけないので、古いfinger printをssh-keygenでまず消します。

uBuntu$ ssh root@192.168.27.2@@@@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone could be eavesdropping on you right now (man-in-the-middle attack)!It is also possible that a host key has just been changed.The fingerprint for the RSA key sent by the remote host isSHA256:e3gkMDpJJ87BoGwKEKvWW6MGXz17ExtPkOw96oZRmLw.Please contact your system administrator.Add correct host key in /home/ichiri/.ssh/known_hosts to get rid of this message.Offending RSA key in /home/ichiri/.ssh/known_hosts:2 remove with: ssh-keygen -f "/home/ichiri/.ssh/known_hosts" -R "[192.168.27.2]"RSA host key for [192.168.27.2] has changed and you have requested strict checking.Host key verification failed.$ ssh-keygen -f "/home/ichiri/.ssh/known_hosts" -R "192.168.27.2"

なので素直にそうすると、再度sshできるようになります。

$ ssh-keygen -f "/home/ichiri/.ssh/known_hosts" -R "192.168.27.2"

コメント