・Mac(macOS Big Sur)
・Raspberry Pi 4 Model B(Raspberry Pi OS)
SSH
「SSH(Secure Shell)」という機能を利用することで、ネットワーク経由で別のPCに接続しリモートで操作をすることができます。通信は暗号化されるとともに、接続自体が適正なものなのかを確認するための認証方法も複数用意されています。
複数の認証方法のうち、ここでは代表的な「パスワード認証」と「公開鍵認証」の2つの使い方を説明します。
なお、前提として同一ネットワークに接続された(同じルーターに接続している)MacからRaspberry Piへのリモート接続を事例とします。
パスワード認証
パスワード認証では、MacからRaspberry PiにSSH接続を要求すると、指定したユーザーのパスワード入力が要求されます。Raspberry Piは指定されたユーザーのパスワードを認証し、正しい場合にSSH接続の承認をします。
パスワード認証によるSSH接続をするには、以下の要件を満たしている必要があります。
- Raspberry PiのSSHが有効になっている。
- Raspberry Piのホスト名(またはIPアドレス)が分かる。
- Raspberry PiのユーザーIDとパスワードが分かる。
これらは全て、事前にRaspberry Pi Imagerで設定が可能です。(「【Raspberry Pi】初期設定」の「Raspberry Pi OS起動イメージの書き込み」における、「Advanced options」の内容を参照してください。)
MacからRaspberry Piにリモート接続する際は、Macのターミナルで「ssh」コマンドを使用します。
ssh [ユーザーID]@[ホスト名またはIPアドレス]
# デフォルトのユーザーID「pi」、ホスト名「raspberrypi.local」の場合。
$ ssh pi@raspberrypi.local
# 「pi@raspberrypi.local's password: 」と表示されますので、パスワードを入力します。
# 接続が完了すると次のようにコマンドプロンプトが表示されます。
pi@raspberrypi:~ $
# SSH接続を終了する場合。
$ exit
# SSH接続を終了し、かつRaspberry Piをシャットダウンする場合。
$ sudo shutdown -h now
公開鍵認証
パスワード認証は手軽に接続できる反面、パスワードが破られるリスクが存在します。そこで、より安全性の高い公開鍵認証が用意されています。
公開鍵認証では、パスワード認証におけるパスワードの代わりに、「秘密鍵」と「公開鍵」を使用し、お互いの認証を行います。よって、
- Raspberry PiのSSHが有効になっている。
- Raspberry Piのホスト名(またはIPアドレス)が分かる。
の2点はパスワード認証と同様の要件になります。公開鍵認証では追加で次の作業が必要になります。
- Macで秘密鍵と公開鍵を生成する。
- 作成した公開鍵をRaspberry Piに移動する。(Raspberry Pi Imagerで設定可能。)
- Raspberry Pi側の公開鍵認証を有効にする。(Raspberry Pi Imagerで設定可能。)
秘密鍵と公開鍵の生成
Macのターミナルで「ssh-keygen」コマンドを使用することで、秘密鍵と公開鍵を作成することがきます。
$ ssh-keygen
Generating public/private rsa key pair.
# 鍵の保存場所を聞かれますが、通常デフォルトの場所に保存しますので、そのままリターンキーを押してください。
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa):
Created directory '/Users/ユーザー名/.ssh'.
# 次にパスフレーズの設定を求められます。任意ですので設定しない場合はそのままリターンキーを押してください。
Enter passphrase (empty for no passphrase):
# 再度、パスフレーズの入力が求められます。設定していない場合はそのままリターンキーを押してください。
Enter same passphrase again:
Your identification has been saved in /Users/ユーザー名/.ssh/id_rsa.
Your public key has been saved in /Users/ユーザー名/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ユーザー名@ホスト名
The key's randomart image is:
+---[RSA 3072]----+
| ..x =x+ |
|.. . + X x |
|x x . x B + |
| x x B + x |
|+ . = = S |
| + = . |
| ..E |
| x.x== . |
| .=x=Ox.=. |
+----[SHA256]-----+
デフォルトであれば「/Users/ユーザー名/」の中の「.ssh」フォルダ内に公開鍵(「id_rsa.pub」ファイル)と秘密鍵(「id_rsa」ファイル)が作成されます。
公開鍵の移動
Mac側で作成した公開鍵(id_rsa.pubファイル)をRaspberry Piに移動し、アクセス権限を変更します。
公開鍵の移動からアクセス権限の変更までは、事前にRaspberry Pi Imagerで設定が可能です。(「【Raspberry Pi】初期設定」の「Raspberry Pi OS起動イメージの書き込み」における、「Advanced options」の中で「Enable SSH」にチェックを入れ、「Allow public-key authentication only」を選択することで、事前に設定することができます。)
Raspberry Pi Imagerで設定する場合は、以下の作業は不要です。
移動の際は「/home/ユーザー名/」内に「.ssh」フォルダを作成し、その中に「id_rsa.pub」を「authorized_keys」にリネームして保存します。
また、「.ssh」フォルダのアクセス権限は「700(rwx --- ---。ユーザーのみ読み書き実行が可能。)」、「.ssh/authorized_keys」のアクセス権限は「600(rw- --- ---。ユーザーのみ読み書き可能。)」とします。
公開鍵認証の有効化
Raspberry Pi側のssh設定ファイルである「sshd_config」ファイルに変更を加え、公開鍵認証を有効化します。
公開鍵認証の有効化も、事前にRaspberry Pi Imagerで設定が可能です。(【Raspberry Pi】初期設定」の「Raspberry Pi OS起動イメージの書き込み」における、「Advanced options」の中で「Enable SSH」にチェックを入れ、「Allow public-key authentication only」を選択することで、事前に設定されます。)
Raspberry Pi Imagerで設定する場合は、以下の設定ファイル変更の作業は不要です。
変更の内容は、「#PubkeyAuthentication」と記載された行の下に「PubkeyAuthentication yes」と追記します。「#」の行はコメントとして扱われますので、元の行は削除せずそのまま残しておいて構いません。
また「#AuthorizedKeysFile」と記載された行の下に「AuthorizedKeysFile .ssh/authorized_keys」と追記します。
なお、「#」の行があらかじめ変更後の内容となっている場合は、追記する必要はありません。
MacからRaspberry Piにリモート接続する際は、Macのターミナルで「ssh」コマンドを使用します。
ssh -i [秘密鍵] [ユーザーID]@[ホスト名またはIPアドレス]
$ ssh -i .ssh/id_rsa pi@raspberrypi.local
# 初めて接続する場合は以下のメッセージが表示されますので、「yes」と入力します。
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
# 接続が完了すると次のようにコマンドプロンプトが表示されます。
pi@raspberrypi:~ $
# SSH接続を終了する場合。
$ exit
# SSH接続を終了し、かつRaspberry Piをシャットダウンする場合。
$ sudo shutdown -h now
セキュリティ向上のための設定
さらにセキュリティを向上させるため、最低限以下の設定はしておきましょう。いずれもRaspberry Pi側のssh設定ファイルである「sshd_config」ファイルで設定します。
設定ファイルを編集する際は、「nano」というテキストエディタを使用します(「nano」コマンドでテキスト内容を編集することができます。)。
また、「sshd_config」ファイルのような設定ファイルが編集できるのは、管理者権限を持ったユーザー(「ルート」や「スーパーユーザー」といいます。)に限られます。「pi」は一般ユーザーですので、管理者権限でコマンドを実行するにはコマンドの前に「sudo」コマンドを追加します。
# 「sshd_config」ファイルを管理者権限でテキストエディタnanoで開きます。
# 「sshd_config」ファイルは「/etc/ssh/」内にあります。
$ sudo nano /etc/ssh/sshd_config
# 編集が終了したら、「Ctrl」+「x」キーを押して変更内容を保存して終了します。
# 変更した内容を有効にするために、以下のコマンドでsshサーバーを再起動します。
$ sudo /etc/init.d/ssh restart
変更方法は「公開鍵認証の有効化」で説明した内容と同様です。「#」で始まる目的の行を探し、変更内容をその行の下に追記します。(実際は下の行でなくても大丈夫です。)
繰り返しになりますが、「#」の行はコメントとして扱われますので、その行は削除せずにそのまま残しておいて構いません。また、「#」の行があらかじめ変更後の内容となっている場合は、追記する必要はありません。
パスワード認証を無効にする
パスワード認証を無効化します。「#PasswordAuthentication yes」という行の下に、「PasswordAuthentication no」と追記します。
rootでのログインを禁止する
第三者にルートでログインされるのは非常に危険ですので、ルートでのログインを禁止します。「#PermitRootLogin」という行の下に、「PermitRootLogin no」と追記します。
ポート番号を変更する
「ポート番号」とは、通信をする際に使用するアプリケーションを指定する番号です。httpは80番、httpsは443番といった具合に決まっています。sshはデフォルトで22番に設定されています。
ポート番号を変更しておけば、変更後のポート番号を知らない第三者はssh接続をすることができなくなります。
ポート番号は0番から65535番まで存在しますが、以下の3種類に分類されます。
- 0番から1023番までは「WELL KNOWN PORT NUMBER」といって、使用目的が定められているポート番号です。
- 1024番から49151番までは「REGISTERED PORT NUMBER」といって、特定のアプリケーションの使用が予約されているポート番号です。
- 49152番から65535番までは「DYNAMIC AND/OR PRIVATE PORTS」といって、用途が決まっていない自由に扱えるポート番号です。
自由に扱える「DYNAMIC AND/OR PRIVATE PORTS」の範囲から任意のポート番号を選び、設定し直します。「#Port 22」という行の下に、「Port [ポート番号]」と追記します。
なお、ポート番号を変更しているため、ssh接続する場合は、以下のようにポート番号を追加で指定する必要があります。
ssh -i [秘密鍵] -p [ポート番号] [ユーザーID]@[ホスト名またはIPアドレス]