Raspberry PiのSSHを有効にした時は、ログイン方式はパスワードでのログインになりますが、SSH鍵を使ったログイン方式でさらにセキュリティを強化できます。 ここではSSH鍵を使う為の設定方法を記載しています。
Raspberry PiでSSH接続の有効化
Raspberry Pi側でSSH許可をしなければなりません。(*初期値は『SSH 無効』)
『設定』→『Raspberry Piの設定』→『SSH 有効』。
この状態では、パスワードでSSHログインできます。
Raspberry Pi でSSH鍵生成
TeraTermからパスワードでSSH接続している状態で以下実行します。(パスワードを使ったSSH接続方法はここを参考にしてください。)
.sshディレクトリ作成
- /home/pi/.sshと作成 (~$ mkdir .ssh)
- .sshに権限を与える (~$ sudo chmod 700 .ssh)
- .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 公開鍵
公開鍵を登録~権限付与
- ~/.ssh$ cat id_ed25519_rpi.pub >> authorized_keys これで公開鍵を登録。
- ~/.ssh$ sudo chmod 600 authorized_keys アクセス権限を与えておく。 644とかにすると、SSHサーバー側で『Permissions 0644 for ‘/home/pi/.ssh/authorized_key’ are too open.』のエラーで通信できません。
- /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で転送できませんでした。
- ~/.ssh$ mv id_rsa ../ で秘密鍵を /home/pi/に移動
- TeraTermの『ファイル(F)』→『SSH SCP…』を選択
- 下の『Receive』で、『From』に『id_ed25519_rpi』を入れ、『To』に転送先を選択して『Receive』で転送
- 転送後にid_rsaを/home/pi/.ssh/に戻す。 ~pi$ mv id_rsa ./.ssh
- 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 |
User | SSH接続のユーザー名 ラズパイ(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"
コメント